[electric] 05/11: New upstream version 9.07
Markus Koschany
apo-guest at moszumanska.debian.org
Mon Nov 28 00:01:35 UTC 2016
This is an automated email from the git hooks/post-receive script.
apo-guest pushed a commit to branch master
in repository electric.
commit 2e78c30e7d1901933f49aafb1dba8e9b663c7f00
Author: Markus Koschany <apo at debian.org>
Date: Mon Nov 28 00:14:40 2016 +0100
New upstream version 9.07
---
ChangeLog.txt | 273 +-
README.txt | 5 +-
build.xml | 2 +-
com/sun/electric/Launcher.java | 2 +-
com/sun/electric/Main.java | 52 +-
com/sun/electric/StartupPrefs.java | 2 +-
com/sun/electric/api/irsim/IAnalyzer.java | 2 +-
com/sun/electric/api/minarea/ErrorLogger.java | 2 +-
com/sun/electric/api/minarea/LayoutCell.java | 2 +-
com/sun/electric/api/minarea/LayoutCellLoader.java | 2 +-
.../electric/api/minarea/ManhattanOrientation.java | 2 +-
com/sun/electric/api/minarea/MinAreaChecker.java | 2 +-
.../minarea/errorLogging/AbstractErrorLogger.java | 2 +-
.../minarea/errorLogging/ErrorLoggerCSVFile.java | 2 +-
.../minarea/errorLogging/ErrorLoggerFactory.java | 2 +-
.../errorLogging/ErrorRepositoryLogger.java | 2 +-
.../errorLogging/ErrorToElectricReporter.java | 2 +-
.../api/minarea/errorLogging/io/CSVFile.java | 2 +-
.../api/minarea/errorLogging/io/CSVInput.java | 2 +-
.../api/minarea/errorLogging/io/CSVWriter.java | 2 +-
com/sun/electric/api/minarea/geometry/Edge.java | 2 +-
com/sun/electric/api/minarea/geometry/Point.java | 2 +-
com/sun/electric/api/minarea/geometry/Polygon.java | 2 +-
com/sun/electric/api/minarea/geometry/Shapes.java | 2 +-
.../api/minarea/launcher/DefaultLayoutCell.java | 2 +-
.../electric/api/minarea/launcher/ElapseTimer.java | 2 +-
.../electric/api/minarea/launcher/Launcher.java | 2 +-
com/sun/electric/api/movie/MovieCreator.java | 2 +-
com/sun/electric/database/AnalyzeHeap.java | 4 +-
com/sun/electric/database/CellBackup.java | 4 +-
com/sun/electric/database/CellRevision.java | 4 +-
com/sun/electric/database/CellRevisionConn.java | 4 +-
com/sun/electric/database/CellRevisionConn0.java | 4 +-
com/sun/electric/database/CellRevisionJ.java | 4 +-
.../electric/database/CellRevisionProvider.java | 4 +-
.../database/CellRevisionProviderDefault.java | 6 +-
com/sun/electric/database/CellTree.java | 4 +-
com/sun/electric/database/CellUsageInfo.java | 4 +-
com/sun/electric/database/DumpHeap.java | 4 +-
com/sun/electric/database/EObjectInputStream.java | 4 +-
com/sun/electric/database/EObjectOutputStream.java | 4 +-
com/sun/electric/database/EditingPreferences.java | 4 +-
com/sun/electric/database/Environment.java | 4 +-
com/sun/electric/database/EquivPorts.java | 4 +-
.../database/EquivalentSchematicExports.java | 4 +-
com/sun/electric/database/IdMapper.java | 4 +-
com/sun/electric/database/ImmutableArcInst.java | 4 +-
com/sun/electric/database/ImmutableCell.java | 4 +-
.../electric/database/ImmutableElectricObject.java | 4 +-
com/sun/electric/database/ImmutableExport.java | 4 +-
com/sun/electric/database/ImmutableIconInst.java | 4 +-
.../ImmutableLayoutHierarchyEnumerator.java | 2 +-
com/sun/electric/database/ImmutableLibrary.java | 4 +-
com/sun/electric/database/ImmutableNet.java | 4 +-
com/sun/electric/database/ImmutableNetLayout.java | 4 +-
com/sun/electric/database/ImmutableNetSchem.java | 4 +-
com/sun/electric/database/ImmutableNodeInst.java | 4 +-
com/sun/electric/database/ImmutablePortInst.java | 4 +-
com/sun/electric/database/LibraryBackup.java | 4 +-
com/sun/electric/database/Snapshot.java | 4 +-
com/sun/electric/database/SnapshotAnalyze.java | 2 +-
com/sun/electric/database/UsageCollector.java | 4 +-
com/sun/electric/database/change/Changes.java | 2 +-
.../database/change/DatabaseChangeEvent.java | 2 +-
.../database/change/DatabaseChangeListener.java | 2 +-
com/sun/electric/database/change/Undo.java | 2 +-
.../electric/database/constraint/Constraints.java | 2 +-
com/sun/electric/database/constraint/Layout.java | 2 +-
.../electric/database/constraint/LayoutCell.java | 2 +-
com/sun/electric/database/geometry/EGraphics.java | 4 +-
com/sun/electric/database/geometry/EPoint.java | 4 +-
com/sun/electric/database/geometry/ERectangle.java | 4 +-
.../database/geometry/GeometryHandler.java | 4 +-
.../electric/database/geometry/ObjectQTree.java | 2 +-
com/sun/electric/database/geometry/Poly.java | 2 +-
com/sun/electric/database/geometry/Poly3D.java | 2 +-
com/sun/electric/database/geometry/PolyBase.java | 6 +-
com/sun/electric/database/geometry/PolyMerge.java | 2 +-
.../electric/database/geometry/PolyNodeMerge.java | 2 +-
com/sun/electric/database/geometry/PolyQTree.java | 4 +-
.../electric/database/geometry/PolySweepMerge.java | 6 +-
.../electric/database/geometry/ScreenPoint.java | 2 +-
.../database/geometry/bool/DeltaMerge.java | 4 +-
.../database/geometry/bool/LayoutMerger.java | 4 +-
.../geometry/bool/LayoutMergerDefaultImpl.java | 4 +-
.../geometry/bool/LayoutMergerFactory.java | 4 +-
.../geometry/bool/LayoutMergerHierImpl.java | 4 +-
com/sun/electric/database/geometry/bool/Main.java | 4 +-
.../database/geometry/bool/PointsSorter.java | 4 +-
.../database/geometry/bool/UnloadPolys.java | 4 +-
.../database/geometry/bool/VectorCache.java | 4 +-
.../electric/database/geometry/btree/BTree.java | 2 +-
.../database/geometry/btree/BTreeTest.java | 2 +-
.../geometry/btree/CachingPageStorage.java | 2 +-
.../geometry/btree/CachingPageStorageWrapper.java | 2 +-
.../geometry/btree/EquivalenceClasses.java | 4 +-
.../database/geometry/btree/FilePageStorage.java | 2 +-
.../geometry/btree/InteriorNodeCursor.java | 2 +-
.../database/geometry/btree/LeafNodeCursor.java | 2 +-
.../database/geometry/btree/MemoryPageStorage.java | 2 +-
.../database/geometry/btree/NodeCursor.java | 2 +-
.../geometry/btree/OverflowPageStorage.java | 2 +-
.../database/geometry/btree/PageStorage.java | 2 +-
.../btree/PageStorageWithDeallocation.java | 2 +-
.../database/geometry/btree/RadixTrie.java | 4 +-
.../unboxed/AssociativeCommutativeOperation.java | 2 +-
.../btree/unboxed/AssociativeOperation.java | 2 +-
.../btree/unboxed/InvertibleOperation.java | 2 +-
.../geometry/btree/unboxed/LatticeOperation.java | 2 +-
.../geometry/btree/unboxed/MinMaxOperation.java | 2 +-
.../database/geometry/btree/unboxed/Pair.java | 2 +-
.../database/geometry/btree/unboxed/Unboxed.java | 2 +-
.../geometry/btree/unboxed/UnboxedByte.java | 2 +-
.../geometry/btree/unboxed/UnboxedComparable.java | 2 +-
.../geometry/btree/unboxed/UnboxedDouble.java | 2 +-
.../geometry/btree/unboxed/UnboxedFloat.java | 2 +-
.../geometry/btree/unboxed/UnboxedFunction.java | 2 +-
.../geometry/btree/unboxed/UnboxedHalfDouble.java | 2 +-
.../geometry/btree/unboxed/UnboxedInt.java | 2 +-
.../btree/unboxed/UnboxedMinMaxHalfDouble.java | 2 +-
.../geometry/btree/unboxed/UnboxedPair.java | 2 +-
.../electric/database/hierarchy/BatchChanges.java | 24 +-
com/sun/electric/database/hierarchy/Cell.java | 7 +-
com/sun/electric/database/hierarchy/EDatabase.java | 6 +-
com/sun/electric/database/hierarchy/Export.java | 2 +-
.../database/hierarchy/HierarchyEnumerator.java | 2 +-
com/sun/electric/database/hierarchy/Library.java | 2 +-
com/sun/electric/database/hierarchy/Nodable.java | 4 +-
.../database/hierarchy/ReplaceBuilder.java | 4 +-
com/sun/electric/database/hierarchy/View.java | 2 +-
com/sun/electric/database/id/ArcProtoId.java | 4 +-
com/sun/electric/database/id/CellId.java | 4 +-
com/sun/electric/database/id/CellUsage.java | 4 +-
com/sun/electric/database/id/ExportId.java | 4 +-
com/sun/electric/database/id/IdManager.java | 4 +-
com/sun/electric/database/id/IdReader.java | 4 +-
com/sun/electric/database/id/IdWriter.java | 4 +-
com/sun/electric/database/id/LayerId.java | 4 +-
com/sun/electric/database/id/LibId.java | 4 +-
com/sun/electric/database/id/NodeProtoId.java | 4 +-
com/sun/electric/database/id/PortProtoId.java | 4 +-
com/sun/electric/database/id/PrimitiveNodeId.java | 4 +-
com/sun/electric/database/id/PrimitivePortId.java | 4 +-
com/sun/electric/database/id/TechId.java | 4 +-
com/sun/electric/database/network/Global.java | 4 +-
com/sun/electric/database/network/NetCell.java | 4 +-
com/sun/electric/database/network/NetSchem.java | 4 +-
com/sun/electric/database/network/Netlist.java | 16 +-
com/sun/electric/database/network/NetlistImpl.java | 4 +-
.../electric/database/network/NetlistShorted.java | 4 +-
com/sun/electric/database/network/Network.java | 4 +-
.../electric/database/network/NetworkManager.java | 4 +-
com/sun/electric/database/network/NetworkTool.java | 4 +-
com/sun/electric/database/prototype/NodeProto.java | 2 +-
.../database/prototype/PortCharacteristic.java | 2 +-
.../electric/database/prototype/PortOriginal.java | 2 +-
com/sun/electric/database/prototype/PortProto.java | 2 +-
com/sun/electric/database/text/CellName.java | 2 +-
com/sun/electric/database/text/EFormatter.java | 4 +-
.../database/text/EmptyPreferencesFactory.java | 2 +-
com/sun/electric/database/text/Name.java | 4 +-
com/sun/electric/database/text/NameImpl.java | 4 +-
com/sun/electric/database/text/Pref.java | 2 +-
com/sun/electric/database/text/PrefPackage.java | 4 +-
com/sun/electric/database/text/Setting.java | 2 +-
com/sun/electric/database/text/TempPref.java | 2 +-
com/sun/electric/database/text/TextUtils.java | 2 +-
com/sun/electric/database/text/Version.java | 19 +-
com/sun/electric/database/topology/ArcInst.java | 2 +-
com/sun/electric/database/topology/Connection.java | 2 +-
com/sun/electric/database/topology/Geometric.java | 2 +-
.../electric/database/topology/HeadConnection.java | 2 +-
.../electric/database/topology/IconNodeInst.java | 2 +-
com/sun/electric/database/topology/NodeInst.java | 4 +-
com/sun/electric/database/topology/PortInst.java | 2 +-
com/sun/electric/database/topology/RTBounds.java | 2 +-
com/sun/electric/database/topology/RTNode.java | 2 +-
.../electric/database/topology/SteinerTree.java | 41 +-
.../electric/database/topology/TailConnection.java | 2 +-
com/sun/electric/database/topology/Topology.java | 4 +-
.../database/variable/AbstractTextDescriptor.java | 2 +-
.../electric/database/variable/CodeExpression.java | 4 +-
.../electric/database/variable/DisplayedText.java | 2 +-
.../electric/database/variable/EditWindow0.java | 2 +-
.../electric/database/variable/EditWindow_.java | 2 +-
.../electric/database/variable/ElectricObject.java | 2 +-
.../database/variable/MutableTextDescriptor.java | 2 +-
.../electric/database/variable/TextDescriptor.java | 2 +-
.../electric/database/variable/UserInterface.java | 2 +-
com/sun/electric/database/variable/VarContext.java | 2 +-
com/sun/electric/database/variable/Variable.java | 5 +-
com/sun/electric/lib/LibFile.java | 2 +-
com/sun/electric/plugins/j3d/J3DKeyBehavior.java | 4 +-
com/sun/electric/plugins/j3d/J3DKeyCollision.java | 4 +-
com/sun/electric/plugins/j3d/JMouseRotate.java | 4 +-
com/sun/electric/plugins/j3d/JMouseTranslate.java | 4 +-
com/sun/electric/plugins/j3d/JMouseZoom.java | 4 +-
com/sun/electric/plugins/j3d/View3DWindow.java | 4 +-
com/sun/electric/plugins/j3d/ui/J3DDemoDialog.java | 2 +-
com/sun/electric/plugins/j3d/ui/J3DMenu.java | 2 +-
com/sun/electric/plugins/j3d/ui/J3DViewDialog.java | 2 +-
.../electric/plugins/j3d/ui/JThreeDSideView.java | 2 +-
com/sun/electric/plugins/j3d/ui/JThreeDTab.java | 2 +-
com/sun/electric/plugins/j3d/utils/J3DAlpha.java | 4 +-
.../electric/plugins/j3d/utils/J3DAppearance.java | 4 +-
com/sun/electric/plugins/j3d/utils/J3DAxis.java | 4 +-
.../electric/plugins/j3d/utils/J3DCanvas3D.java | 4 +-
.../electric/plugins/j3d/utils/J3DClientApp.java | 4 +-
.../plugins/j3d/utils/J3DSerialization.java | 4 +-
.../electric/plugins/j3d/utils/J3DServerApp.java | 4 +-
com/sun/electric/plugins/j3d/utils/J3DUtils.java | 6 +-
.../minarea/bitmapjava/BitMapMinAreaChecker.java | 2 +-
.../minarea/bitmapscala/BitMapMinAreaChecker.scala | 3 +-
.../plugins/minarea/deltamerge0/SimpleChecker.java | 2 +-
.../plugins/minarea/deltamerge1/DeltaMerge.scala | 4 +-
.../plugins/minarea/deltamerge1/PointsSorter.scala | 4 +-
.../minarea/deltamerge1/SimpleChecker.scala | 15 +-
.../plugins/minarea/deltamerge1/StripeExts.scala | 2 +-
.../plugins/minarea/deltamerge1/UnloadPolys.scala | 4 +-
.../plugins/minarea/deltamerge1/UnloadPolys2.scala | 4 +-
.../electric/technology/AbstractShapeBuilder.java | 2 +-
com/sun/electric/technology/ArcProto.java | 2 +-
com/sun/electric/technology/BoundsBuilder.java | 2 +-
com/sun/electric/technology/DRC.dtd | 4 +-
com/sun/electric/technology/DRCTemplate.java | 7 +-
com/sun/electric/technology/EdgeH.java | 2 +-
com/sun/electric/technology/EdgeV.java | 2 +-
com/sun/electric/technology/Foundry.java | 6 +-
com/sun/electric/technology/GDSLayers.java | 4 +-
com/sun/electric/technology/Layer.java | 679 +--
com/sun/electric/technology/PrimitiveNode.java | 2 +-
.../electric/technology/PrimitiveNodeGroup.java | 2 +-
com/sun/electric/technology/PrimitiveNodeSize.java | 2 +-
com/sun/electric/technology/PrimitivePort.java | 2 +-
com/sun/electric/technology/SizeOffset.java | 2 +-
com/sun/electric/technology/TechFactory.java | 59 +-
com/sun/electric/technology/TechPool.java | 4 +-
com/sun/electric/technology/Technology.java | 17 +-
com/sun/electric/technology/Technology.xsd | 36 +-
com/sun/electric/technology/TransistorSize.java | 2 +-
com/sun/electric/technology/XMLRules.java | 9 +-
com/sun/electric/technology/Xml.java | 2 +-
.../electric/technology/technologies/Artwork.java | 2 +-
.../electric/technology/technologies/Dummy.java | 2 +-
com/sun/electric/technology/technologies/FPGA.java | 2 +-
com/sun/electric/technology/technologies/GEM.java | 2 +-
.../electric/technology/technologies/Generic.java | 2 +-
.../electric/technology/technologies/MoCMOS.java | 2 +-
.../technology/technologies/Schematics.java | 2 +-
.../technology/technologies/artworkMenu.xml | 2 +-
.../electric/technology/technologies/bicmos.xml | 2 +-
.../electric/technology/technologies/bipolar.xml | 2 +-
com/sun/electric/technology/technologies/cmos.xml | 2 +-
com/sun/electric/technology/technologies/dummy.xml | 2 +-
com/sun/electric/technology/technologies/efido.xml | 2 +-
.../electric/technology/technologies/fpgaMenu.xml | 2 +-
.../electric/technology/technologies/gemMenu.xml | 2 +-
.../electric/technology/technologies/mocmos-cn.xml | 1826 +++++++
.../electric/technology/technologies/mocmos.xml | 2 +-
.../technology/technologies/mocmosParam.xml | 2 +-
.../electric/technology/technologies/mocmosold.xml | 2 +-
.../electric/technology/technologies/mocmossub.xml | 2 +-
com/sun/electric/technology/technologies/nmos.xml | 2 +-
com/sun/electric/technology/technologies/pcb.xml | 2 +-
.../technologies/photonics/GratingCoupler.java | 138 +
.../technologies/photonics/OpticalArc.java | 48 +
.../technologies/photonics/OpticalCorner.java | 179 +
.../technologies/photonics/OpticalPin.java | 86 +
.../technology/technologies/photonics/PLayer.java | 84 +
.../technologies/photonics/PhotoDetector.java | 170 +
.../technologies/photonics/Photonics.java | 157 +
.../technologies/photonics/Photonics.xml | 1258 +++++
.../technologies/photonics/PhotonicsMenu.xml | 147 +
.../technology/technologies/photonics/Ring.java | 94 +
.../technologies/photonics/Splitter.java | 163 +
com/sun/electric/technology/technologies/rcmos.xml | 2 +-
.../technology/technologies/schematicMenu.xml | 2 +-
com/sun/electric/technology/technologies/tft.xml | 8 +-
com/sun/electric/tool/AbstractUserInterface.java | 2 +-
com/sun/electric/tool/Client.java | 2 +-
com/sun/electric/tool/ClientJobManager.java | 2 +-
com/sun/electric/tool/Consumer.java | 2 +-
com/sun/electric/tool/DialogJob.java | 2 +-
com/sun/electric/tool/EJob.java | 2 +-
com/sun/electric/tool/EThread.java | 2 +-
com/sun/electric/tool/Job.java | 4 +-
com/sun/electric/tool/JobException.java | 2 +-
com/sun/electric/tool/Listener.java | 2 +-
com/sun/electric/tool/MultiTaskJob.java | 2 +-
com/sun/electric/tool/Regression.java | 2 +-
com/sun/electric/tool/ServerJobManager.java | 2 +-
com/sun/electric/tool/StandAlone.java | 2 +-
com/sun/electric/tool/StreamClient.java | 2 +-
com/sun/electric/tool/SwingExamineTask.java | 2 +-
com/sun/electric/tool/Tool.java | 2 +-
com/sun/electric/tool/ToolSettings.java | 20 +-
com/sun/electric/tool/UniversalJob.java | 2 +-
com/sun/electric/tool/UserInterfaceExec.java | 2 +-
com/sun/electric/tool/UserInterfaceInitial.java | 2 +-
com/sun/electric/tool/WorkingThread.java | 2 +-
com/sun/electric/tool/compaction/Compaction.java | 98 +-
com/sun/electric/tool/cvspm/AddRemove.java | 5 +-
com/sun/electric/tool/cvspm/CVS.java | 16 +-
com/sun/electric/tool/cvspm/CVSLibrary.java | 2 +-
com/sun/electric/tool/cvspm/Commit.java | 2 +-
com/sun/electric/tool/cvspm/Edit.java | 4 +-
com/sun/electric/tool/cvspm/Log.java | 2 +-
.../electric/tool/cvspm/ModalCommandDialog.java | 2 +-
com/sun/electric/tool/cvspm/State.java | 2 +-
com/sun/electric/tool/cvspm/Update.java | 4 +-
com/sun/electric/tool/drc/AssuraDrcErrors.java | 2 +-
com/sun/electric/tool/drc/CalibreDrcErrors.java | 2 +-
com/sun/electric/tool/drc/DRC.java | 6 +-
com/sun/electric/tool/drc/MTDRCAreaTool.java | 2 +-
com/sun/electric/tool/drc/MTDRCLayoutTool.java | 2 +-
com/sun/electric/tool/drc/MTDRCTool.java | 2 +-
com/sun/electric/tool/drc/MinArea.java | 2 +-
com/sun/electric/tool/drc/Quick.java | 4 +-
com/sun/electric/tool/drc/Schematic.java | 2 +-
com/sun/electric/tool/erc/ERC.java | 2 +-
com/sun/electric/tool/erc/ERCAntenna.java | 9 +-
com/sun/electric/tool/erc/ERCWellCheck.java | 121 +-
.../tool/erc/wellcheck/ConnectionCheck.java | 21 +-
com/sun/electric/tool/erc/wellcheck/DRCCheck.java | 23 +-
.../electric/tool/erc/wellcheck/DistanceCheck.java | 41 +-
com/sun/electric/tool/erc/wellcheck/NetValues.java | 7 +-
.../electric/tool/erc/wellcheck/OnRailCheck.java | 42 +-
.../tool/erc/wellcheck/ShortCircuitCheck.java | 38 +-
com/sun/electric/tool/erc/wellcheck/Utils.java | 2 +-
.../erc/wellcheck/WellCheckAnalysisStrategy.java | 7 +-
com/sun/electric/tool/erc/wellcheck/WellCon.java | 108 +-
com/sun/electric/tool/extract/Connectivity.java | 4 +-
com/sun/electric/tool/extract/Extract.java | 2 +-
.../electric/tool/extract/ExtractedPBucket.java | 2 +-
.../electric/tool/extract/GeometryConnection.java | 2 +-
com/sun/electric/tool/extract/GeometrySearch.java | 2 +-
.../electric/tool/extract/LayerCoverageTool.java | 2 +-
com/sun/electric/tool/extract/NetPBucket.java | 2 +-
.../electric/tool/extract/ParasiticGenerator.java | 2 +-
com/sun/electric/tool/extract/ParasiticTool.java | 4 +-
com/sun/electric/tool/extract/RCPBucket.java | 2 +-
.../electric/tool/extract/TransistorPBucket.java | 2 +-
.../electric/tool/extract/TransistorSearch.java | 2 +-
.../electric/tool/generator/AcuteAngleFill.java | 2 +-
com/sun/electric/tool/generator/PadGenerator.java | 2 +-
com/sun/electric/tool/generator/ROMGenerator.java | 2 +-
.../electric/tool/generator/cmosPLA/Decode.java | 4 +-
com/sun/electric/tool/generator/cmosPLA/IO.java | 4 +-
com/sun/electric/tool/generator/cmosPLA/NGrid.java | 4 +-
com/sun/electric/tool/generator/cmosPLA/PGrid.java | 4 +-
com/sun/electric/tool/generator/cmosPLA/PLA.java | 4 +-
.../tool/generator/flag/AddFlagAnnotationJob.java | 2 +-
.../electric/tool/generator/flag/ExportNamer.java | 2 +-
com/sun/electric/tool/generator/flag/Flag.java | 2 +-
.../tool/generator/flag/FlagAnnotations.java | 2 +-
.../electric/tool/generator/flag/FlagConfig.java | 2 +-
.../tool/generator/flag/FlagConstructorData.java | 2 +-
.../electric/tool/generator/flag/FlagDesign.java | 2 +-
com/sun/electric/tool/generator/flag/FlagJob.java | 2 +-
.../tool/generator/flag/FlagLibraryCheckerJob.java | 2 +-
.../tool/generator/flag/LayoutNetlist.java | 2 +-
.../tool/generator/flag/LibraryChecker.java | 2 +-
.../tool/generator/flag/SchematicPosition.java | 2 +-
.../tool/generator/flag/SchematicVisitor.java | 2 +-
.../electric/tool/generator/flag/TaskPrinter.java | 2 +-
com/sun/electric/tool/generator/flag/Utils.java | 2 +-
.../generator/flag/designs/Infinity2/Crosser.java | 2 +-
.../flag/designs/Infinity2/Infinity2Config.java | 2 +-
.../flag/designs/Infinity2/InfinityA.java | 2 +-
.../flag/designs/Infinity2/InfinityB.java | 2 +-
.../flag/designs/Infinity2/InfinityC.java | 2 +-
.../flag/designs/Infinity2/InstFifoAll.java | 2 +-
.../generator/flag/designs/Infinity2/Ring.java | 2 +-
.../generator/flag/designs/Infinity2/Ring2.java | 2 +-
.../generator/flag/designs/Infinity2/RingH.java | 2 +-
.../generator/flag/designs/Infinity2/VddGndM3.java | 2 +-
.../generator/flag/hornFunnel2/BinaryTree.java | 2 +-
.../tool/generator/flag/hornFunnel2/Node.java | 2 +-
.../tool/generator/flag/hornFunnel2/SkewTree.java | 2 +-
.../generator/flag/hornFunnel2/SkewTreeJob.java | 2 +-
.../tool/generator/flag/router/BdRoute.java | 2 +-
.../tool/generator/flag/router/Blockage1D.java | 2 +-
.../tool/generator/flag/router/Channel.java | 2 +-
.../generator/flag/router/ConnectedSegments.java | 2 +-
.../generator/flag/router/ConnectionCache.java | 2 +-
.../tool/generator/flag/router/Interval.java | 2 +-
.../tool/generator/flag/router/LayerChannels.java | 2 +-
.../tool/generator/flag/router/Router.java | 2 +-
.../tool/generator/flag/router/Segment.java | 2 +-
.../generator/flag/router/SogRouterAdapter.java | 2 +-
.../tool/generator/flag/router/ToConnect.java | 2 +-
.../electric/tool/generator/flag/router/Track.java | 2 +-
.../electric/tool/generator/flag/scan/Scan.java | 2 +-
.../tool/generator/flag/scan/ScanChain.java | 2 +-
.../electric/tool/generator/layout/DrcRings.java | 2 +-
.../electric/tool/generator/layout/FoldedMos.java | 2 +-
.../electric/tool/generator/layout/FoldedNmos.java | 2 +-
.../electric/tool/generator/layout/FoldedPmos.java | 2 +-
.../tool/generator/layout/FoldsAndWidth.java | 2 +-
.../electric/tool/generator/layout/Gallery.java | 2 +-
.../tool/generator/layout/GateLayoutGenerator.java | 2 +-
.../tool/generator/layout/GateRegression.java | 2 +-
.../electric/tool/generator/layout/KeeperHigh.java | 2 +-
.../electric/tool/generator/layout/KeeperLow.java | 2 +-
.../electric/tool/generator/layout/LayoutLib.java | 6 +-
.../electric/tool/generator/layout/NodaNets.java | 2 +-
com/sun/electric/tool/generator/layout/Placer.java | 2 +-
.../electric/tool/generator/layout/PortFilter.java | 2 +-
.../tool/generator/layout/ProjSettings.java | 2 +-
.../electric/tool/generator/layout/SchemToLay.java | 2 +-
.../tool/generator/layout/StdCellParams.java | 2 +-
.../tool/generator/layout/StdCellParams350.java | 2 +-
.../tool/generator/layout/TechTypeWizard.java | 2 +-
.../tool/generator/layout/TrackRouter.java | 2 +-
.../tool/generator/layout/TrackRouterH.java | 2 +-
.../tool/generator/layout/TrackRouterV.java | 2 +-
.../electric/tool/generator/layout/ViaStack.java | 2 +-
.../tool/generator/layout/fill/CapCell.java | 2 +-
.../tool/generator/layout/fill/CapFloorplan.java | 2 +-
.../tool/generator/layout/fill/ExportConfig.java | 2 +-
.../tool/generator/layout/fill/FillCell.java | 2 +-
.../tool/generator/layout/fill/FillGen.java | 2 +-
.../tool/generator/layout/fill/FillGenConfig.java | 2 +-
.../tool/generator/layout/fill/FillGenJob.java | 2 +-
.../generator/layout/fill/FillGeneratorTool.java | 5 +-
com/sun/electric/tool/generator/layout/fill/G.java | 2 +-
.../tool/generator/layout/fill/StitchFillJob.java | 40 +-
.../tool/generator/layout/fill/TiledCell.java | 2 +-
.../tool/generator/layout/fill/VddGndStraps.java | 2 +-
.../generator/layout/fillCell/FillCellGenJob.java | 2051 +++++++
.../generator/layout/fillCell/FillCellTool.java | 198 +
.../layout/fillCell/FillCelllGenPanel.java | 300 ++
.../generator/layout/fillCell/TreeTiledCell.java | 528 ++
.../tool/generator/layout/gates/DrcRing.java | 2 +-
.../electric/tool/generator/layout/gates/Inv.java | 2 +-
.../tool/generator/layout/gates/Inv2i.java | 2 +-
.../tool/generator/layout/gates/Inv2iKn.java | 2 +-
.../tool/generator/layout/gates/Inv2iKp.java | 2 +-
.../tool/generator/layout/gates/InvCLK.java | 2 +-
.../tool/generator/layout/gates/InvCTLn.java | 2 +-
.../tool/generator/layout/gates/InvHT.java | 2 +-
.../tool/generator/layout/gates/InvLT.java | 2 +-
.../electric/tool/generator/layout/gates/InvV.java | 2 +-
.../tool/generator/layout/gates/Inv_passgate.java | 2 +-
.../tool/generator/layout/gates/Inv_star.java | 2 +-
.../layout/gates/Inv_star_wideOutput.java | 2 +-
.../generator/layout/gates/MoCMOSGenerator.java | 4 +-
.../tool/generator/layout/gates/MullerC_sy.java | 2 +-
.../tool/generator/layout/gates/Nand2.java | 2 +-
.../tool/generator/layout/gates/Nand2HLT.java | 2 +-
.../tool/generator/layout/gates/Nand2HLT_sy.java | 2 +-
.../tool/generator/layout/gates/Nand2HTen.java | 2 +-
.../tool/generator/layout/gates/Nand2LT.java | 2 +-
.../tool/generator/layout/gates/Nand2LT_sy.java | 2 +-
.../tool/generator/layout/gates/Nand2LTen.java | 2 +-
.../tool/generator/layout/gates/Nand2PH.java | 2 +-
.../tool/generator/layout/gates/Nand2PHfk.java | 2 +-
.../tool/generator/layout/gates/Nand2_star.java | 2 +-
.../tool/generator/layout/gates/Nand2_star_en.java | 2 +-
.../tool/generator/layout/gates/Nand2_star_sy.java | 2 +-
.../tool/generator/layout/gates/Nand2_sy.java | 2 +-
.../tool/generator/layout/gates/Nand2en.java | 2 +-
.../tool/generator/layout/gates/Nand2en_sy.java | 2 +-
.../tool/generator/layout/gates/Nand3.java | 2 +-
.../tool/generator/layout/gates/Nand3LT.java | 2 +-
.../tool/generator/layout/gates/Nand3LT_sy3.java | 2 +-
.../tool/generator/layout/gates/Nand3LTen.java | 2 +-
.../tool/generator/layout/gates/Nand3LTen_sy.java | 2 +-
.../tool/generator/layout/gates/Nand3LTen_sy3.java | 2 +-
.../tool/generator/layout/gates/Nand3MLT.java | 2 +-
.../tool/generator/layout/gates/Nand3_star.java | 2 +-
.../generator/layout/gates/Nand3_star_en_star.java | 2 +-
.../generator/layout/gates/Nand3_star_en_sy3.java | 2 +-
.../generator/layout/gates/Nand3_star_sy3.java | 2 +-
.../tool/generator/layout/gates/Nand3_sy3.java | 2 +-
.../tool/generator/layout/gates/Nand3en.java | 2 +-
.../tool/generator/layout/gates/Nand3en_sy.java | 2 +-
.../tool/generator/layout/gates/Nand3en_sy3.java | 2 +-
.../electric/tool/generator/layout/gates/Nms1.java | 2 +-
.../electric/tool/generator/layout/gates/Nms2.java | 2 +-
.../tool/generator/layout/gates/Nms2_sy.java | 2 +-
.../tool/generator/layout/gates/Nms3_sy3.java | 2 +-
.../electric/tool/generator/layout/gates/Nor2.java | 2 +-
.../tool/generator/layout/gates/Nor2LT.java | 2 +-
.../tool/generator/layout/gates/Nor2_star.java | 2 +-
.../tool/generator/layout/gates/Nor2kresetV.java | 2 +-
.../electric/tool/generator/layout/gates/Pms1.java | 2 +-
.../electric/tool/generator/layout/gates/Pms2.java | 2 +-
.../tool/generator/layout/gates/Pms2_sy.java | 2 +-
.../tool/generator/layout/gates/TieHi.java | 2 +-
.../tool/generator/layout/gates/VertTrack.java | 2 +-
.../tool/generator/layout/gates/WellTie.java | 2 +-
.../tool/generator/sclibrary/SCLibraryGen.java | 2 +-
com/sun/electric/tool/io/ELIBConstants.java | 2 +-
com/sun/electric/tool/io/ExecProcess.java | 2 +-
com/sun/electric/tool/io/FileType.java | 3 +-
com/sun/electric/tool/io/GDSReader.java | 2 +-
com/sun/electric/tool/io/IOTool.java | 97 +-
com/sun/electric/tool/io/input/Applicon860.java | 2 +-
com/sun/electric/tool/io/input/CIF.java | 4 +-
com/sun/electric/tool/io/input/DEF.java | 633 +--
com/sun/electric/tool/io/input/DXF.java | 4 +-
com/sun/electric/tool/io/input/EDIF.java | 4 +-
com/sun/electric/tool/io/input/ELIB.java | 4 +-
com/sun/electric/tool/io/input/EpicOut.java | 2 +-
com/sun/electric/tool/io/input/GDS.java | 320 +-
com/sun/electric/tool/io/input/GDSMap.java | 2 +-
com/sun/electric/tool/io/input/Gerber.java | 4 +-
com/sun/electric/tool/io/input/HSpiceOut.java | 13 +-
com/sun/electric/tool/io/input/Input.java | 5 +-
com/sun/electric/tool/io/input/JELIB.java | 4 +-
com/sun/electric/tool/io/input/JELIB2.java | 4 +-
com/sun/electric/tool/io/input/JelibParser.java | 4 +-
com/sun/electric/tool/io/input/LEF.java | 4 +-
com/sun/electric/tool/io/input/LEFDEF.java | 6 +-
com/sun/electric/tool/io/input/LibDirs.java | 2 +-
com/sun/electric/tool/io/input/LibraryFiles.java | 6 +-
.../electric/tool/io/input/LibraryStatistics.java | 4 +-
com/sun/electric/tool/io/input/PSpiceOut.java | 4 +-
com/sun/electric/tool/io/input/RawSpiceOut.java | 4 +-
com/sun/electric/tool/io/input/ReadableDump.java | 4 +-
com/sun/electric/tool/io/input/SimulationData.java | 4 +-
com/sun/electric/tool/io/input/SmartSpiceOut.java | 4 +-
com/sun/electric/tool/io/input/Spice.java | 4 +-
com/sun/electric/tool/io/input/SpiceOut.java | 4 +-
com/sun/electric/tool/io/input/Sue.java | 4 +-
.../tool/io/input/bookshelf/Bookshelf.java | 2 +-
.../tool/io/input/bookshelf/BookshelfAux.java | 2 +-
.../io/input/bookshelf/BookshelfInputParser.java | 2 +-
.../tool/io/input/bookshelf/BookshelfNets.java | 2 +-
.../tool/io/input/bookshelf/BookshelfNodes.java | 2 +-
.../io/input/bookshelf/BookshelfPlacement.java | 2 +-
.../tool/io/input/bookshelf/BookshelfWeights.java | 2 +-
.../tool/io/input/spicenetlist/SpiceInstance.java | 2 +-
.../io/input/spicenetlist/SpiceNetlistReader.java | 2 +-
.../tool/io/input/spicenetlist/SpiceSubckt.java | 2 +-
.../electric/tool/io/input/verilog/VerilogOut.java | 4 +-
.../tool/io/input/verilog/VerilogReader.java | 4 +-
com/sun/electric/tool/io/output/CIF.java | 7 +-
.../electric/tool/io/output/CellModelPrefs.java | 2 +-
com/sun/electric/tool/io/output/DEF.java | 2 +-
com/sun/electric/tool/io/output/DELIB.java | 2 +-
com/sun/electric/tool/io/output/DFTM.java | 4 +-
com/sun/electric/tool/io/output/DXF.java | 11 +-
com/sun/electric/tool/io/output/ECAD.java | 4 +-
com/sun/electric/tool/io/output/EDIF.java | 4 +-
com/sun/electric/tool/io/output/EDIFEquiv.java | 2 +-
com/sun/electric/tool/io/output/ELIB.java | 4 +-
com/sun/electric/tool/io/output/Eagle.java | 4 +-
com/sun/electric/tool/io/output/FastHenry.java | 4 +-
com/sun/electric/tool/io/output/FlatRects.java | 161 +
com/sun/electric/tool/io/output/GDS.java | 103 +-
com/sun/electric/tool/io/output/GenerateVHDL.java | 4 +-
com/sun/electric/tool/io/output/Geometry.java | 4 +-
com/sun/electric/tool/io/output/Gerber.java | 2 +-
com/sun/electric/tool/io/output/HPGL.java | 4 +-
com/sun/electric/tool/io/output/IRSIM.java | 4 +-
com/sun/electric/tool/io/output/JELIB.java | 4 +-
com/sun/electric/tool/io/output/L.java | 4 +-
com/sun/electric/tool/io/output/LEF.java | 4 +-
com/sun/electric/tool/io/output/MOSSIM.java | 4 +-
com/sun/electric/tool/io/output/Maxwell.java | 4 +-
com/sun/electric/tool/io/output/Output.java | 22 +-
com/sun/electric/tool/io/output/PAL.java | 4 +-
com/sun/electric/tool/io/output/PNG.java | 4 +-
com/sun/electric/tool/io/output/Pads.java | 4 +-
com/sun/electric/tool/io/output/PostScript.java | 4 +-
.../electric/tool/io/output/PostScriptColor.java | 2 +-
com/sun/electric/tool/io/output/ReadableDump.java | 4 +-
com/sun/electric/tool/io/output/STL.java | 4 +-
com/sun/electric/tool/io/output/SVG.java | 4 +-
com/sun/electric/tool/io/output/ScanChainXML.java | 2 +-
com/sun/electric/tool/io/output/Silos.java | 4 +-
com/sun/electric/tool/io/output/Sim.java | 4 +-
com/sun/electric/tool/io/output/Spice.java | 8 +-
.../electric/tool/io/output/SpiceExemptedNets.java | 2 +-
.../electric/tool/io/output/SpiceParasitic.java | 2 +-
com/sun/electric/tool/io/output/SpiceRCSimple.java | 2 +-
.../tool/io/output/SpiceSegmentedNets.java | 2 +-
com/sun/electric/tool/io/output/Tegas.java | 4 +-
com/sun/electric/tool/io/output/Telesis.java | 41 +-
com/sun/electric/tool/io/output/Topology.java | 78 +-
com/sun/electric/tool/io/output/Verilog.java | 297 +-
.../tool/io/output/bookshelf/BookshelfOutput.java | 2 +-
.../io/output/bookshelf/BookshelfOutputAux.java | 2 +-
.../io/output/bookshelf/BookshelfOutputNets.java | 2 +-
.../io/output/bookshelf/BookshelfOutputNodes.java | 2 +-
.../output/bookshelf/BookshelfOutputPlacement.java | 2 +-
.../output/bookshelf/BookshelfOutputWeights.java | 2 +-
.../io/output/bookshelf/BookshelfOutputWriter.java | 2 +-
com/sun/electric/tool/lang/EvalJavaBsh.java | 98 +-
com/sun/electric/tool/lang/EvalJython.java | 2 +-
com/sun/electric/tool/lang/EvalSpice.java | 4 +-
.../electric/tool/logicaleffort/CachedCell.java | 4 +-
com/sun/electric/tool/logicaleffort/Instance.java | 4 +-
com/sun/electric/tool/logicaleffort/LEInst.java | 2 +-
.../electric/tool/logicaleffort/LENetlister.java | 4 +-
.../electric/tool/logicaleffort/LENetlister1.java | 4 +-
.../electric/tool/logicaleffort/LENetlister2.java | 4 +-
com/sun/electric/tool/logicaleffort/LENetwork.java | 4 +-
com/sun/electric/tool/logicaleffort/LENodable.java | 4 +-
com/sun/electric/tool/logicaleffort/LEPin.java | 4 +-
com/sun/electric/tool/logicaleffort/LESizer.java | 4 +-
com/sun/electric/tool/logicaleffort/LESizer2.java | 4 +-
com/sun/electric/tool/logicaleffort/LETool.java | 201 +-
com/sun/electric/tool/logicaleffort/Net.java | 4 +-
com/sun/electric/tool/logicaleffort/Pin.java | 4 +-
com/sun/electric/tool/ncc/Aborter.java | 2 +-
com/sun/electric/tool/ncc/AllSchemNamesToLay.java | 2 +-
com/sun/electric/tool/ncc/ListNccAnnotations.java | 2 +-
com/sun/electric/tool/ncc/Ncc.java | 2 +-
com/sun/electric/tool/ncc/NccBottomUp.java | 2 +-
com/sun/electric/tool/ncc/NccCrossProbing.java | 2 +-
com/sun/electric/tool/ncc/NccEngine.java | 2 +-
com/sun/electric/tool/ncc/NccGlobals.java | 2 +-
.../electric/tool/ncc/NccGlobalsReportable.java | 2 +-
com/sun/electric/tool/ncc/NccJob.java | 2 +-
com/sun/electric/tool/ncc/NccOptions.java | 2 +-
com/sun/electric/tool/ncc/NccPreferences.java | 2 +-
com/sun/electric/tool/ncc/SchemNamesToLay.java | 2 +-
com/sun/electric/tool/ncc/basic/CellContext.java | 2 +-
com/sun/electric/tool/ncc/basic/CellUsage.java | 2 +-
com/sun/electric/tool/ncc/basic/CompareList.java | 2 +-
com/sun/electric/tool/ncc/basic/CompareLists.java | 2 +-
.../tool/ncc/basic/NccCellAnnotations.java | 2 +-
com/sun/electric/tool/ncc/basic/NccUtils.java | 2 +-
com/sun/electric/tool/ncc/basic/Primes.java | 2 +-
.../tool/ncc/basic/TransitiveRelation.java | 2 +-
com/sun/electric/tool/ncc/lists/LeafList.java | 2 +-
com/sun/electric/tool/ncc/lists/RecordList.java | 2 +-
com/sun/electric/tool/ncc/netlist/Bipolar.java | 2 +-
.../tool/ncc/netlist/Function4PortTo3Port.java | 2 +-
com/sun/electric/tool/ncc/netlist/Mos.java | 2 +-
.../electric/tool/ncc/netlist/NccNameProxy.java | 2 +-
com/sun/electric/tool/ncc/netlist/NccNetlist.java | 2 +-
com/sun/electric/tool/ncc/netlist/NetObject.java | 2 +-
com/sun/electric/tool/ncc/netlist/Part.java | 2 +-
com/sun/electric/tool/ncc/netlist/PinType.java | 2 +-
com/sun/electric/tool/ncc/netlist/Port.java | 2 +-
.../tool/ncc/netlist/PrimitiveNameToFunction.java | 2 +-
com/sun/electric/tool/ncc/netlist/Resistor.java | 2 +-
com/sun/electric/tool/ncc/netlist/Subcircuit.java | 2 +-
com/sun/electric/tool/ncc/netlist/Wire.java | 2 +-
.../tool/ncc/processing/ExportChecker.java | 2 +-
.../electric/tool/ncc/processing/ForceMatch.java | 2 +-
.../tool/ncc/processing/HashCodePartitioning.java | 2 +-
.../tool/ncc/processing/HierarchyInfo.java | 2 +-
.../tool/ncc/processing/LocalPartitionResult.java | 2 +-
.../tool/ncc/processing/LocalPartitionWires.java | 2 +-
.../tool/ncc/processing/LocalPartitioning.java | 2 +-
.../tool/ncc/processing/ReportHashCodeFailure.java | 2 +-
.../tool/ncc/processing/SerialParallelMerge.java | 2 +-
.../tool/ncc/processing/SubcircuitInfo.java | 2 +-
.../electric/tool/ncc/result/BenchmarkResults.java | 2 +-
.../electric/tool/ncc/result/EquivRecReport.java | 2 +-
com/sun/electric/tool/ncc/result/NccResult.java | 2 +-
com/sun/electric/tool/ncc/result/NccResults.java | 2 +-
com/sun/electric/tool/ncc/result/NetObjReport.java | 2 +-
com/sun/electric/tool/ncc/result/PartReport.java | 2 +-
com/sun/electric/tool/ncc/result/Permutation.java | 2 +-
com/sun/electric/tool/ncc/result/PortReport.java | 2 +-
com/sun/electric/tool/ncc/result/SizeMismatch.java | 2 +-
com/sun/electric/tool/ncc/result/WireReport.java | 2 +-
.../tool/ncc/result/equivalence/Equivalence.java | 2 +-
.../equivalence/InstancePathToNccContext.java | 2 +-
.../tool/ncc/result/equivalence/NccContext.java | 2 +-
.../ncc/result/equivalence/NetEquivalence.java | 2 +-
.../ncc/result/equivalence/NodeEquivalence.java | 2 +-
com/sun/electric/tool/ncc/strategy/StratCheck.java | 2 +-
.../tool/ncc/strategy/StratCheckSizes.java | 2 +-
com/sun/electric/tool/ncc/strategy/StratCount.java | 2 +-
com/sun/electric/tool/ncc/strategy/StratDebug.java | 2 +-
.../electric/tool/ncc/strategy/StratHashParts.java | 2 +-
.../electric/tool/ncc/strategy/StratHashWires.java | 2 +-
.../tool/ncc/strategy/StratPartPopularity.java | 2 +-
.../electric/tool/ncc/strategy/StratPartType.java | 2 +-
.../electric/tool/ncc/strategy/StratPortName.java | 2 +-
com/sun/electric/tool/ncc/strategy/StratPrint.java | 2 +-
.../tool/ncc/strategy/StratRandomMatch.java | 2 +-
com/sun/electric/tool/ncc/strategy/StratSizes.java | 2 +-
com/sun/electric/tool/ncc/strategy/Strategy.java | 2 +-
com/sun/electric/tool/ncc/trees/Circuit.java | 2 +-
com/sun/electric/tool/ncc/trees/EquivRecord.java | 2 +-
.../electric/tool/ncc/trees/LeafEquivRecords.java | 2 +-
com/sun/electric/tool/placement/Placement.java | 2 +-
.../electric/tool/placement/PlacementAdapter.java | 4 +-
.../electric/tool/placement/PlacementFrame.java | 2 +-
.../tool/placement/PlacementFrameElectric.java | 2 +-
.../electric/tool/placement/PlacementMinCut.java | 2 +-
.../electric/tool/placement/PlacementRandom.java | 2 +-
.../electric/tool/placement/PlacementSimple.java | 2 +-
.../tool/placement/forceDirected1/Debug.java | 2 +-
.../PlacementForceDirectedTeam5.java | 8 +-
.../forceDirected1/metric/AbstractMetric.java | 2 +-
.../placement/forceDirected1/metric/BBMetric.java | 2 +-
.../placement/forceDirected1/metric/MSTMetric.java | 6 +-
.../forceDirected1/metrics/CustomMetric.java | 4 +-
.../placement/forceDirected1/metrics/PAMetric.java | 2 +-
.../forceDirected2/AdditionalNodeData.java | 2 +-
.../PlacementForceDirectedStaged.java | 2 +-
.../forceDirected/IForceAlgorithm.java | 2 +-
.../forceDirected/IPlacementForceDirected.java | 2 +-
.../forceDirected/OverlapDirection.java | 2 +-
.../forceDirected2/forceDirected/SpringForce.java | 2 +-
.../staged/CalculateForcesStageWorker.java | 4 +-
.../forceDirected/staged/EndWorker.java | 2 +-
.../forceDirected/staged/FinalizeWorker.java | 2 +-
.../forceDirected/staged/OverlapWorker.java | 2 +-
.../staged/PlaceNodesStageWorker.java | 2 +-
.../forceDirected/staged/PlacementDTO.java | 2 +-
.../forceDirected/staged/StartUpStage.java | 2 +-
.../forceDirected/staged/StartUpStageWorker.java | 2 +-
.../forceDirected/util/CheckboardingField.java | 2 +-
.../forceDirected/util/CheckboardingPattern.java | 2 +-
.../forceDirected2/forceDirected/util/Force2D.java | 2 +-
.../forceDirected/util/history/HistoryEntry.java | 2 +-
.../util/history/IOverlapHistory.java | 2 +-
.../forceDirected/util/history/OverlapHistory.java | 2 +-
.../util/history/OverlapHistoryAtomics.java | 2 +-
.../util/history/OverlapHistoryLock.java | 2 +-
.../util/history/OverlapHistoryLockFree.java | 2 +-
.../util/history/OverlapHistoryNone.java | 2 +-
.../util/history/OverlapHistorySync.java | 2 +-
.../forceDirected2/metrics/AbstractMetric.java | 2 +-
.../metrics/AbstractMetricGeneric.java | 2 +-
.../placement/forceDirected2/metrics/BBMetric.java | 2 +-
.../forceDirected2/metrics/MSTMetric.java | 6 +-
.../forceDirected2/metrics/OverallAreaMetric.java | 2 +-
.../placement/forceDirected2/utils/GlobalVars.java | 2 +-
.../forceDirected2/utils/PlacementProperties.java | 2 +-
.../utils/concurrent/CircularArray.java | 2 +-
.../forceDirected2/utils/concurrent/DEQueue.java | 2 +-
.../utils/concurrent/EmptyException.java | 2 +-
.../utils/concurrent/IDEStructure.java | 2 +-
.../utils/concurrent/IStructure.java | 2 +-
.../utils/concurrent/LockFreeQueue.java | 2 +-
.../forceDirected2/utils/concurrent/Stage.java | 2 +-
.../utils/concurrent/StageWorker.java | 2 +-
.../forceDirected2/utils/concurrent/ThreadID.java | 2 +-
.../utils/output/DebugMessageHandler.java | 2 +-
.../forceDirected2/utils/output/GenerateCSV.java | 2 +-
.../forceDirected2/utils/output/PNGOutput.java | 2 +-
.../tool/placement/general/BottomUpPartition.java | 2 +-
.../tool/placement/general/BottomUpPlace.java | 2 +-
.../electric/tool/placement/general/Control.java | 2 +-
.../tool/placement/general/FDIrregular.java | 2 +-
.../electric/tool/placement/general/FDRowCol.java | 2 +-
.../tool/placement/general/FindEmptyRects.java | 2 +-
.../electric/tool/placement/general/RowCol.java | 2 +-
.../electric/tool/placement/general/SARowCol.java | 2 +-
.../tool/placement/genetic1/Chromosome.java | 2 +-
.../placement/genetic1/ChromosomeMutation.java | 2 +-
.../tool/placement/genetic1/Crossover.java | 2 +-
.../tool/placement/genetic1/GenePlacement.java | 2 +-
.../electric/tool/placement/genetic1/Metric.java | 2 +-
.../tool/placement/genetic1/Population.java | 2 +-
.../placement/genetic1/PopulationCreation.java | 2 +-
.../placement/genetic1/PopulationMutation.java | 2 +-
.../tool/placement/genetic1/Selection.java | 2 +-
.../genetic1/g1/ChromosomeMutationPadding.java | 2 +-
.../genetic1/g1/ChromsomeMutationMoveCells.java | 2 +-
.../genetic1/g1/ChromsomeMutationRotateCells.java | 2 +-
.../genetic1/g1/ChromsomeMutationSwapCells.java | 2 +-
.../g1/CycleCrossoverFavoringStrongParents.java | 2 +-
.../g1/GenePlacementLeftRightAlignedDrop.java | 2 +-
.../placement/genetic1/g1/GeneticPlacement.java | 2 +-
.../placement/genetic1/g1/MetricBoundingBox3.java | 2 +-
.../placement/genetic1/g1/PlacementNodeProxy.java | 2 +-
.../PopulationCreationRandomWithPlaceHolder2.java | 2 +-
.../placement/genetic1/g1/PopulationMutation2.java | 2 +-
.../placement/genetic1/g1/SelectionTournament.java | 2 +-
.../genetic1/g1/SubPopulationProcessing.java | 2 +-
.../electric/tool/placement/genetic2/Block.java | 2 +-
.../tool/placement/genetic2/ClassicIndividual.java | 2 +-
.../tool/placement/genetic2/DeltaIndividual.java | 2 +-
.../electric/tool/placement/genetic2/Evolver.java | 2 +-
.../tool/placement/genetic2/GeneticPlacer.java | 2 +-
.../tool/placement/genetic2/Individual.java | 2 +-
.../tool/placement/genetic2/PlacementGenetic.java | 2 +-
.../tool/placement/genetic2/Population.java | 2 +-
.../tool/placement/genetic2/Reference.java | 2 +-
.../placement/genetic2/SimulatedAnnealing.java | 2 +-
.../tool/placement/genetic2/UnifiedPopulation.java | 2 +-
.../tool/placement/genetic2/UniformGrid.java | 2 +-
.../tool/placement/genetic2/metrics/BBMetric.java | 2 +-
.../tool/placement/genetic2/metrics/BBThread.java | 2 +-
.../placement/genetic2/metrics/DeltaBBMetric.java | 2 +-
.../tool/placement/metrics/AbstractMetric.java | 2 +-
.../placement/metrics/AbstractMetricGeneric.java | 2 +-
.../placement/metrics/boundingbox/BBMetric.java | 2 +-
.../metrics/boundingbox/BBMetricParallel.java | 2 +-
.../metrics/boundingbox/BBMetricTask.java | 2 +-
.../tool/placement/metrics/mst/MSTMetric.java | 6 +-
.../placement/metrics/mst/MSTMetricParallel.java | 2 +-
.../tool/placement/metrics/mst/MSTMetricTask.java | 6 +-
.../placement/simulatedAnnealing1/SA_Test.java | 2 +-
.../simulatedAnnealing1/SimulatedAnnealing.java | 2 +-
.../simulatedAnnealing1/metrics/AOMetric.java | 2 +-
.../metrics/AbstractMetric.java | 2 +-
.../metrics/AreaOverlapMetric.java | 2 +-
.../simulatedAnnealing1/metrics/BBMetric.java | 2 +-
.../metrics/BoundingBoxMetric.java | 2 +-
.../simulatedAnnealing1/metrics/MSTMetric.java | 2 +-
.../simulatedAnnealing2/BoundingBoxMetric.java | 2 +-
.../placement/simulatedAnnealing2/MSTMetric.java | 2 +-
.../tool/placement/simulatedAnnealing2/Metric.java | 2 +-
.../PlacementSimulatedAnnealing.java | 8 +-
.../simulatedAnnealing2/PositionIndex.java | 2 +-
.../placement/simulatedAnnealing2/ProxyNode.java | 2 +-
com/sun/electric/tool/project/AddCellJob.java | 2 +-
com/sun/electric/tool/project/AddLibraryJob.java | 2 +-
.../electric/tool/project/CancelCheckOutJob.java | 2 +-
com/sun/electric/tool/project/CheckInJob.java | 2 +-
com/sun/electric/tool/project/CheckOutJob.java | 2 +-
com/sun/electric/tool/project/DeleteCellJob.java | 2 +-
com/sun/electric/tool/project/DisplayedCells.java | 2 +-
com/sun/electric/tool/project/HistoryDialog.java | 2 +-
com/sun/electric/tool/project/LibraryDialog.java | 2 +-
com/sun/electric/tool/project/Project.java | 2 +-
com/sun/electric/tool/project/ProjectCell.java | 2 +-
com/sun/electric/tool/project/ProjectDB.java | 2 +-
com/sun/electric/tool/project/ProjectLibrary.java | 2 +-
com/sun/electric/tool/project/UpdateJob.java | 2 +-
com/sun/electric/tool/project/Users.java | 2 +-
com/sun/electric/tool/routing/AutoStitch.java | 4 +-
com/sun/electric/tool/routing/ClockRouter.java | 2 +-
.../electric/tool/routing/InteractiveRouter.java | 2 +-
com/sun/electric/tool/routing/Maze.java | 4 +-
com/sun/electric/tool/routing/MimicStitch.java | 4 +-
com/sun/electric/tool/routing/River.java | 4 +-
com/sun/electric/tool/routing/Route.java | 2 +-
com/sun/electric/tool/routing/RouteElement.java | 2 +-
com/sun/electric/tool/routing/RouteElementArc.java | 4 +-
.../electric/tool/routing/RouteElementPort.java | 2 +-
com/sun/electric/tool/routing/Router.java | 2 +-
com/sun/electric/tool/routing/Routing.java | 52 +-
com/sun/electric/tool/routing/RoutingFrame.java | 2 +-
com/sun/electric/tool/routing/SeaOfGates.java | 107 +-
com/sun/electric/tool/routing/SimpleWirer.java | 2 +-
com/sun/electric/tool/routing/VerticalRoute.java | 4 +-
.../experimentalAStar1/AStarBlockageWorker.java | 2 +-
.../routing/experimentalAStar1/AStarMaster.java | 2 +-
.../experimentalAStar1/AStarRoutingFrame.java | 4 +-
.../routing/experimentalAStar1/AStarWorker.java | 2 +-
.../experimentalAStar1/BenchmarkRouter.java | 2 +-
.../routing/experimentalAStar1/CellPrinter.java | 2 +-
.../tool/routing/experimentalAStar1/EndPoint.java | 2 +-
.../routing/experimentalAStar1/EndPointMarker.java | 2 +-
.../tool/routing/experimentalAStar1/Goal.java | 2 +-
.../tool/routing/experimentalAStar1/Map.java | 2 +-
.../tool/routing/experimentalAStar1/Net.java | 2 +-
.../tool/routing/experimentalAStar1/Node.java | 2 +-
.../routing/experimentalAStar1/ObjectPool.java | 2 +-
.../tool/routing/experimentalAStar1/Path.java | 2 +-
.../tool/routing/experimentalAStar1/Poolable.java | 2 +-
.../routing/experimentalAStar1/PriorityQueue.java | 2 +-
.../tool/routing/experimentalAStar1/QuadTree.java | 2 +-
.../tool/routing/experimentalAStar1/SplayTree.java | 2 +-
.../tool/routing/experimentalAStar1/Storage.java | 2 +-
.../routing/experimentalAStar2/AStarRouter.java | 4 +-
.../experimentalAStar2/BenchmarkRouter.java | 2 +-
.../experimentalAStar2/algorithm/AStar.java | 2 +-
.../algorithm/AStarClosedListBase.java | 2 +-
.../algorithm/AStarGoalBase.java | 2 +-
.../experimentalAStar2/algorithm/AStarMapBase.java | 2 +-
.../algorithm/AStarMapVisitorBase.java | 2 +-
.../experimentalAStar2/algorithm/AStarNode.java | 2 +-
.../algorithm/AStarNodeBase.java | 2 +-
.../algorithm/AStarOpenListBase.java | 2 +-
.../algorithm/AStarRegionNode.java | 2 +-
.../algorithm/ExternalVisitor.java | 2 +-
.../concurrency/GlobalRouteJob.java | 2 +-
.../concurrency/LocalRouteJob.java | 2 +-
.../experimentalAStar2/concurrency/RouteJob.java | 2 +-
.../concurrency/RoutingMain.java | 2 +-
.../experimentalAStar2/datastructures/Point3D.java | 2 +-
.../experimentalAStar2/goal/RegionGoal.java | 2 +-
.../experimentalAStar2/goal/SimpleGoal.java | 2 +-
.../goal/SimpleGoalEightNeighbours.java | 2 +-
.../experimentalAStar2/machine/AStarMachine.java | 2 +-
.../machine/AStarMachineFast.java | 2 +-
.../machine/AStarMachineSimple.java | 2 +-
.../machine/AStarNodeFactory.java | 2 +-
.../machine/AStarRegionMachine.java | 2 +-
.../routing/experimentalAStar2/map/FieldMap.java | 2 +-
.../experimentalAStar2/map/HashedInfiniteMap.java | 2 +-
.../map/HashedInfiniteMapEightNeighbours.java | 2 +-
.../routing/experimentalAStar2/map/Region.java | 2 +-
.../experimentalAStar2/map/RegionBoundingBox.java | 2 +-
.../memorymanager/AStarNodeObjectPool.java | 2 +-
.../memorymanager/AStarRegionNodeObjectPool.java | 2 +-
.../memorymanager/LinkedListObjectPool.java | 2 +-
.../memorymanager/ObjectFactory.java | 2 +-
.../memorymanager/ObjectPool.java | 2 +-
.../storage/AStarClosedListHashMap.java | 2 +-
.../storage/AStarClosedListReferencing.java | 2 +-
.../storage/AStarOpenListCheapList.java | 2 +-
.../storage/AStarOpenListPriorityQueue.java | 2 +-
.../routing/experimentalAStar3/AStarRouter.java | 4 +-
.../experimentalAStar3/BenchmarkRouter.java | 2 +-
.../experimentalAStar3/algorithm/AStar.java | 2 +-
.../algorithm/AStarClosedListBase.java | 2 +-
.../algorithm/AStarGoalBase.java | 2 +-
.../experimentalAStar3/algorithm/AStarMapBase.java | 2 +-
.../algorithm/AStarMapVisitorBase.java | 2 +-
.../experimentalAStar3/algorithm/AStarNode.java | 2 +-
.../algorithm/AStarNodeBase.java | 2 +-
.../algorithm/AStarOpenListBase.java | 2 +-
.../algorithm/AStarRegionNode.java | 2 +-
.../algorithm/ExternalVisitor.java | 2 +-
.../concurrency/GlobalRouteJob.java | 2 +-
.../concurrency/LocalRouteJob.java | 2 +-
.../experimentalAStar3/concurrency/RouteJob.java | 2 +-
.../concurrency/RoutingMain.java | 4 +-
.../experimentalAStar3/datastructures/Array2D.java | 2 +-
.../experimentalAStar3/datastructures/Array3D.java | 2 +-
.../experimentalAStar3/datastructures/Point3D.java | 2 +-
.../datastructures/PriorityQueue.java | 2 +-
.../experimentalAStar3/goal/RegionGoal.java | 2 +-
.../experimentalAStar3/goal/SimpleGoal.java | 2 +-
.../goal/SimpleGoalEightNeighbours.java | 2 +-
.../experimentalAStar3/machine/AStarMachine.java | 2 +-
.../machine/AStarMachineFast.java | 2 +-
.../machine/AStarMachineSimple.java | 2 +-
.../machine/AStarNodeFactory.java | 2 +-
.../machine/AStarRegionMachine.java | 2 +-
.../routing/experimentalAStar3/map/FieldMap.java | 2 +-
.../experimentalAStar3/map/HashedInfiniteMap.java | 2 +-
.../map/HashedInfiniteMapEightNeighbours.java | 2 +-
.../routing/experimentalAStar3/map/Region.java | 2 +-
.../experimentalAStar3/map/RegionBoundingBox.java | 2 +-
.../memorymanager/AStarNodeObjectPool.java | 2 +-
.../memorymanager/AStarRegionNodeObjectPool.java | 2 +-
.../memorymanager/LinkedListObjectPool.java | 2 +-
.../memorymanager/ObjectFactory.java | 2 +-
.../memorymanager/ObjectPool.java | 2 +-
.../storage/AStarClosedListHashMap.java | 2 +-
.../storage/AStarClosedListReferencing.java | 2 +-
.../storage/AStarOpenListCheapList.java | 2 +-
.../storage/AStarOpenListPriorityQueue.java | 2 +-
.../storage/AStarOpenListPriorityQueue2.java | 2 +-
.../experimentalLeeMoore1/BenchmarkRouter.java | 2 +-
.../experimentalLeeMoore1/ConnectionPoints.java | 2 +-
.../FindVirtualEndInterface.java | 2 +-
.../FindVirtualEnd_ProjectedAndRandomized.java | 2 +-
.../FindVirtualEnd_Simple.java | 2 +-
.../experimentalLeeMoore1/LeeMoore/Route.java | 2 +-
.../LeeMoore/RoutingArray.java | 4 +-
.../experimentalLeeMoore1/LeeMoore/Tupel.java | 2 +-
.../routing/experimentalLeeMoore1/RoutingPart.java | 2 +-
.../experimentalLeeMoore1/ThreadBorders.java | 2 +-
.../tool/routing/experimentalLeeMoore1/Wiring.java | 4 +-
.../experimentalLeeMoore1/WorkPartition.java | 2 +-
.../routing/experimentalLeeMoore1/WorkPool.java | 2 +-
.../experimentalLeeMoore1/WorkerThread.java | 2 +-
.../tool/routing/experimentalLeeMoore1/yana.java | 2 +-
.../experimentalLeeMoore2/AlgoVisualizerV3.java | 2 +-
.../experimentalLeeMoore2/BenchmarkRouter.java | 2 +-
.../DemandTemplateHandler.java | 2 +-
.../experimentalLeeMoore2/DetailedRouter.java | 2 +-
.../DetailedRouterWorker.java | 2 +-
.../GlobalRouterAnalysis.java | 2 +-
.../GlobalRouterPathFinder.java | 2 +-
.../GlobalRouterThreadV3.java | 2 +-
.../experimentalLeeMoore2/GlobalRouterV3.java | 2 +-
.../RoutingFrameLeeMoore.java | 2 +-
.../experimentalLeeMoore3/BenchmarkRouter.java | 2 +-
.../CouldNotCalculateVirtualTerminalException.java | 2 +-
.../routing/experimentalLeeMoore3/DataGrid.java | 2 +-
.../DistanceRatingFunction.java | 2 +-
.../ForcedDirectionRatingFunction.java | 2 +-
.../routing/experimentalLeeMoore3/Gridpoint.java | 2 +-
.../OutOfBoundsRatingFunction.java | 2 +-
.../tool/routing/experimentalLeeMoore3/Rating.java | 2 +-
.../experimentalLeeMoore3/RatingFunction.java | 2 +-
.../RatingNotFoundException.java | 2 +-
.../RoutingFrameLeeMoore.java | 2 +-
.../ShiftInDirectionRatingFunction.java | 2 +-
.../experimentalSample/RoutingFrameSample.java | 2 +-
.../RoutingFrameSeaOfGates.java | 2 +-
.../routing/metrics/DetouringAmountMetric.java | 2 +-
.../tool/routing/metrics/EvennessMetric.java | 2 +-
.../metrics/HalfPerimeterWireLengthMetric.java | 2 +-
.../tool/routing/metrics/RoutingMetric.java | 2 +-
.../routing/metrics/StackedViasAmountMetric.java | 2 +-
.../tool/routing/metrics/ViaAmountMetric.java | 2 +-
.../tool/routing/metrics/WireLengthMetric.java | 2 +-
.../tool/routing/metrics/WireQualityMetric.java | 8 +-
.../tool/routing/metrics/WiringOverflow.java | 2 +-
.../routing/seaOfGates/SeaOfGatesCellBuilder.java | 275 +-
.../tool/routing/seaOfGates/SeaOfGatesEngine.java | 5636 ++++++++++++++------
.../seaOfGates/SeaOfGatesEngineFactory.java | 6 +-
.../SeaOfGatesEngineNonoverlappingBatch.java | 26 +-
.../routing/seaOfGates/SeaOfGatesEngineOld.java | 10 +-
.../routing/seaOfGates/SeaOfGatesHandlers.java | 605 ++-
.../routing/seaOfGates/SoGWireQualityMetric.java | 42 +-
.../electric/tool/sandbox/DummyPreferences.java | 2 +-
.../tool/sandbox/DummyPreferencesFactory.java | 2 +-
com/sun/electric/tool/sandbox/EClassLoader.java | 4 +-
com/sun/electric/tool/sandbox/ESandBox.java | 4 +-
com/sun/electric/tool/sandbox/TechExplorer.java | 4 +-
.../electric/tool/sandbox/TechExplorerDriver.java | 4 +-
com/sun/electric/tool/sc/GetNetlist.java | 4 +-
com/sun/electric/tool/sc/Maker.java | 4 +-
com/sun/electric/tool/sc/Place.java | 4 +-
com/sun/electric/tool/sc/Route.java | 4 +-
com/sun/electric/tool/sc/SilComp.java | 4 +-
com/sun/electric/tool/simulation/BTreeSignal.java | 2 +-
com/sun/electric/tool/simulation/BusSample.java | 2 +-
.../electric/tool/simulation/ComplexSample.java | 2 +-
.../electric/tool/simulation/DerivedSignal.java | 2 +-
.../electric/tool/simulation/DigitalSample.java | 2 +-
com/sun/electric/tool/simulation/Engine.java | 2 +-
.../electric/tool/simulation/MutableSignal.java | 2 +-
com/sun/electric/tool/simulation/RangeSample.java | 2 +-
com/sun/electric/tool/simulation/Sample.java | 2 +-
com/sun/electric/tool/simulation/ScalarSample.java | 2 +-
com/sun/electric/tool/simulation/Signal.java | 2 +-
.../electric/tool/simulation/SignalCollection.java | 2 +-
.../electric/tool/simulation/SimulationTool.java | 54 +-
com/sun/electric/tool/simulation/Stimuli.java | 2 +-
com/sun/electric/tool/simulation/SweptSample.java | 2 +-
com/sun/electric/tool/simulation/als/ALS.java | 4 +-
com/sun/electric/tool/simulation/als/Command.java | 4 +-
com/sun/electric/tool/simulation/als/Flat.java | 4 +-
com/sun/electric/tool/simulation/als/Sim.java | 4 +-
com/sun/electric/tool/simulation/als/UserCom.java | 4 +-
.../electric/tool/simulation/interval/Diode.java | 2 +-
.../tool/simulation/interval/ExprEval.java | 2 +-
.../electric/tool/simulation/interval/RawFile.java | 2 +-
.../simulation/interval/UnivariateTaylorModel.java | 2 +-
com/sun/electric/tool/simulation/irsim/IRSIM.java | 2 +-
com/sun/electric/tool/simulation/sctiming/Arc.java | 4 +-
.../electric/tool/simulation/sctiming/LibData.java | 4 +-
.../electric/tool/simulation/sctiming/PinEdge.java | 4 +-
.../tool/simulation/sctiming/SCRunBase.java | 4 +-
.../tool/simulation/sctiming/SCSettings.java | 9 +-
.../tool/simulation/sctiming/SCTiming.java | 4 +-
.../simulation/sctiming/SCTimingException.java | 4 +-
.../electric/tool/simulation/sctiming/Table2D.java | 4 +-
.../tool/simulation/sctiming/TableData.java | 4 +-
.../tool/simulation/test/Agilent34970A.java | 2 +-
.../tool/simulation/test/Agilent34970AChannel.java | 2 +-
.../tool/simulation/test/Agilent6031A.java | 2 +-
.../tool/simulation/test/Agilent6031AChannel.java | 4 +-
.../electric/tool/simulation/test/AmpsVsVolts.java | 4 +-
com/sun/electric/tool/simulation/test/BERT.java | 4 +-
.../electric/tool/simulation/test/BitVector.java | 4 +-
.../electric/tool/simulation/test/BussedIO.java | 4 +-
.../tool/simulation/test/BypassJtagTester.java | 4 +-
.../tool/simulation/test/ChainControl.java | 4 +-
.../tool/simulation/test/ChainControlFake.java | 4 +-
com/sun/electric/tool/simulation/test/ChainG.dtd | 4 +-
com/sun/electric/tool/simulation/test/ChainG.java | 4 +-
.../electric/tool/simulation/test/ChainModel.java | 4 +-
.../electric/tool/simulation/test/ChainNode.java | 4 +-
.../tool/simulation/test/ChainNodeDuplicate.java | 4 +-
.../electric/tool/simulation/test/ChainTest.java | 4 +-
.../electric/tool/simulation/test/ChipModel.java | 4 +-
.../electric/tool/simulation/test/ChipNode.java | 4 +-
.../electric/tool/simulation/test/CompareXML.java | 4 +-
.../tool/simulation/test/CurrentReadable.java | 4 +-
.../electric/tool/simulation/test/Equipment.java | 4 +-
.../tool/simulation/test/EquipmentInterface.java | 4 +-
.../electric/tool/simulation/test/ExecProcess.java | 4 +-
com/sun/electric/tool/simulation/test/GPIB.java | 4 +-
.../electric/tool/simulation/test/HP34401A.java | 4 +-
.../electric/tool/simulation/test/HP548xxA.java | 4 +-
com/sun/electric/tool/simulation/test/HP6624A.java | 4 +-
.../tool/simulation/test/HP6624AChannel.java | 4 +-
com/sun/electric/tool/simulation/test/HP80000.java | 4 +-
com/sun/electric/tool/simulation/test/HP81250.java | 4 +-
.../electric/tool/simulation/test/HsimModel.java | 4 +-
.../electric/tool/simulation/test/IndirectSet.java | 4 +-
.../tool/simulation/test/Infrastructure.java | 4 +-
.../tool/simulation/test/JtagLogicLevel.java | 4 +-
.../simulation/test/JtagSubchainTesterModel.java | 4 +-
.../electric/tool/simulation/test/JtagTester.java | 4 +-
.../tool/simulation/test/JtagTesterModel.java | 4 +-
com/sun/electric/tool/simulation/test/Logger.java | 4 +-
.../electric/tool/simulation/test/LogicLevel.java | 4 +-
.../tool/simulation/test/LogicSettable.java | 4 +-
.../tool/simulation/test/LogicSettableArray.java | 4 +-
.../tool/simulation/test/ManualPowerChannel.java | 4 +-
.../electric/tool/simulation/test/MockJtag.java | 4 +-
.../tool/simulation/test/MyChartFrame.java | 4 +-
.../electric/tool/simulation/test/MyTreeNode.java | 4 +-
com/sun/electric/tool/simulation/test/Name.java | 4 +-
.../electric/tool/simulation/test/NanosimBERT.java | 4 +-
.../tool/simulation/test/NanosimDataAnalyzer.java | 4 +-
.../tool/simulation/test/NanosimDataGen.java | 4 +-
.../electric/tool/simulation/test/NanosimJtag.java | 4 +-
.../simulation/test/NanosimJtagSubchainTester.java | 4 +-
.../tool/simulation/test/NanosimJtagTester.java | 4 +-
.../tool/simulation/test/NanosimLogicSettable.java | 4 +-
.../tool/simulation/test/NanosimModel.java | 4 +-
com/sun/electric/tool/simulation/test/Netscan.java | 4 +-
.../electric/tool/simulation/test/Netscan4.java | 4 +-
.../tool/simulation/test/Netscan4Driver.java | 4 +-
.../electric/tool/simulation/test/Netscan4JNI.java | 4 +-
.../tool/simulation/test/NetscanGeneric.java | 4 +-
.../electric/tool/simulation/test/NetscanJNI.java | 4 +-
.../tool/simulation/test/PowerChannel.java | 4 +-
.../test/PowerChannelResistorVoltageReadable.java | 4 +-
com/sun/electric/tool/simulation/test/Pst3202.java | 4 +-
.../tool/simulation/test/Pst3202Channel.java | 4 +-
.../tool/simulation/test/ResistorCurrent.java | 4 +-
.../tool/simulation/test/SamplerControl.java | 4 +-
.../tool/simulation/test/ScanChainXML.java | 4 +-
.../electric/tool/simulation/test/Signalyzer.java | 4 +-
.../electric/tool/simulation/test/SiliconChip.java | 4 +-
.../electric/tool/simulation/test/SimpleBus.java | 2 +-
.../tool/simulation/test/SimulationModel.java | 4 +-
.../tool/simulation/test/SocketEquipment.java | 2 +-
.../tool/simulation/test/SubchainNode.java | 4 +-
com/sun/electric/tool/simulation/test/T2500.java | 4 +-
.../electric/tool/simulation/test/TestNode.java | 4 +-
.../electric/tool/simulation/test/TextUtils.java | 2 +-
.../simulation/test/VerilogJtagSubchainTester.java | 4 +-
.../tool/simulation/test/VerilogJtagTester.java | 4 +-
.../tool/simulation/test/VerilogLogicSettable.java | 4 +-
.../tool/simulation/test/VerilogModel.java | 4 +-
.../tool/simulation/test/VerilogParser.java | 4 +-
.../tool/simulation/test/VoltageReadable.java | 4 +-
com/sun/electric/tool/simulation/test/XMLIO.java | 4 +-
com/sun/electric/tool/simulation/test/f206.java | 4 +-
com/sun/electric/tool/simulation/test/package.html | 4 +-
com/sun/electric/tool/user/ActivityLogger.java | 23 +-
com/sun/electric/tool/user/CantEditException.java | 2 +-
com/sun/electric/tool/user/CellChangeJobs.java | 2 +-
com/sun/electric/tool/user/CircuitChangeJobs.java | 8 +-
com/sun/electric/tool/user/CircuitChanges.java | 17 +-
com/sun/electric/tool/user/Clipboard.java | 6 +-
com/sun/electric/tool/user/CompileVHDL.java | 4 +-
.../electric/tool/user/CompileVerilogStruct.java | 2 +-
com/sun/electric/tool/user/ErrorHighlight.java | 2 +-
com/sun/electric/tool/user/ErrorLogger.java | 14 +-
com/sun/electric/tool/user/Exec.java | 2 +-
com/sun/electric/tool/user/ExportChanges.java | 2 +-
.../electric/tool/user/GraphicsPreferences.java | 2 +-
com/sun/electric/tool/user/Highlight.java | 2 +-
.../electric/tool/user/HighlightConnectivity.java | 1271 +++++
com/sun/electric/tool/user/HighlightListener.java | 2 +-
com/sun/electric/tool/user/Highlighter.java | 104 +-
com/sun/electric/tool/user/KeyBindingManager.java | 2 +-
com/sun/electric/tool/user/MessagesStream.java | 2 +-
com/sun/electric/tool/user/NetworkHighlighter.java | 4 +-
com/sun/electric/tool/user/Resources.java | 2 +-
com/sun/electric/tool/user/User.java | 2 +-
com/sun/electric/tool/user/UserInterfaceMain.java | 2 +-
com/sun/electric/tool/user/ViewChanges.java | 2 +-
com/sun/electric/tool/user/dialogs/About.form | 2 +-
com/sun/electric/tool/user/dialogs/About.java | 4 +-
.../electric/tool/user/dialogs/AnnularRing.java | 2 +-
com/sun/electric/tool/user/dialogs/Array.java | 2 +-
.../electric/tool/user/dialogs/ArtworkLook.java | 2 +-
com/sun/electric/tool/user/dialogs/Attributes.java | 2 +-
.../tool/user/dialogs/AttributesTable.java | 2 +-
.../electric/tool/user/dialogs/BusParameters.java | 9 +-
com/sun/electric/tool/user/dialogs/CVSLog.java | 2 +-
.../electric/tool/user/dialogs/CellBrowser.java | 2 +-
com/sun/electric/tool/user/dialogs/CellLists.java | 2 +-
.../electric/tool/user/dialogs/CellProperties.java | 2 +-
com/sun/electric/tool/user/dialogs/Change.java | 4 +-
.../tool/user/dialogs/ChangeCellGroup.java | 2 +-
.../tool/user/dialogs/ChangeCurrentLib.java | 2 +-
com/sun/electric/tool/user/dialogs/ChangeText.java | 2 +-
.../tool/user/dialogs/ColorPatternPanel.java | 2 +-
.../electric/tool/user/dialogs/ComponentMenu.java | 6 +-
.../electric/tool/user/dialogs/CrossLibCopy.java | 2 +-
.../tool/user/dialogs/DesignRulesPanel.java | 2 +-
com/sun/electric/tool/user/dialogs/EDialog.java | 2 +-
.../tool/user/dialogs/EModelessDialog.java | 2 +-
.../electric/tool/user/dialogs/EditKeyBinding.java | 2 +-
.../tool/user/dialogs/EditKeyBindingConflict.java | 2 +-
.../tool/user/dialogs/EditKeyBindings.java | 2 +-
com/sun/electric/tool/user/dialogs/ExecDialog.java | 2 +-
.../electric/tool/user/dialogs/FastHenryArc.java | 2 +-
.../electric/tool/user/dialogs/FillGenDialog.java | 2 +-
com/sun/electric/tool/user/dialogs/FindText.java | 2 +-
com/sun/electric/tool/user/dialogs/GetInfoArc.java | 2 +-
.../electric/tool/user/dialogs/GetInfoExport.java | 2 +-
.../electric/tool/user/dialogs/GetInfoMulti.java | 2 +-
.../electric/tool/user/dialogs/GetInfoNode.java | 2 +-
.../electric/tool/user/dialogs/GetInfoOutline.java | 2 +-
.../electric/tool/user/dialogs/GetInfoText.java | 8 +-
.../tool/user/dialogs/LanguageScripts.java | 2 +-
.../electric/tool/user/dialogs/LayoutImage.java | 2 +-
com/sun/electric/tool/user/dialogs/LayoutText.java | 2 +-
.../tool/user/dialogs/ManipulateExports.java | 2 +-
.../tool/user/dialogs/ManipulatePorts.java | 2 +-
.../tool/user/dialogs/ModalCommandDialog.java | 2 +-
com/sun/electric/tool/user/dialogs/MoveBy.java | 2 +-
.../tool/user/dialogs/MultiFingerTransistor.java | 4 +-
com/sun/electric/tool/user/dialogs/NewCell.java | 2 +-
com/sun/electric/tool/user/dialogs/NewExport.java | 2 +-
com/sun/electric/tool/user/dialogs/OpenFile.java | 2 +-
.../tool/user/dialogs/OptionReconcile.java | 2 +-
.../tool/user/dialogs/PreferencesFrame.java | 16 +-
com/sun/electric/tool/user/dialogs/Progress.java | 2 +-
com/sun/electric/tool/user/dialogs/PromptAt.java | 4 +-
com/sun/electric/tool/user/dialogs/SavedViews.java | 2 +-
.../electric/tool/user/dialogs/SeaOfGatesCell.java | 26 +-
.../electric/tool/user/dialogs/SelectObject.java | 2 +-
com/sun/electric/tool/user/dialogs/SetFocus.java | 2 +-
.../tool/user/dialogs/SpecialProperties.java | 2 +-
com/sun/electric/tool/user/dialogs/Spread.java | 2 +-
.../tool/user/dialogs/TextAttributesPanel.java | 2 +-
.../electric/tool/user/dialogs/TextInfoPanel.java | 2 +-
.../electric/tool/user/dialogs/ViewControl.java | 2 +-
.../electric/tool/user/dialogs/WaveformZoom.java | 2 +-
.../user/dialogs/options/AddedTechnologiesTab.java | 2 +-
.../tool/user/dialogs/options/AntennaRulesTab.java | 2 +-
.../electric/tool/user/dialogs/options/CDLTab.java | 2 +-
.../electric/tool/user/dialogs/options/CIFTab.java | 2 +-
.../electric/tool/user/dialogs/options/CVSTab.java | 2 +-
.../tool/user/dialogs/options/CellModelTab.java | 2 +-
.../tool/user/dialogs/options/CompactionTab.java | 2 +-
.../user/dialogs/options/ComponentMenuTab.java | 2 +-
.../tool/user/dialogs/options/CopyrightTab.java | 2 +-
.../tool/user/dialogs/options/CoverageTab.java | 2 +-
.../electric/tool/user/dialogs/options/DEFTab.form | 14 +-
.../electric/tool/user/dialogs/options/DEFTab.java | 25 +-
.../electric/tool/user/dialogs/options/DRCTab.java | 2 +-
.../electric/tool/user/dialogs/options/DXFTab.java | 2 +-
.../tool/user/dialogs/options/DaisTab.java | 2 +-
.../tool/user/dialogs/options/DesignRulesTab.java | 2 +-
.../user/dialogs/options/DisplayControlTab.java | 2 +-
.../tool/user/dialogs/options/EDIFTab.java | 2 +-
.../tool/user/dialogs/options/FastHenryTab.java | 2 +-
.../tool/user/dialogs/options/FrameTab.java | 2 +-
.../electric/tool/user/dialogs/options/GDSTab.form | 56 +-
.../electric/tool/user/dialogs/options/GDSTab.java | 104 +-
.../tool/user/dialogs/options/GateLayGenTab.java | 2 +-
.../tool/user/dialogs/options/GeneralTab.java | 2 +-
.../tool/user/dialogs/options/GerberTab.java | 2 +-
.../user/dialogs/options/GridAndAlignmentTab.java | 2 +-
.../tool/user/dialogs/options/IconTab.java | 2 +-
.../electric/tool/user/dialogs/options/LEFTab.java | 2 +-
.../tool/user/dialogs/options/LayersTab.java | 2 +-
.../tool/user/dialogs/options/LibraryTab.java | 2 +-
.../user/dialogs/options/LogicalEffortTab.java | 2 +-
.../electric/tool/user/dialogs/options/NCCTab.java | 2 +-
.../tool/user/dialogs/options/NetworkTab.java | 2 +-
.../tool/user/dialogs/options/NewArcsTab.java | 2 +-
.../tool/user/dialogs/options/NewNodesTab.java | 2 +-
.../tool/user/dialogs/options/ParasiticTab.java | 2 +-
.../tool/user/dialogs/options/PlacementTab.java | 2 +-
.../user/dialogs/options/PortsAndExportsTab.java | 2 +-
.../tool/user/dialogs/options/PreferencePanel.java | 2 +-
.../tool/user/dialogs/options/PrintingTab.java | 2 +-
.../user/dialogs/options/ProjectManagementTab.java | 2 +-
.../tool/user/dialogs/options/RoutingTab.java | 2 +-
.../electric/tool/user/dialogs/options/SUETab.java | 2 +-
.../electric/tool/user/dialogs/options/SVGTab.java | 2 +-
.../tool/user/dialogs/options/ScaleTab.java | 2 +-
.../tool/user/dialogs/options/SelectionTab.java | 4 +-
.../user/dialogs/options/SiliconCompilerTab.java | 2 +-
.../tool/user/dialogs/options/SimulatorsTab.java | 2 +-
.../tool/user/dialogs/options/SkillTab.java | 2 +-
.../tool/user/dialogs/options/SmartTextTab.java | 2 +-
.../tool/user/dialogs/options/SpiceTab.java | 2 +-
.../tool/user/dialogs/options/SunRouterTab.java | 2 +-
.../tool/user/dialogs/options/TechnologyTab.java | 2 +-
.../tool/user/dialogs/options/TextTab.java | 2 +-
.../tool/user/dialogs/options/ThreeDTab.java | 2 +-
.../tool/user/dialogs/options/ToolbarTab.java | 42 +-
.../tool/user/dialogs/options/UnitsTab.java | 2 +-
.../tool/user/dialogs/options/VerilogTab.java | 2 +-
.../tool/user/dialogs/options/WellCheckTab.java | 2 +-
com/sun/electric/tool/user/help/ManualViewer.java | 2 +-
.../tool/user/help/helphtml/chap01-03.html | 19 +-
.../tool/user/help/helphtml/chap01-04-01.html | 9 +-
.../tool/user/help/helphtml/chap01-04-02.html | 2 +-
.../tool/user/help/helphtml/chap01-04-03.html | 36 +-
.../tool/user/help/helphtml/chap01-04-04.html | 8 +-
.../tool/user/help/helphtml/chap01-04-05.html | 4 +-
.../tool/user/help/helphtml/chap01-05.html | 8 +-
.../tool/user/help/helphtml/chap01-09.html | 2 +-
.../tool/user/help/helphtml/chap01-10-07.html | 2 +-
.../tool/user/help/helphtml/chap01-12-03.html | 1 +
.../tool/user/help/helphtml/chap01-12-04.html | 1 +
.../tool/user/help/helphtml/chap02-01-01.html | 3 +
.../tool/user/help/helphtml/chap03-05.html | 3 +-
.../tool/user/help/helphtml/chap03-08.html | 1 +
.../tool/user/help/helphtml/chap03-09-03.html | 8 +
.../tool/user/help/helphtml/chap04-07-04.html | 1 +
.../tool/user/help/helphtml/chap06-08-01.html | 7 +-
.../tool/user/help/helphtml/chap06-09-01.html | 19 +-
.../tool/user/help/helphtml/chap06-11.html | 9 +-
.../tool/user/help/helphtml/chap07-01-01.html | 3 +
.../tool/user/help/helphtml/chap07-03-03.html | 24 +-
.../tool/user/help/helphtml/chap07-03-05.html | 5 +
.../tool/user/help/helphtml/chap08-04.html | 1 +
.../tool/user/help/helphtml/chap08-10.html | 15 +-
.../electric/tool/user/help/helphtml/fig01-27.png | Bin 26271 -> 26119 bytes
.../electric/tool/user/help/helphtml/fig01-34.png | Bin 6563 -> 6593 bytes
.../electric/tool/user/help/helphtml/fig02-14.png | Bin 8088 -> 7902 bytes
.../electric/tool/user/help/helphtml/fig07-07.png | Bin 22589 -> 24237 bytes
.../electric/tool/user/help/helphtml/fig07-27.png | Bin 58499 -> 61720 bytes
.../electric/tool/user/help/helphtml/fig09-49.png | Bin 44927 -> 40855 bytes
.../tool/user/help/helphtml/floatingGates.jelib | 6 +-
.../electric/tool/user/help/helphtml/samples.jelib | 555 +-
.../electric/tool/user/help/helphtml/title.html | 9 +-
com/sun/electric/tool/user/help/helphtml/toc.txt | 6 +-
com/sun/electric/tool/user/menus/CellMenu.java | 50 +-
com/sun/electric/tool/user/menus/EMenu.java | 2 +-
com/sun/electric/tool/user/menus/EMenuBar.java | 2 +-
com/sun/electric/tool/user/menus/EMenuItem.java | 2 +-
com/sun/electric/tool/user/menus/EditMenu.java | 113 +-
com/sun/electric/tool/user/menus/ExportMenu.java | 2 +-
com/sun/electric/tool/user/menus/FileMenu.java | 15 +-
com/sun/electric/tool/user/menus/HelpMenu.java | 2 +-
com/sun/electric/tool/user/menus/MenuCommands.java | 23 +-
.../electric/tool/user/menus/PublicDebugMenu.java | 2 +-
com/sun/electric/tool/user/menus/ToolMenu.java | 9 +-
com/sun/electric/tool/user/menus/ViewMenu.java | 2 +-
com/sun/electric/tool/user/menus/WindowMenu.java | 4 +-
.../electric/tool/user/ncc/ComparisonsPane.java | 2 +-
.../electric/tool/user/ncc/ComparisonsTree.java | 2 +-
.../tool/user/ncc/EquivClassSplitPane.java | 2 +-
.../tool/user/ncc/ExportAssertionFailures.java | 2 +-
.../tool/user/ncc/ExportAssertionTable.java | 2 +-
com/sun/electric/tool/user/ncc/ExportConflict.java | 2 +-
.../tool/user/ncc/ExportConflictTable.java | 2 +-
com/sun/electric/tool/user/ncc/ExportMismatch.java | 2 +-
.../tool/user/ncc/ExportMismatchTable.java | 2 +-
com/sun/electric/tool/user/ncc/ExportTable.java | 2 +-
.../tool/user/ncc/HighlightEquivalent.java | 2 +-
com/sun/electric/tool/user/ncc/HighlightTools.java | 2 +-
com/sun/electric/tool/user/ncc/NccGuiInfo.java | 2 +-
com/sun/electric/tool/user/ncc/NccMsgsFrame.java | 2 +-
.../electric/tool/user/ncc/SizeMismatchPane.java | 2 +-
.../electric/tool/user/ncc/UnrecognizedPart.java | 2 +-
.../tool/user/ncc/UnrecognizedPartTable.java | 2 +-
.../tool/user/projectSettings/ProjSettings.java | 14 +-
.../user/projectSettings/ProjSettingsNode.java | 2 +-
.../tool/user/redisplay/AbstractDrawing.java | 2 +-
.../tool/user/redisplay/AbstractLayerDrawing.java | 2 +-
.../electric/tool/user/redisplay/AlphaBlender.java | 2 +-
com/sun/electric/tool/user/redisplay/ERaster.java | 2 +-
.../EmptyPatternedOutlinedTransparentRaster.java | 2 +-
.../electric/tool/user/redisplay/LayerDrawing.java | 2 +-
.../electric/tool/user/redisplay/OpaqueRaster.java | 2 +-
.../user/redisplay/PatternedTransparentRaster.java | 2 +-
.../electric/tool/user/redisplay/PixelDrawing.java | 2 +-
.../tool/user/redisplay/TransparentRaster.java | 2 +-
.../electric/tool/user/redisplay/VectorCache.java | 2 +-
.../tool/user/redisplay/VectorDrawing.java | 2 +-
com/sun/electric/tool/user/tecEdit/ArcInfo.java | 4 +-
com/sun/electric/tool/user/tecEdit/Example.java | 4 +-
.../electric/tool/user/tecEdit/GeneralInfo.java | 4 +-
com/sun/electric/tool/user/tecEdit/Info.java | 4 +-
com/sun/electric/tool/user/tecEdit/LayerInfo.java | 4 +-
com/sun/electric/tool/user/tecEdit/LibToTech.java | 8 +-
com/sun/electric/tool/user/tecEdit/Manipulate.java | 4 +-
com/sun/electric/tool/user/tecEdit/NodeInfo.java | 4 +-
com/sun/electric/tool/user/tecEdit/Sample.java | 4 +-
.../tool/user/tecEdit/TechConversionResult.java | 4 +-
com/sun/electric/tool/user/tecEdit/TechToLib.java | 4 +-
.../electric/tool/user/tecEditWizard/Active.java | 2 +-
.../electric/tool/user/tecEditWizard/Antenna.java | 2 +-
.../electric/tool/user/tecEditWizard/Contact.java | 2 +-
com/sun/electric/tool/user/tecEditWizard/GDS.java | 2 +-
com/sun/electric/tool/user/tecEditWizard/Gate.java | 2 +-
.../electric/tool/user/tecEditWizard/General.java | 2 +-
.../electric/tool/user/tecEditWizard/Metal.java | 2 +-
com/sun/electric/tool/user/tecEditWizard/Poly.java | 2 +-
.../tool/user/tecEditWizard/TechEditWizard.java | 2 +-
.../user/tecEditWizard/TechEditWizardData.java | 26 +-
.../user/tecEditWizard/TechEditWizardPanel.java | 2 +-
com/sun/electric/tool/user/tecEditWizard/Via.java | 2 +-
.../tool/user/tecEditWizard/WellImplant.java | 2 +-
.../tool/user/tecEditWizard/WizardField.java | 2 +-
.../electric/tool/user/tecEditWizard2/Antenna.java | 2 +-
com/sun/electric/tool/user/tecEditWizard2/GDS.java | 2 +-
.../electric/tool/user/tecEditWizard2/General.java | 2 +-
.../tool/user/tecEditWizard2/GenericPanel.java | 2 +-
.../electric/tool/user/tecEditWizard2/Metal.java | 2 +-
.../tool/user/tecEditWizard2/TechEditWizard.java | 2 +-
.../user/tecEditWizard2/TechEditWizardData.java | 28 +-
.../user/tecEditWizard2/TechEditWizardPanel.java | 2 +-
com/sun/electric/tool/user/tecEditWizard2/Via.java | 2 +-
.../tool/user/tecEditWizard2/WizardField.java | 2 +-
.../user/tests/AbstractGUITest.java} | 30 +-
com/sun/electric/tool/user/tests/AbstractTest.java | 582 ++
.../tool/user/tests/CommonSignalAnalysisTest.java | 159 +
.../electric/tool/user/tests/CompactionTest.java | 123 +
com/sun/electric/tool/user/tests/DRCTest.java | 414 ++
com/sun/electric/tool/user/tests/ERCTest.java | 174 +
.../tool/user/tests/ExportForeignTest.java | 483 ++
.../electric/tool/user/tests/ExtractionTest.java | 159 +
com/sun/electric/tool/user/tests/FakeTestJob.java | 202 +
.../electric/tool/user/tests/GenerationTest.java | 606 +++
com/sun/electric/tool/user/tests/IOTest.java | 131 +
.../tool/user/tests/ImportForeignTest.java | 509 ++
com/sun/electric/tool/user/tests/JobsTest.java | 230 +
.../tool/user/tests/LayerCoverageToolTest.java | 391 ++
.../tool/user/tests/LogicalEffortTest.java | 147 +
.../tool/user/tests/MakeFakeCircuitry.java | 263 +
com/sun/electric/tool/user/tests/NCCTest.java | 480 ++
.../tool/user/tests/PlacementParameterSetter.java | 125 +
.../electric/tool/user/tests/PlacementTest.java | 199 +
com/sun/electric/tool/user/tests/PrefTest.java | 266 +
com/sun/electric/tool/user/tests/RoutingTest.java | 416 ++
.../electric/tool/user/tests/ScriptingTest.java | 111 +
.../tool/user/tests/TechnologyEditTest.java | 738 +++
.../electric/tool/user/tests/TechnologyTest.java | 333 ++
com/sun/electric/tool/user/tests/TestMenu.java | 196 +
com/sun/electric/tool/user/tests/TestTab.form | 66 +
com/sun/electric/tool/user/tests/TestTab.java | 121 +
.../tool/user/tests/TimingAnalysisTest.java | 207 +
com/sun/electric/tool/user/tests/WaveformTest.java | 616 +++
.../tool/user/ui/ClickZoomWireListener.java | 2 +-
com/sun/electric/tool/user/ui/CurveListener.java | 2 +-
com/sun/electric/tool/user/ui/EditWindow.java | 8 +-
.../tool/user/ui/EditWindowFocusBrowser.java | 2 +-
com/sun/electric/tool/user/ui/ElectricPrinter.java | 2 +-
com/sun/electric/tool/user/ui/ErrorLoggerTree.java | 6 +-
com/sun/electric/tool/user/ui/ExplorerTree.java | 4 +-
.../electric/tool/user/ui/ExplorerTreeModel.java | 2 +-
com/sun/electric/tool/user/ui/ExternalEditing.java | 10 +-
.../tool/user/ui/InvisibleLayerConfiguration.java | 2 +-
com/sun/electric/tool/user/ui/JobTree.java | 2 +-
com/sun/electric/tool/user/ui/KeyBindings.java | 4 +-
com/sun/electric/tool/user/ui/KeyStrokePair.java | 2 +-
com/sun/electric/tool/user/ui/LayerTab.java | 2 +-
com/sun/electric/tool/user/ui/LayerVisibility.java | 2 +-
com/sun/electric/tool/user/ui/LibraryPalette.java | 2 +-
com/sun/electric/tool/user/ui/MeasureListener.java | 287 +-
com/sun/electric/tool/user/ui/MessagesWindow.java | 2 +-
com/sun/electric/tool/user/ui/OutlineListener.java | 2 +-
com/sun/electric/tool/user/ui/PaletteFrame.java | 2 +-
com/sun/electric/tool/user/ui/RoutingDebug.java | 361 +-
com/sun/electric/tool/user/ui/SizeListener.java | 2 +-
com/sun/electric/tool/user/ui/StatusBar.java | 2 +-
com/sun/electric/tool/user/ui/TechPalette.java | 2 +-
com/sun/electric/tool/user/ui/TextWindow.java | 2 +-
com/sun/electric/tool/user/ui/ToolBar.java | 2 +-
com/sun/electric/tool/user/ui/ToolBarButton.java | 2 +-
com/sun/electric/tool/user/ui/TopLevel.java | 2 +-
com/sun/electric/tool/user/ui/Util.java | 2 +-
com/sun/electric/tool/user/ui/WindowContent.java | 2 +-
.../electric/tool/user/ui/WindowContextClass.java | 2 +-
com/sun/electric/tool/user/ui/WindowFrame.java | 2 +-
.../electric/tool/user/ui/ZoomAndPanListener.java | 2 +-
.../electric/tool/user/waveform/DragButton.java | 2 +-
.../electric/tool/user/waveform/HorizRuler.java | 2 +-
com/sun/electric/tool/user/waveform/Panel.java | 2 +-
com/sun/electric/tool/user/waveform/StepSize.java | 2 +-
.../electric/tool/user/waveform/SweepSignal.java | 2 +-
.../electric/tool/user/waveform/WaveSignal.java | 2 +-
.../tool/user/waveform/WaveformWindow.java | 2 +-
.../electric/tool/util/concurrent/Parallel.java | 2 +-
.../tool/util/concurrent/barriers/Barrier.java | 2 +-
.../util/concurrent/barriers/SenseBarrier.java | 2 +-
.../util/concurrent/barriers/SimpleTDBarrier.java | 2 +-
.../tool/util/concurrent/barriers/TDBarrier.java | 2 +-
.../util/concurrent/datastructures/BDEQueue.java | 2 +-
.../concurrent/datastructures/BDEQueueWrapper.java | 2 +-
.../concurrent/datastructures/CircularArray.java | 2 +-
.../concurrent/datastructures/DEListWrapper.java | 2 +-
.../util/concurrent/datastructures/FCQueue.java | 2 +-
.../concurrent/datastructures/IDEStructure.java | 2 +-
.../util/concurrent/datastructures/IStructure.java | 2 +-
.../concurrent/datastructures/IWorkStealing.java | 2 +-
.../datastructures/JavaQueueWrapper.java | 2 +-
.../concurrent/datastructures/LockFreeQueue.java | 2 +-
.../datastructures/LockFreeSkipList.java | 2 +-
.../concurrent/datastructures/LockFreeStack.java | 2 +-
.../datastructures/MultipleQueuesStructure.java | 2 +-
.../datastructures/UnboundedDEQueue.java | 2 +-
.../datastructures/WorkSharingStructure.java | 2 +-
.../datastructures/WorkStealingStructure.java | 2 +-
.../electric/tool/util/concurrent/debug/Debug.java | 2 +-
.../tool/util/concurrent/debug/IDebug.java | 2 +-
.../tool/util/concurrent/debug/LoadBalancing.java | 2 +-
.../tool/util/concurrent/debug/StealTracker.java | 2 +-
.../concurrent/exceptions/PoolExistsException.java | 2 +-
.../exceptions/PoolNotInitializedException.java | 2 +-
.../tool/util/concurrent/patterns/PForJob.java | 2 +-
.../tool/util/concurrent/patterns/PForTask.java | 2 +-
.../tool/util/concurrent/patterns/PJob.java | 2 +-
.../tool/util/concurrent/patterns/PReduceJob.java | 2 +-
.../tool/util/concurrent/patterns/PTask.java | 2 +-
.../tool/util/concurrent/patterns/PWhileJob.java | 2 +-
.../tool/util/concurrent/patterns/Pipeline.java | 2 +-
.../runtime/MultiThreadedRandomizer.java | 2 +-
.../tool/util/concurrent/runtime/Scheduler.java | 2 +-
.../tool/util/concurrent/runtime/ThreadID.java | 2 +-
.../util/concurrent/runtime/WorkerStrategy.java | 2 +-
.../runtime/pipeline/PipelineRuntime.java | 2 +-
.../runtime/pipeline/PipelineWorkerStrategy.java | 2 +-
.../runtime/pipeline/SimplePipelineWorker.java | 2 +-
.../runtime/taskParallel/IThreadPool.java | 2 +-
.../runtime/taskParallel/PoolWorkerStrategy.java | 2 +-
.../runtime/taskParallel/SimpleWorker.java | 2 +-
.../runtime/taskParallel/SynchronizedWorker.java | 2 +-
.../runtime/taskParallel/ThreadPool.java | 2 +-
...alaForkJoin.java => ThreadPoolJdkForkJoin.java} | 20 +-
.../tool/util/concurrent/utils/BlockedRange.java | 2 +-
.../tool/util/concurrent/utils/BlockedRange1D.java | 2 +-
.../tool/util/concurrent/utils/BlockedRange2D.java | 2 +-
.../utils/ConcurrentCollectionFactory.java | 2 +-
.../tool/util/concurrent/utils/EmptyException.java | 2 +-
.../tool/util/concurrent/utils/FullException.java | 2 +-
.../electric/tool/util/concurrent/utils/Range.java | 2 +-
com/sun/electric/util/ArgumentsParser.java | 2 +-
com/sun/electric/util/BaseProperties.java | 2 +-
com/sun/electric/util/ClientOS.java | 144 +-
com/sun/electric/util/CollectionFactory.java | 2 +-
com/sun/electric/util/ElapseTimer.java | 2 +-
com/sun/electric/util/JavaCompatiblity.java | 4 +-
com/sun/electric/util/PropertiesUtils.java | 2 +-
com/sun/electric/util/TextUtils.java | 2 +-
com/sun/electric/util/UniqueIDGenerator.java | 2 +-
.../electric/util/collections/ArrayIterator.java | 4 +-
.../util/collections/ImmutableArrayList.java | 4 +-
.../electric/util/collections/ImmutableList.java | 2 +-
.../electric/util/collections/ImmutableList2.java | 2 +-
.../electric/util/collections/WeakReferences.java | 4 +-
com/sun/electric/util/io/CSVFile.java | 2 +-
com/sun/electric/util/io/input/CSVInput.java | 2 +-
com/sun/electric/util/io/output/CSVWriter.java | 2 +-
com/sun/electric/util/math/AbstractFixpPoint.java | 4 +-
.../electric/util/math/AbstractFixpRectangle.java | 4 +-
com/sun/electric/util/math/DBMath.java | 2 +-
com/sun/electric/util/math/ECoord.java | 4 +-
com/sun/electric/util/math/EDimension.java | 2 +-
com/sun/electric/util/math/FixpCoord.java | 4 +-
com/sun/electric/util/math/FixpRectangle.java | 4 +-
com/sun/electric/util/math/FixpTransform.java | 4 +-
com/sun/electric/util/math/GenMath.java | 2 +-
com/sun/electric/util/math/MutableBoolean.java | 2 +-
com/sun/electric/util/math/MutableDouble.java | 2 +-
com/sun/electric/util/math/MutableInteger.java | 2 +-
com/sun/electric/util/math/MutableInterval.java | 2 +-
com/sun/electric/util/math/MutableLong.java | 2 +-
com/sun/electric/util/math/Orientation.java | 2 +-
com/sun/electric/util/memory/Memory.java | 2 +-
com/sun/electric/util/memory/MemoryUsage.java | 2 +-
com/sun/electric/util/memory/ObjSize.java | 4 +-
com/sun/electric/util/test/TestByReflection.java | 2 +-
com/sun/electric/util/test/TestHelpers.java | 2 +-
1544 files changed, 27472 insertions(+), 6312 deletions(-)
diff --git a/ChangeLog.txt b/ChangeLog.txt
index 5ae241c..a3a22ae 100644
--- a/ChangeLog.txt
+++ b/ChangeLog.txt
@@ -2,8 +2,279 @@
NOTE: Please place changes under the version that will be released next.
+************************* Version 9.07: ******************************
+
+BUG: (8/4/16, SMR) Cell extraction does not work on schematics.
+FIX: Disabled feature for schematics.
+
+IMP: (4/3/16, SMR) ^K now notices pure-layer node cells and analyzes topology (Bug #7659).
+
+BUG: (3/29/16, SMR) PNG output uses the wrong colors (Bug #7605).
+FIX: In EditWindow.getPrintImageFromData() allow for full display colors.
+
+BUG: (3/25/16, SMR) GDS import with cadence-compatibility may crash (Bug #7597).
+FIX: Accept pins on nodes with no pure-layer equivalent.
+
+IMP: (3/22/16, SMR) Added "File / Export / Flattened Rectangles" to write generalized rectangles (Bug #7592).
+
+IMP: (3/22/16, SMR) Added "Edit / Text / Add HV GDS Text" to write to GDS on High V layer (Bug #7589).
+
+IMP: (3/17/16, SMR) Added internal script (Bug #7582).
+
+BUG: (3/11/16, SMR) "Edit / Technology Editing / Edit Component Menu..." crashes (Bug #7572).
+FIX: In ComponentMenu.java, inside method showTechnology(), handle tech==null
+
+BUG: (3/3/16, SMR) "Down Hierarchy In Place To Object" eliminates duplicates in a cell (Bug #7558).
+FIX: In CellMenu.downHierInPlaceToObject(), do not eliminate duplicate cells.
+
+IMP: (2/29/16, DN) Update Scala version to 2.11.7.
+
+IMP: (2/16/16, SMR) Now have "Edit / Selection / Select Object Under Cursor"
+ to show popup of possible objects to select (Bug #7531).
+
+IMP: (1/21/16, SMR) Regressions need to use public data (Bug #7494).
+
+BUG: (1/14/16, SMR) Thin film capacitors not NCCing (Bug #7483).
+FIX: Set port connectivity to different values.
+
+IMP: (12/16/15, SMR) GDS export now lets you control both units values (Bug #7436).
+
+IMP: (12/15/15, SMR) Added carbon nanotube technology (Bug #7437).
+
+IMP: (12/15/15, SMR) GDS now has precision boost for export (Bug #7436).
+
+BUG: (12/8/15, SMR) Language scripts cannot be tied to toolbar (Bug #7419)
+FIX: In ToolbarTab.addMenu(), extra code includes language scripts.
+
+IMP: (11/11/15, SMR) Vias now have multiple mask colors (Bug #7387).
+
+IMP: (11/4/15, SMR) GDS import can now dump readable data (Bug #7379).
+
+IMP: (11/2/15, SMR) DEF import can now connect all pins (Bug #7376).
+
+IMP: (10/14/15, SMR) Have reflection-based design rules for router (Bug #7351).
+
+BUG: (10/7/15, SMR) Measure mode needs to snap to objects (Bug #7340).
+FIX: Now snaps when shift key is held.
+
+BUG: (9/25/15, SMR) Need to handle diagonal via rules (Bug #7056).
+FIX: Handles 3 and 4 vias in a row.
+
+BUG: (9/10/15, SMR) GDS export needs to represent small values (Bug #7311).
+FIX: Can now adjust to values smaller than a nanometer.
+
+************************* Version 9.07-g: ******************************
+
+BUG: (9/10/15, SMR) GDS import Cadence-compatibility should adjust export size (Bug #7302).
+FIX: Does this now.
+
+************************* Version 9.07-f: ******************************
+
+BUG: (8/26/15, SMR) Antenna check misses errors (Bug #7269).
+FIX: User's fix added to followNode().
+
+BUG: (8/25/15, GVG) Regression not longer compiling (Bug #7267).
+FIX: Fixed some links in regression machine.
+
+IMP: (8/24/15, GVG) Telesis: order of elements listed in headers is not
+deterministic (Bug 6705).
+Subcell names are sorted before writing them.
+
+BUG: (8/24/15, GVG) ArrayIndexOutOfBoundsException in Telesis (Bug #7144).
+FIX: Not ignoring ports if they are not being matched.
+
+************************* Version 9.07-e: ******************************
+
+BUG: (8/21/15, SMR) SOG crashes in min-area computation (Bug #7254).
+FIX: Handle case where two contacts not found.
+
+BUG: (8/21/15, SMR) SOG spine taps are wrong (Bug #7231).
+FIX: Used tap from wrong cell.
+
+BUG: (8/19/15, SMR) SOG needs mutable database interface (Bug #7247).
+FIX: New Handler written.
+
+BUG: (8/18/15, SMR) SOG fails to route spine taps in standalone mode (Bug #7231).
+FIX: Must use pure-layer nodes for spine taps.
+
+IMP: (8/17/15, GVG) SoG: sorting by bus connectivity (Bug #7236)
+Descending order in terms of # of connections.
+
+IMP: (8/14/15, GVG) SoG: sorting by bus connectivity (Bug #7236).
+Preliminary code
+
+IMP: (8/14/15, GVG) GDS Export and latest technology (Bug #7235).
+
+BUG: (8/13/15, SMR) SOG taper calculations wrong (Bug #7230).
+FIX: Fixed arc width calculation.
+
+BUG: (8/10/15, SMR) SOG statistics wrong when already-routed segments ignored (Bug #7221).
+FIX: Adjust quality metrics to handle it.
+
+BUG: (8/10/15, GVG) NPE while editing empty document with external editor (Bug #7222)
+FIX: Detect if doc has no lines.
+
+************************* Version 9.07-d: ******************************
+
+BUG: (8/7/15, SMR) SOG taper conditions applied improperly (Bug #7213).
+FIX: Fixed numeric instability.
+
+IMP: (8/7/15, SMR) SOG debugger now explains taper limits (Bug #7213).
+
+BUG: (8/6/15, SMR) SOG min area detects spurious notches (Bug #7210).
+FIX: Ignore notches to previous geometry when doing min-area.
+
+BUG: (8/5/15, GVG) SoG: net sorting desc/asc swapped (Bug #7207).
+FIX: Order fixed.
+
+************************* Version 9.07-c: ******************************
+
+BUG: (8/4/15, SMR) SOG spine detection drops outlying ports (Bug #7202).
+FIX: Find outliers and connect them.
+
+BUG: (8/3/15, SMR) Distance moved is printed badly (Bug #7201).
+FIX: Use "formatDistance()".
+
+BUG: (8/3/15, SMR) "Routing mode" cursor cannot be removed (Bug #7200).
+FIX: Changed order of setting modes.
+
+BUG: (8/3/15, SMR) SOG min area is restrictive and can fail (Bug #7195).
+FIX: Allow min area geometry to move and split.
+
+IMP: (7/31/15, GVG) java.lang.ClassNotFoundException not caught in makeExtraMenu() (Bug #7196).
+This is relevant for EricC's changes.
+
+************************* Version 9.07-b: ******************************
+
+IMP: (7/30/15, GVG) 3 new layers for latest tech (Bug #7191).
+Modified pattern associated to existing layer.
+
+BUG: (7/30/15, SMR) SOG reduces contacts incorrectly (Bug #7190).
+FIX: Remove contact resizing.
+
+BUG: (7/29/15, SMR) SOG min area computation wrong at final leg of route (Bug #7181).
+FIX: Use proper coordinates for min area computation.
+
+BUG: (7/28/15, SMR) Multiline text cannot have leading spaces (Bug #7183).
+FIX: Now allow that.
+
+BUG: (7/28/15, SMR) SOG doesn't get right min-area for final piece of route (Bug #7131)
+FIX: Now examines correct metal layer.
+
+IMP: (7/27/15, GVG) SoG: ability to sort nets to route based on their lengths (Bug #7119)
+Adding SoGNetOrder.SOGNETORDERORIGINAL
+
+BUG: (7/15/15, SMR) GNU user reports bias port bug (Bug #7157).
+FIX: Implemented user's patch.
+
+BUG: (7/10/15, SMR) SOG fails to connect spine taps in stand-alone mode (Bug #7123).
+FIX: Use proper cell to find taps.
+
+BUG: (7/10/15, SMR) SOG flags geometry illegal even if it is covered by legal geometry (Bug #7136).
+FIX: Allow such cases.
+
+BUG: (7/9/15, GVG) ArrayIndexOutOfBoundsException in Telesis (Bug #7144)
+FIX: Detecting when the NetBusMatching structure doesn't match in size with current net index
+
+IMP: (7/2/15, GVG) Add Antenna DRC menu to latest 40nm tech (Bug #7124)
+
+IMP: (7/2/15, SMR) Created initial text/graphics unification system (Bug #7122).
+
+IMP: (7/1/15, GVG) Adding via spacing rule to latest technology.
+
+IMP: (7/1/15, GVG) SoG: ability to sort nets to route based on their lengths (Bug #7119).
+
+IMP: (7/1/15, GVG) Adding new MST code for routing (Bug #7117).
+
+BUG: (7/1/15, SMR) SOG spine detection failed (Bug #7115).
+FIX: Handle non-spine networks better.
+
+BUG: (6/29/15, SMR) SOG needs advanced spine detection for complex routes (Bug #7111).
+FIX: Initial code written.
+
************************* Version 9.07-a: ******************************
+IMP: (6/25/15, GVG) X and Y M4 spacing values were changed for smallest private tech used
+by standalone tool.
+
+IMP: (6/25/15, GVG) SoG: enable G0 rules (Bug #7056).
+Adding GOCPL for rule definition associated to multiple layers.
+
+BUG: (6/24/15, SMR) SOG min area omitted in obscure wavefront merging situation (Bug #7103).
+FIX: Insert min area properly.
+
+BUG: (6/24/15, SMR) SOG allows layer switching that is off-grid (Bug #7099).
+FIX: Prevent this when gridding is forced.
+
+BUG: (6/23/15, SMR) SOG still fails min area when merging wavefronts (Bug #7101).
+FIX: Finds areas better.
+
+BUG: (6/23/15, GVG) SoG: GUI v/s standalone (Bug #7089).
+FIX: Adding printout of SoG preferences in standalone version for debugging purposes.
+
+BUG: (6/23/15, SMR) SOG places pins that are too big (Bug #7093).
+FIX: Use proper arc widths for pins.
+
+BUG: (6/23/15, SMR) SOG needs to add more min area when merging wavefronts (Bug #7098).
+FIX: Now adds them.
+
+IMP: (6/23/15, GVG) SoG: enable G0 rules (Bug #7056).
+Adding GOCPL for rule definition.
+
+BUG: (6/22/15, SMR) ERC well check runs too long (Bug #6528).
+FIX: Improved efficiency.
+
+BUG: (6/22/15, SMR) Merging two wavefronts fails to check for min area (Bug #7091).
+FIX: Now consider min area check.
+
+BUG: (6/18/15. GVG) IllegalArgumentException due to long preference name (Bug #7092)
+FIX: Detect if length of Preference key is > Preferences.MAX_KEY_LENGTH. Skip save in that case.
+
+BUG: (6/18/15, SMR) SOG chooses wrong mask color when shifting from disallowed layers (Bug #7087).
+FIX: Choose right color.
+
+BUG: (6/17/15, SMR) SOG doesn't find min-area on stacked vias and at end of route (Bugs #7060 and #7063)
+FIX: Better min area computation and added it at end of route.
+
+BUG: (6/17/15, GVG) SoG: 1x routing overlaps with 2X one (Bug #7038)
+FIX: Detecting now orientation to determine which axis should be modified.
+
+BUG: (6/17/15, GVG) SoG: 1x routing overlaps with 2X one (Bug #7038)
+FIX: Undoing changes since this fix is causing Bug #7083
+
+IMP: (6/15/15, SMR) SOG gives better error when it cannot place a contact (Bug #7076).
+
+BUG: (6/15/15, GVG) SoG: NPE in SOGNetID.updateNetID (Bug #7071).
+FIX: More changes.
+
+BUG: (6/15/15, GVG) SoG: ConcurrentModificationException while resizing pins (Bug #7070).
+FIX: Doing modifications at the end.
+
+BUG: (6/15/15, GVG) SoG: NPE in external DRC call if input data can't be read (Bug #7069).
+FIX: Detecting the case now.
+
+BUG: (6/11/15, SMR) SOG lets cuts be too close (Bug #7059).
+FIX: Check via spacing when merging two wavefronts.
+
+BUG: (6/11/15, GVG) SoG: 1x routing overlaps with 2X one (Bug #7038)
+FIX: Detecting if pins in subcells should be resized as well during the color change
+
+BUG: (6/10/15, SMR) Verilog reverses bus ordering according to Network preferences (Bug #7015).
+FIX: In Topology.doGetNetworks(), Examine export names to determine ordering.
+
+BUG: (6/9/15, DN) MimicStitch: IllegalArgumentException (Bug #7055)
+FIX: One more fix on mimic stitch issue
+
+IMP: (6/9/15, DN) Use Jdk7 ForkJoin instead of Scala ForkJoin .
+
+BUG: (6/9/15, DN) Mimic stitch issue (Bug #7023)
+FIX: Use Names of bus port elements in Netlist.sameNet .
+
+IMP: (6/5/15, GVG) SoG: logging execution time (Bug #7046)
+
+IMP: (6/5/15, GVG) SoG: ability to generate full gds from tool for
+DRC checking (Bug #7045)
+
************************* END OF Version 9.06, GNU RELEASE *************
************************* Version 9.06-z: ******************************
@@ -535,7 +806,7 @@ FIX: Use DBMath.areEquals() for comparisons
BUG: (12/19/14, GVG) SoG: investigate export size mismatch (Bug #6600)
FIX: Fixed pin sizes in technology file.
-IMP/MAN: (12/12/14, GVG) XML technology: allow definition of multiple layers
+IMP: (12/12/14, GVG) XML technology: allow definition of multiple layers
with same width and spacing rules (Bug #6434)
IMP: (12/12/14, GVG) SoG: Store track info for metals that don't offer
diff --git a/README.txt b/README.txt
index 1804423..8cf8fe2 100644
--- a/README.txt
+++ b/README.txt
@@ -1,4 +1,4 @@
----------------- This is Electric, Version 9.06 ----------------
+---------------- This is Electric, Version 9.07 ----------------
Electric is written in the Java programming language and is distributed in a
single ".jar" file. There are two variations on the ".jar" file:
@@ -55,8 +55,7 @@ to enhance the system's functionality. Currently, these plug-ins are available:
> Animation
Another extra that can be added to the 3D facility is 3D animation. This requires
the Java Media Framework (JMF) and extra animation code. The Java Media Framework is
- available from Sun Microsystems at java.sun.com/products/java-media/jmf (this is not
- a plugin: it is an enhancement to your Java installation).
+ available from Oracle (this is not a plugin: it is an enhancement to your Java installation).
> Russian User's Manual
An earlier version of the user's manual (8.02) has been translated into Russian.
diff --git a/build.xml b/build.xml
index 2d5b1a9..88371c8 100644
--- a/build.xml
+++ b/build.xml
@@ -6,7 +6,7 @@
<!-- File: build.xml -->
-<!-- Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. -->
+<!-- Copyright (c) 2012, Static Free Software. All rights reserved. -->
<!-- Electric(tm) is free software; you can redistribute it and/or modify -->
<!-- it under the terms of the GNU General Public License as published by -->
diff --git a/com/sun/electric/Launcher.java b/com/sun/electric/Launcher.java
index aeb26d9..597e9ed 100644
--- a/com/sun/electric/Launcher.java
+++ b/com/sun/electric/Launcher.java
@@ -4,7 +4,7 @@
*
* File: Launcher.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/Main.java b/com/sun/electric/Main.java
index 78a413d..7249bb4 100644
--- a/com/sun/electric/Main.java
+++ b/com/sun/electric/Main.java
@@ -4,7 +4,7 @@
*
* File: Main.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -28,6 +28,7 @@ import java.io.PrintStream;
import java.io.PrintWriter;
import java.net.URL;
import java.util.ArrayList;
+import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.prefs.Preferences;
@@ -149,27 +150,27 @@ public final class Main
if (hasCommandLineOption(argsList, "-help"))
{
System.out.println("Usage (without plugins):");
- System.out.println("\tjava -jar electric.jar [electric-options]");
+ System.out.println("\tjava -jar electric.jar [electric-options] [electric-libraries]");
+ System.out.println("\t\twhere [electric-libraries] is list of library files to read");
System.out.println("Usage (with plugins):");
- System.out.println("\tjava -classpath electric.jar<delim>{list of plugins} com.sun.electric.Launcher [electric-options]");
- System.out.println("\t\twhere <delim> is OS-dependant separator (colon or semicolon)");
- System.out.println("\nOptions:");
+ System.out.println("\tjava -classpath electric.jar[electric-plugins] com.sun.electric.Launcher [electric-options] [electric-libraries]");
+ System.out.println("\t\twhere [electric-plugins] is list of JAR files separated by OS-dependant separator (colon or semicolon)");
+ System.out.println("\nElectric-options:");
+ System.out.println("\t-batch: batch mode implies 'no GUI', and nothing more");
+ System.out.println("\t-client <machine name>: replay trace of snapshots");
+ System.out.println("\t-debug: debug mode. Extra information is available");
+ System.out.println("\t-help: this message");
+ System.out.println("\t-logging <filePath>: log server events in a binary file");
+ System.out.println("\t-logusage <local path>: local path to log usage");
System.out.println("\t-mdi: multiple document interface mode");
- System.out.println("\t-sdi: single document interface mode");
System.out.println("\t-NOMINMEM: ignore minimum memory provided for JVM");
System.out.println("\t-s <script name>: bean shell script to execute");
+ System.out.println("\t-sdi: single document interface mode");
+ System.out.println("\t-server: dump trace of snapshots");
+ System.out.println("\t-socket <socket>: socket port for client/server interaction");
+ System.out.println("\t-threads <numThreads>: recommended size of thread pool for Job execution.");
System.out.println("\t-version: version information");
System.out.println("\t-v: brief version information");
- System.out.println("\t-debug: debug mode. Extra information is available");
- System.out.println("\t-threads <numThreads>: recommended size of thread pool for Job execution.");
- System.out.println("\t-logging <filePath>: log server events in a binary file");
- System.out.println("\t-socket <socket>: socket port for client/server interaction");
- System.out.println("\t-batch: batch mode implies 'no GUI', and nothing more");
- System.out.println("\t-server: dump trace of snapshots");
- System.out.println("\t-client <machine name>: replay trace of snapshots");
- System.out.println("\t-logusage <local path>: local path to log usage");
- System.out.println("\t-help: this message");
-
System.exit(0);
}
@@ -595,13 +596,28 @@ public final class Main
if (arg.indexOf('.')!=-1 && SimulationData.isKnownSimulationFormatExtension(arg.substring(arg.lastIndexOf('.')+1))) {
SimulationData.plot(null, url, null);
} else {
- FileMenu.openLibraryCommand(url);
+ // make sure library isn't already there
+ boolean alreadyThere = false;
+//System.out.println("CHECKING REDUNDANCY FOR LIBRARY "+url.toString());
+ for(Iterator<Library> it = Library.getLibraries(); it.hasNext(); )
+ {
+ Library lib = it.next();
+ URL lURL = lib.getLibFile();
+//System.out.println(" FOUND LIBRARY "+lib.getName()+" ("+lURL+")");
+ if (lURL != null && lURL.equals(url))
+ {
+//System.out.println("SKIPPING "+url); // TODO: debug
+ alreadyThere = true; break;
+ }
+ }
+ if (!alreadyThere)
+ FileMenu.openLibraryCommand(url);
}
}
}
/**
- * Class to init all technologies.
+ * Class to initialize all technologies.
*/
private static class InitDatabase extends Job
{
diff --git a/com/sun/electric/StartupPrefs.java b/com/sun/electric/StartupPrefs.java
index 514783b..53443d8 100644
--- a/com/sun/electric/StartupPrefs.java
+++ b/com/sun/electric/StartupPrefs.java
@@ -4,7 +4,7 @@
*
* File: StartupPrefs.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/api/irsim/IAnalyzer.java b/com/sun/electric/api/irsim/IAnalyzer.java
index b13aae3..8a78125 100644
--- a/com/sun/electric/api/irsim/IAnalyzer.java
+++ b/com/sun/electric/api/irsim/IAnalyzer.java
@@ -4,7 +4,7 @@
*
* File: IAnalyzer.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/api/minarea/ErrorLogger.java b/com/sun/electric/api/minarea/ErrorLogger.java
index c8a0e96..a3050bb 100644
--- a/com/sun/electric/api/minarea/ErrorLogger.java
+++ b/com/sun/electric/api/minarea/ErrorLogger.java
@@ -4,7 +4,7 @@
*
* File: ErrorLogger.java
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/api/minarea/LayoutCell.java b/com/sun/electric/api/minarea/LayoutCell.java
index 11e9b43..190b7d8 100644
--- a/com/sun/electric/api/minarea/LayoutCell.java
+++ b/com/sun/electric/api/minarea/LayoutCell.java
@@ -4,7 +4,7 @@
*
* File: LayoutCell.java
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/api/minarea/LayoutCellLoader.java b/com/sun/electric/api/minarea/LayoutCellLoader.java
index 5017f47..61b0c16 100644
--- a/com/sun/electric/api/minarea/LayoutCellLoader.java
+++ b/com/sun/electric/api/minarea/LayoutCellLoader.java
@@ -4,7 +4,7 @@
*
* File: LayoutCellLoader.java
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/api/minarea/ManhattanOrientation.java b/com/sun/electric/api/minarea/ManhattanOrientation.java
index f95ff78..92d1434 100644
--- a/com/sun/electric/api/minarea/ManhattanOrientation.java
+++ b/com/sun/electric/api/minarea/ManhattanOrientation.java
@@ -4,7 +4,7 @@
*
* File: ManhattanOrientation.java
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/api/minarea/MinAreaChecker.java b/com/sun/electric/api/minarea/MinAreaChecker.java
index fc999f2..c0992a6 100644
--- a/com/sun/electric/api/minarea/MinAreaChecker.java
+++ b/com/sun/electric/api/minarea/MinAreaChecker.java
@@ -4,7 +4,7 @@
*
* File: MinAreaChecker.java
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/api/minarea/errorLogging/AbstractErrorLogger.java b/com/sun/electric/api/minarea/errorLogging/AbstractErrorLogger.java
index 9569b8f..ded9dcf 100644
--- a/com/sun/electric/api/minarea/errorLogging/AbstractErrorLogger.java
+++ b/com/sun/electric/api/minarea/errorLogging/AbstractErrorLogger.java
@@ -4,7 +4,7 @@
*
* File: AbstractErrorLogger.java
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/api/minarea/errorLogging/ErrorLoggerCSVFile.java b/com/sun/electric/api/minarea/errorLogging/ErrorLoggerCSVFile.java
index 7c613d4..27d1472 100644
--- a/com/sun/electric/api/minarea/errorLogging/ErrorLoggerCSVFile.java
+++ b/com/sun/electric/api/minarea/errorLogging/ErrorLoggerCSVFile.java
@@ -4,7 +4,7 @@
*
* File: ErrorLoggerCSVFile.java
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/api/minarea/errorLogging/ErrorLoggerFactory.java b/com/sun/electric/api/minarea/errorLogging/ErrorLoggerFactory.java
index 8657bec..8427ac5 100644
--- a/com/sun/electric/api/minarea/errorLogging/ErrorLoggerFactory.java
+++ b/com/sun/electric/api/minarea/errorLogging/ErrorLoggerFactory.java
@@ -4,7 +4,7 @@
*
* File: ErrorLoggerFactory.java
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/api/minarea/errorLogging/ErrorRepositoryLogger.java b/com/sun/electric/api/minarea/errorLogging/ErrorRepositoryLogger.java
index 6485443..ef903ee 100644
--- a/com/sun/electric/api/minarea/errorLogging/ErrorRepositoryLogger.java
+++ b/com/sun/electric/api/minarea/errorLogging/ErrorRepositoryLogger.java
@@ -4,7 +4,7 @@
*
* File: ErrorRepositoryLogger.java
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/api/minarea/errorLogging/ErrorToElectricReporter.java b/com/sun/electric/api/minarea/errorLogging/ErrorToElectricReporter.java
index 343a4ca..c751818 100644
--- a/com/sun/electric/api/minarea/errorLogging/ErrorToElectricReporter.java
+++ b/com/sun/electric/api/minarea/errorLogging/ErrorToElectricReporter.java
@@ -4,7 +4,7 @@
*
* File: ErrorToElectricReporter.java
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/api/minarea/errorLogging/io/CSVFile.java b/com/sun/electric/api/minarea/errorLogging/io/CSVFile.java
index 75fefbc..c25246b 100644
--- a/com/sun/electric/api/minarea/errorLogging/io/CSVFile.java
+++ b/com/sun/electric/api/minarea/errorLogging/io/CSVFile.java
@@ -4,7 +4,7 @@
*
* File: CSVFile.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/api/minarea/errorLogging/io/CSVInput.java b/com/sun/electric/api/minarea/errorLogging/io/CSVInput.java
index 3ced3dd..f8b8653 100644
--- a/com/sun/electric/api/minarea/errorLogging/io/CSVInput.java
+++ b/com/sun/electric/api/minarea/errorLogging/io/CSVInput.java
@@ -4,7 +4,7 @@
*
* File: CSVInput.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/api/minarea/errorLogging/io/CSVWriter.java b/com/sun/electric/api/minarea/errorLogging/io/CSVWriter.java
index 034f963..40a8fdc 100644
--- a/com/sun/electric/api/minarea/errorLogging/io/CSVWriter.java
+++ b/com/sun/electric/api/minarea/errorLogging/io/CSVWriter.java
@@ -4,7 +4,7 @@
*
* File: CVSWriter.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/api/minarea/geometry/Edge.java b/com/sun/electric/api/minarea/geometry/Edge.java
index d0dc438..dca7959 100644
--- a/com/sun/electric/api/minarea/geometry/Edge.java
+++ b/com/sun/electric/api/minarea/geometry/Edge.java
@@ -4,7 +4,7 @@
*
* File: Edge.java
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/api/minarea/geometry/Point.java b/com/sun/electric/api/minarea/geometry/Point.java
index 5fabee7..2dd94bb 100644
--- a/com/sun/electric/api/minarea/geometry/Point.java
+++ b/com/sun/electric/api/minarea/geometry/Point.java
@@ -4,7 +4,7 @@
*
* File: Point.java
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/api/minarea/geometry/Polygon.java b/com/sun/electric/api/minarea/geometry/Polygon.java
index 8d24a32..3fc22cc 100644
--- a/com/sun/electric/api/minarea/geometry/Polygon.java
+++ b/com/sun/electric/api/minarea/geometry/Polygon.java
@@ -4,7 +4,7 @@
*
* File: Polygon.java
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/api/minarea/geometry/Shapes.java b/com/sun/electric/api/minarea/geometry/Shapes.java
index 4ec6c8c..f8f7b6b 100644
--- a/com/sun/electric/api/minarea/geometry/Shapes.java
+++ b/com/sun/electric/api/minarea/geometry/Shapes.java
@@ -4,7 +4,7 @@
*
* File: BitMapMinAreaChecker.scala
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/api/minarea/launcher/DefaultLayoutCell.java b/com/sun/electric/api/minarea/launcher/DefaultLayoutCell.java
index a0b51fd..f5571b1 100644
--- a/com/sun/electric/api/minarea/launcher/DefaultLayoutCell.java
+++ b/com/sun/electric/api/minarea/launcher/DefaultLayoutCell.java
@@ -4,7 +4,7 @@
*
* File: DefaultLayoutCell.java
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/api/minarea/launcher/ElapseTimer.java b/com/sun/electric/api/minarea/launcher/ElapseTimer.java
index 0a4102d..e4e3de7 100644
--- a/com/sun/electric/api/minarea/launcher/ElapseTimer.java
+++ b/com/sun/electric/api/minarea/launcher/ElapseTimer.java
@@ -4,7 +4,7 @@
*
* File: ElapseTimer.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/api/minarea/launcher/Launcher.java b/com/sun/electric/api/minarea/launcher/Launcher.java
index 697cb29..ebfdb02 100644
--- a/com/sun/electric/api/minarea/launcher/Launcher.java
+++ b/com/sun/electric/api/minarea/launcher/Launcher.java
@@ -4,7 +4,7 @@
*
* File: Launcher.java
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/api/movie/MovieCreator.java b/com/sun/electric/api/movie/MovieCreator.java
index 9a569e5..8b75e3e 100644
--- a/com/sun/electric/api/movie/MovieCreator.java
+++ b/com/sun/electric/api/movie/MovieCreator.java
@@ -4,7 +4,7 @@
*
* File: MovieCreator.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/AnalyzeHeap.java b/com/sun/electric/database/AnalyzeHeap.java
index ace758b..49cb3ae 100644
--- a/com/sun/electric/database/AnalyzeHeap.java
+++ b/com/sun/electric/database/AnalyzeHeap.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: AnalyzeHeap.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/CellBackup.java b/com/sun/electric/database/CellBackup.java
index 838a46a..1fa3471 100644
--- a/com/sun/electric/database/CellBackup.java
+++ b/com/sun/electric/database/CellBackup.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: CellBackup.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/CellRevision.java b/com/sun/electric/database/CellRevision.java
index 3262e4b..7795837 100644
--- a/com/sun/electric/database/CellRevision.java
+++ b/com/sun/electric/database/CellRevision.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: CellRevision.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/CellRevisionConn.java b/com/sun/electric/database/CellRevisionConn.java
index e0b294a..61f3078 100644
--- a/com/sun/electric/database/CellRevisionConn.java
+++ b/com/sun/electric/database/CellRevisionConn.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: CellRevisionConn.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/CellRevisionConn0.java b/com/sun/electric/database/CellRevisionConn0.java
index 4a91dde..1799ee1 100644
--- a/com/sun/electric/database/CellRevisionConn0.java
+++ b/com/sun/electric/database/CellRevisionConn0.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: CellRevisionConn.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/CellRevisionJ.java b/com/sun/electric/database/CellRevisionJ.java
index 5e43cee..397f08f 100644
--- a/com/sun/electric/database/CellRevisionJ.java
+++ b/com/sun/electric/database/CellRevisionJ.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: CellRevisionJ.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/CellRevisionProvider.java b/com/sun/electric/database/CellRevisionProvider.java
index 6c14956..44e752d 100644
--- a/com/sun/electric/database/CellRevisionProvider.java
+++ b/com/sun/electric/database/CellRevisionProvider.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: CellRevisionProvider.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/CellRevisionProviderDefault.java b/com/sun/electric/database/CellRevisionProviderDefault.java
index 096c73d..cd22b0d 100644
--- a/com/sun/electric/database/CellRevisionProviderDefault.java
+++ b/com/sun/electric/database/CellRevisionProviderDefault.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: CellRevisionProviderDefault.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -340,7 +340,7 @@ public class CellRevisionProviderDefault extends CellRevisionProvider {
if (prevA != null) {
int cmp = TextUtils.STRING_NUMBER_ORDER.compare(prevA.name.toString(), a.name.toString());
if (cmp > 0 || cmp == 0 && (a.name.isTempname() || prevA.arcId >= a.arcId)) {
- throw new IllegalArgumentException("arcs order");
+ throw new IllegalArgumentException("arcs order " + a.name);
}
}
prevA = a;
diff --git a/com/sun/electric/database/CellTree.java b/com/sun/electric/database/CellTree.java
index 171d12c..4defa68 100644
--- a/com/sun/electric/database/CellTree.java
+++ b/com/sun/electric/database/CellTree.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: CellTree.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/CellUsageInfo.java b/com/sun/electric/database/CellUsageInfo.java
index ca6d8e7..e156fa8 100644
--- a/com/sun/electric/database/CellUsageInfo.java
+++ b/com/sun/electric/database/CellUsageInfo.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: CellRevision.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/DumpHeap.java b/com/sun/electric/database/DumpHeap.java
index 8342f02..b06dcd0 100644
--- a/com/sun/electric/database/DumpHeap.java
+++ b/com/sun/electric/database/DumpHeap.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: DumpHeap.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/EObjectInputStream.java b/com/sun/electric/database/EObjectInputStream.java
index af71e6d..abea64f 100644
--- a/com/sun/electric/database/EObjectInputStream.java
+++ b/com/sun/electric/database/EObjectInputStream.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: EObjectInputStream.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/EObjectOutputStream.java b/com/sun/electric/database/EObjectOutputStream.java
index 8fb0e1e..e7acd39 100644
--- a/com/sun/electric/database/EObjectOutputStream.java
+++ b/com/sun/electric/database/EObjectOutputStream.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: EObjectOutputStream.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/EditingPreferences.java b/com/sun/electric/database/EditingPreferences.java
index 4806c5d..1ed499a 100644
--- a/com/sun/electric/database/EditingPreferences.java
+++ b/com/sun/electric/database/EditingPreferences.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: EditingPreferences.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/Environment.java b/com/sun/electric/database/Environment.java
index 51d178b..72609bc 100644
--- a/com/sun/electric/database/Environment.java
+++ b/com/sun/electric/database/Environment.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: Environment.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/EquivPorts.java b/com/sun/electric/database/EquivPorts.java
index 0acceea..4d0675c 100644
--- a/com/sun/electric/database/EquivPorts.java
+++ b/com/sun/electric/database/EquivPorts.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: EquivPorts.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/EquivalentSchematicExports.java b/com/sun/electric/database/EquivalentSchematicExports.java
index 6663c5c..b46ad1c 100644
--- a/com/sun/electric/database/EquivalentSchematicExports.java
+++ b/com/sun/electric/database/EquivalentSchematicExports.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: EquivalentSchematicsExports.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/IdMapper.java b/com/sun/electric/database/IdMapper.java
index d552ff7..1ff68f8 100644
--- a/com/sun/electric/database/IdMapper.java
+++ b/com/sun/electric/database/IdMapper.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: IdMapper.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/ImmutableArcInst.java b/com/sun/electric/database/ImmutableArcInst.java
index 9baef4e..6e02a7b 100644
--- a/com/sun/electric/database/ImmutableArcInst.java
+++ b/com/sun/electric/database/ImmutableArcInst.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ImmutableArcInst.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/ImmutableCell.java b/com/sun/electric/database/ImmutableCell.java
index b71e339..777cabf 100644
--- a/com/sun/electric/database/ImmutableCell.java
+++ b/com/sun/electric/database/ImmutableCell.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ImmutableCell.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/ImmutableElectricObject.java b/com/sun/electric/database/ImmutableElectricObject.java
index 4b8e94b..6c5338c 100644
--- a/com/sun/electric/database/ImmutableElectricObject.java
+++ b/com/sun/electric/database/ImmutableElectricObject.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ImmutableElectricObject.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/ImmutableExport.java b/com/sun/electric/database/ImmutableExport.java
index 9afa5d7..68fbea2 100644
--- a/com/sun/electric/database/ImmutableExport.java
+++ b/com/sun/electric/database/ImmutableExport.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ImmutableExport.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/ImmutableIconInst.java b/com/sun/electric/database/ImmutableIconInst.java
index 8c5a1e1..bc1d9ab 100644
--- a/com/sun/electric/database/ImmutableIconInst.java
+++ b/com/sun/electric/database/ImmutableIconInst.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ImmutableIconInst.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/ImmutableLayoutHierarchyEnumerator.java b/com/sun/electric/database/ImmutableLayoutHierarchyEnumerator.java
index 7290e04..343050a 100644
--- a/com/sun/electric/database/ImmutableLayoutHierarchyEnumerator.java
+++ b/com/sun/electric/database/ImmutableLayoutHierarchyEnumerator.java
@@ -4,7 +4,7 @@
*
* File: HierarchyEnumerator.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/ImmutableLibrary.java b/com/sun/electric/database/ImmutableLibrary.java
index e87f053..d6aee4b 100644
--- a/com/sun/electric/database/ImmutableLibrary.java
+++ b/com/sun/electric/database/ImmutableLibrary.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ImmutableLibrary.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/ImmutableNet.java b/com/sun/electric/database/ImmutableNet.java
index 64fc084..9c676ea 100644
--- a/com/sun/electric/database/ImmutableNet.java
+++ b/com/sun/electric/database/ImmutableNet.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ImmutableNetLayout.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/ImmutableNetLayout.java b/com/sun/electric/database/ImmutableNetLayout.java
index f50088c..837dd61 100644
--- a/com/sun/electric/database/ImmutableNetLayout.java
+++ b/com/sun/electric/database/ImmutableNetLayout.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ImmutableNetLayout.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/ImmutableNetSchem.java b/com/sun/electric/database/ImmutableNetSchem.java
index fcebd71..0aaed77 100644
--- a/com/sun/electric/database/ImmutableNetSchem.java
+++ b/com/sun/electric/database/ImmutableNetSchem.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ImmutableNetSchem.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/ImmutableNodeInst.java b/com/sun/electric/database/ImmutableNodeInst.java
index c2eaab4..d5a142a 100644
--- a/com/sun/electric/database/ImmutableNodeInst.java
+++ b/com/sun/electric/database/ImmutableNodeInst.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ImmutableNodeInst.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/ImmutablePortInst.java b/com/sun/electric/database/ImmutablePortInst.java
index 990ada4..90e8f45 100644
--- a/com/sun/electric/database/ImmutablePortInst.java
+++ b/com/sun/electric/database/ImmutablePortInst.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ImmutablePortInst.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/LibraryBackup.java b/com/sun/electric/database/LibraryBackup.java
index 791adfe..8961d83 100644
--- a/com/sun/electric/database/LibraryBackup.java
+++ b/com/sun/electric/database/LibraryBackup.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: LibraryBackup.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/Snapshot.java b/com/sun/electric/database/Snapshot.java
index 5f48999..6f1c80a 100644
--- a/com/sun/electric/database/Snapshot.java
+++ b/com/sun/electric/database/Snapshot.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: Snapshot.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/SnapshotAnalyze.java b/com/sun/electric/database/SnapshotAnalyze.java
index b07838a..03082f4 100644
--- a/com/sun/electric/database/SnapshotAnalyze.java
+++ b/com/sun/electric/database/SnapshotAnalyze.java
@@ -4,7 +4,7 @@
*
* File: SnapshotAnalyze.java
*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/UsageCollector.java b/com/sun/electric/database/UsageCollector.java
index 79f10a4..c23a536 100644
--- a/com/sun/electric/database/UsageCollector.java
+++ b/com/sun/electric/database/UsageCollector.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: UsageCollector.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/change/Changes.java b/com/sun/electric/database/change/Changes.java
index 349c58f..2316100 100644
--- a/com/sun/electric/database/change/Changes.java
+++ b/com/sun/electric/database/change/Changes.java
@@ -4,7 +4,7 @@
*
* File: Changes.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/change/DatabaseChangeEvent.java b/com/sun/electric/database/change/DatabaseChangeEvent.java
index 62ab703..12797a6 100644
--- a/com/sun/electric/database/change/DatabaseChangeEvent.java
+++ b/com/sun/electric/database/change/DatabaseChangeEvent.java
@@ -4,7 +4,7 @@
*
* File: DatabaseChangeEvent.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/change/DatabaseChangeListener.java b/com/sun/electric/database/change/DatabaseChangeListener.java
index af55880..d3fd943 100644
--- a/com/sun/electric/database/change/DatabaseChangeListener.java
+++ b/com/sun/electric/database/change/DatabaseChangeListener.java
@@ -4,7 +4,7 @@
*
* File: DatabaseChangeListener.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/change/Undo.java b/com/sun/electric/database/change/Undo.java
index 66cc599..c6257f1 100644
--- a/com/sun/electric/database/change/Undo.java
+++ b/com/sun/electric/database/change/Undo.java
@@ -4,7 +4,7 @@
*
* File: Undo.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/constraint/Constraints.java b/com/sun/electric/database/constraint/Constraints.java
index 71f2495..ad26015 100644
--- a/com/sun/electric/database/constraint/Constraints.java
+++ b/com/sun/electric/database/constraint/Constraints.java
@@ -4,7 +4,7 @@
*
* File: Constraints.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/constraint/Layout.java b/com/sun/electric/database/constraint/Layout.java
index 0eb1c2e..8d316fd 100644
--- a/com/sun/electric/database/constraint/Layout.java
+++ b/com/sun/electric/database/constraint/Layout.java
@@ -4,7 +4,7 @@
*
* File: Layout.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/constraint/LayoutCell.java b/com/sun/electric/database/constraint/LayoutCell.java
index b72370c..944562f 100644
--- a/com/sun/electric/database/constraint/LayoutCell.java
+++ b/com/sun/electric/database/constraint/LayoutCell.java
@@ -4,7 +4,7 @@
*
* File: LayoutCell.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/geometry/EGraphics.java b/com/sun/electric/database/geometry/EGraphics.java
index 1cb5054..132e9c0 100644
--- a/com/sun/electric/database/geometry/EGraphics.java
+++ b/com/sun/electric/database/geometry/EGraphics.java
@@ -4,7 +4,7 @@
*
* File: EGraphics.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -530,7 +530,7 @@ public class EGraphics implements Serializable
* If < 0, reset it to zero.
* If > 1, reset it to one.
* @param opacity
- * @return
+ * @return valid opacity
*/
private static double validateOpacity(double opacity)
{
diff --git a/com/sun/electric/database/geometry/EPoint.java b/com/sun/electric/database/geometry/EPoint.java
index 3fbe70c..7f01bbb 100644
--- a/com/sun/electric/database/geometry/EPoint.java
+++ b/com/sun/electric/database/geometry/EPoint.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: EPoint.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/geometry/ERectangle.java b/com/sun/electric/database/geometry/ERectangle.java
index 7ba98a0..79f8bd7 100644
--- a/com/sun/electric/database/geometry/ERectangle.java
+++ b/com/sun/electric/database/geometry/ERectangle.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ERectangle.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/geometry/GeometryHandler.java b/com/sun/electric/database/geometry/GeometryHandler.java
index e3226b6..531e78b 100644
--- a/com/sun/electric/database/geometry/GeometryHandler.java
+++ b/com/sun/electric/database/geometry/GeometryHandler.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: GeometryHandler.java
- * Written by Gilda Garreton, Sun Microsystems.
+ * Written by Gilda Garreton.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/geometry/ObjectQTree.java b/com/sun/electric/database/geometry/ObjectQTree.java
index 54ea1e1..4652e87 100644
--- a/com/sun/electric/database/geometry/ObjectQTree.java
+++ b/com/sun/electric/database/geometry/ObjectQTree.java
@@ -4,7 +4,7 @@
*
* File: ObjectQTree.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/geometry/Poly.java b/com/sun/electric/database/geometry/Poly.java
index a0efc39..fa35bcc 100644
--- a/com/sun/electric/database/geometry/Poly.java
+++ b/com/sun/electric/database/geometry/Poly.java
@@ -4,7 +4,7 @@
*
* File: Poly.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/geometry/Poly3D.java b/com/sun/electric/database/geometry/Poly3D.java
index 6e6aae8..5f50f62 100644
--- a/com/sun/electric/database/geometry/Poly3D.java
+++ b/com/sun/electric/database/geometry/Poly3D.java
@@ -4,7 +4,7 @@
*
* File: Poly3D.java
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/geometry/PolyBase.java b/com/sun/electric/database/geometry/PolyBase.java
index d8e2fff..cfb28ce 100644
--- a/com/sun/electric/database/geometry/PolyBase.java
+++ b/com/sun/electric/database/geometry/PolyBase.java
@@ -4,7 +4,7 @@
*
* File: PolyBase.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -487,7 +487,7 @@ public class PolyBase implements Shape, PolyNodeMerge {
* Method to determine if a point is inside a polygon. The method is based on counting
* how many time an imaginary line cuts the polygon in one direction.
* @param pt
- * @return
+ * @return true if point is inside polygon.
*/
private boolean isPointInsideCutAlgorithm(Point2D pt) {
// general polygon containment by counting reference line intersections
@@ -1059,7 +1059,7 @@ public class PolyBase implements Shape, PolyNodeMerge {
/**
* Method to return the scaling factor between database and screen for the given text.
* @param wnd the window with the text.
- * @param gv the GlyphVector describing the text.
+ * @param glyphBounds the bounds of text.
* @param style the anchor information for the text.
* @param lX the low X bound of the polygon containing the text.
* @param hX the high X bound of the polygon containing the text.
diff --git a/com/sun/electric/database/geometry/PolyMerge.java b/com/sun/electric/database/geometry/PolyMerge.java
index e3c8dc8..65cc871 100644
--- a/com/sun/electric/database/geometry/PolyMerge.java
+++ b/com/sun/electric/database/geometry/PolyMerge.java
@@ -4,7 +4,7 @@
*
* File: PolyMerge.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/geometry/PolyNodeMerge.java b/com/sun/electric/database/geometry/PolyNodeMerge.java
index 7c8750e..f2c2041 100644
--- a/com/sun/electric/database/geometry/PolyNodeMerge.java
+++ b/com/sun/electric/database/geometry/PolyNodeMerge.java
@@ -4,7 +4,7 @@
*
* File: PolyNodeMerge.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/geometry/PolyQTree.java b/com/sun/electric/database/geometry/PolyQTree.java
index 79baafe..72a90ed 100644
--- a/com/sun/electric/database/geometry/PolyQTree.java
+++ b/com/sun/electric/database/geometry/PolyQTree.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: PolyQTree.java
- * Written by Gilda Garreton, Sun Microsystems.
+ * Written by Gilda Garreton.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/geometry/PolySweepMerge.java b/com/sun/electric/database/geometry/PolySweepMerge.java
index 6e0215a..854330a 100644
--- a/com/sun/electric/database/geometry/PolySweepMerge.java
+++ b/com/sun/electric/database/geometry/PolySweepMerge.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: PolySweepMerge.java
- * Written by Gilda Garreton, Sun Microsystems.
+ * Written by Gilda Garreton.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -470,7 +470,7 @@ public class PolySweepMerge extends GeometryHandler
/**
* Method to return the unique set of points in the polygon.
* @param area
- * @return
+ * @return points to describe the polygon.
*/
private static Set<Point2D> getPoints(Area area)
{
diff --git a/com/sun/electric/database/geometry/ScreenPoint.java b/com/sun/electric/database/geometry/ScreenPoint.java
index c29d6bb..dd4730a 100644
--- a/com/sun/electric/database/geometry/ScreenPoint.java
+++ b/com/sun/electric/database/geometry/ScreenPoint.java
@@ -4,7 +4,7 @@
*
* File: ScreenPoint.java
*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/geometry/bool/DeltaMerge.java b/com/sun/electric/database/geometry/bool/DeltaMerge.java
index 4d96cb6..39fc1d1 100644
--- a/com/sun/electric/database/geometry/bool/DeltaMerge.java
+++ b/com/sun/electric/database/geometry/bool/DeltaMerge.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: DeltaMerge.java
- * Written by Dmitry Nadezhin, Sun Microsystems.
+ * Written by Dmitry Nadezhin.
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/geometry/bool/LayoutMerger.java b/com/sun/electric/database/geometry/bool/LayoutMerger.java
index 0a135fe..e1092ea 100644
--- a/com/sun/electric/database/geometry/bool/LayoutMerger.java
+++ b/com/sun/electric/database/geometry/bool/LayoutMerger.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: LayoutMerger.java
- * Written by Dmitry Nadezhin, Sun Microsystems.
+ * Written by Dmitry Nadezhin.
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/geometry/bool/LayoutMergerDefaultImpl.java b/com/sun/electric/database/geometry/bool/LayoutMergerDefaultImpl.java
index 06544e0..04c0b24 100644
--- a/com/sun/electric/database/geometry/bool/LayoutMergerDefaultImpl.java
+++ b/com/sun/electric/database/geometry/bool/LayoutMergerDefaultImpl.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: LayoutMergerDefaultImpl.java
- * Written by Dmitry Nadezhin, Sun Microsystems.
+ * Written by Dmitry Nadezhin.
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/geometry/bool/LayoutMergerFactory.java b/com/sun/electric/database/geometry/bool/LayoutMergerFactory.java
index d615a4b..e83592c 100644
--- a/com/sun/electric/database/geometry/bool/LayoutMergerFactory.java
+++ b/com/sun/electric/database/geometry/bool/LayoutMergerFactory.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: LayoutMergerFactory.java
- * Written by Dmitry Nadezhin, Sun Microsystems.
+ * Written by Dmitry Nadezhin.
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/geometry/bool/LayoutMergerHierImpl.java b/com/sun/electric/database/geometry/bool/LayoutMergerHierImpl.java
index 82bbe60..6c90059 100644
--- a/com/sun/electric/database/geometry/bool/LayoutMergerHierImpl.java
+++ b/com/sun/electric/database/geometry/bool/LayoutMergerHierImpl.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: LayoutMergerHierImpl.java
- * Written by Dmitry Nadezhin, Sun Microsystems.
+ * Written by Dmitry Nadezhin.
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/geometry/bool/Main.java b/com/sun/electric/database/geometry/bool/Main.java
index 9eebf82..4af0047 100644
--- a/com/sun/electric/database/geometry/bool/Main.java
+++ b/com/sun/electric/database/geometry/bool/Main.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: Main.java
- * Written by Dmitry Nadezhin, Sun Microsystems.
+ * Written by Dmitry Nadezhin.
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/geometry/bool/PointsSorter.java b/com/sun/electric/database/geometry/bool/PointsSorter.java
index 7d72ec4..b1b33aa 100644
--- a/com/sun/electric/database/geometry/bool/PointsSorter.java
+++ b/com/sun/electric/database/geometry/bool/PointsSorter.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: PointsSorter.java
- * Written by Dmitry Nadezhin, Sun Microsystems.
+ * Written by Dmitry Nadezhin.
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/geometry/bool/UnloadPolys.java b/com/sun/electric/database/geometry/bool/UnloadPolys.java
index c4894de..54d16ee 100644
--- a/com/sun/electric/database/geometry/bool/UnloadPolys.java
+++ b/com/sun/electric/database/geometry/bool/UnloadPolys.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: UnloadPolys.java
- * Written by Dmitry Nadezhin, Sun Microsystems.
+ * Written by Dmitry Nadezhin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/geometry/bool/VectorCache.java b/com/sun/electric/database/geometry/bool/VectorCache.java
index 6a5ca6f..dee87d0 100644
--- a/com/sun/electric/database/geometry/bool/VectorCache.java
+++ b/com/sun/electric/database/geometry/bool/VectorCache.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: VectorCache.java
- * Written by Dmitry Nadezhin, Sun Microsystems.
+ * Written by Dmitry Nadezhin.
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/geometry/btree/BTree.java b/com/sun/electric/database/geometry/btree/BTree.java
index 63b7e85..0e0f493 100644
--- a/com/sun/electric/database/geometry/btree/BTree.java
+++ b/com/sun/electric/database/geometry/btree/BTree.java
@@ -4,7 +4,7 @@
*
* File: BTree.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
diff --git a/com/sun/electric/database/geometry/btree/BTreeTest.java b/com/sun/electric/database/geometry/btree/BTreeTest.java
index ee15008..71a5e5b 100644
--- a/com/sun/electric/database/geometry/btree/BTreeTest.java
+++ b/com/sun/electric/database/geometry/btree/BTreeTest.java
@@ -4,7 +4,7 @@
*
* File: BTreeTest.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
diff --git a/com/sun/electric/database/geometry/btree/CachingPageStorage.java b/com/sun/electric/database/geometry/btree/CachingPageStorage.java
index 090eeb7..9b4ff4a 100644
--- a/com/sun/electric/database/geometry/btree/CachingPageStorage.java
+++ b/com/sun/electric/database/geometry/btree/CachingPageStorage.java
@@ -4,7 +4,7 @@
*
* File: BTree.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
diff --git a/com/sun/electric/database/geometry/btree/CachingPageStorageWrapper.java b/com/sun/electric/database/geometry/btree/CachingPageStorageWrapper.java
index 49cbc4e..ab14923 100644
--- a/com/sun/electric/database/geometry/btree/CachingPageStorageWrapper.java
+++ b/com/sun/electric/database/geometry/btree/CachingPageStorageWrapper.java
@@ -4,7 +4,7 @@
*
* File: CachingPageStorageWrapper.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
diff --git a/com/sun/electric/database/geometry/btree/EquivalenceClasses.java b/com/sun/electric/database/geometry/btree/EquivalenceClasses.java
index ca65d77..8eaf85b 100644
--- a/com/sun/electric/database/geometry/btree/EquivalenceClasses.java
+++ b/com/sun/electric/database/geometry/btree/EquivalenceClasses.java
@@ -4,7 +4,7 @@
*
* File: DisjointSet.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
@@ -31,7 +31,7 @@ import java.util.*;
*
* XXX: ought to implement union-by-rank optimization
*
- * @author Adam Megacz <adam.megacz at oracle.com>
+ * @author Adam Megacz
*/
public class EquivalenceClasses<V> {
diff --git a/com/sun/electric/database/geometry/btree/FilePageStorage.java b/com/sun/electric/database/geometry/btree/FilePageStorage.java
index e34dd7a..5303e5e 100644
--- a/com/sun/electric/database/geometry/btree/FilePageStorage.java
+++ b/com/sun/electric/database/geometry/btree/FilePageStorage.java
@@ -4,7 +4,7 @@
*
* File: BTree.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
diff --git a/com/sun/electric/database/geometry/btree/InteriorNodeCursor.java b/com/sun/electric/database/geometry/btree/InteriorNodeCursor.java
index 73c61dd..2e22926 100644
--- a/com/sun/electric/database/geometry/btree/InteriorNodeCursor.java
+++ b/com/sun/electric/database/geometry/btree/InteriorNodeCursor.java
@@ -4,7 +4,7 @@
*
* File: BTree.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
diff --git a/com/sun/electric/database/geometry/btree/LeafNodeCursor.java b/com/sun/electric/database/geometry/btree/LeafNodeCursor.java
index 76acf1e..4ffd42d 100644
--- a/com/sun/electric/database/geometry/btree/LeafNodeCursor.java
+++ b/com/sun/electric/database/geometry/btree/LeafNodeCursor.java
@@ -4,7 +4,7 @@
*
* File: BTree.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
diff --git a/com/sun/electric/database/geometry/btree/MemoryPageStorage.java b/com/sun/electric/database/geometry/btree/MemoryPageStorage.java
index 7a2676f..3c29e73 100644
--- a/com/sun/electric/database/geometry/btree/MemoryPageStorage.java
+++ b/com/sun/electric/database/geometry/btree/MemoryPageStorage.java
@@ -4,7 +4,7 @@
*
* File: MemoryPageStorage.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
diff --git a/com/sun/electric/database/geometry/btree/NodeCursor.java b/com/sun/electric/database/geometry/btree/NodeCursor.java
index 767f078..e9515e6 100644
--- a/com/sun/electric/database/geometry/btree/NodeCursor.java
+++ b/com/sun/electric/database/geometry/btree/NodeCursor.java
@@ -4,7 +4,7 @@
*
* File: BTree.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
diff --git a/com/sun/electric/database/geometry/btree/OverflowPageStorage.java b/com/sun/electric/database/geometry/btree/OverflowPageStorage.java
index 068e702..eed1bec 100644
--- a/com/sun/electric/database/geometry/btree/OverflowPageStorage.java
+++ b/com/sun/electric/database/geometry/btree/OverflowPageStorage.java
@@ -4,7 +4,7 @@
*
* File: OverflowPageStorage.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
diff --git a/com/sun/electric/database/geometry/btree/PageStorage.java b/com/sun/electric/database/geometry/btree/PageStorage.java
index 068ea04..c534c8f 100644
--- a/com/sun/electric/database/geometry/btree/PageStorage.java
+++ b/com/sun/electric/database/geometry/btree/PageStorage.java
@@ -4,7 +4,7 @@
*
* File: BTree.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
diff --git a/com/sun/electric/database/geometry/btree/PageStorageWithDeallocation.java b/com/sun/electric/database/geometry/btree/PageStorageWithDeallocation.java
index 7ba89e4..d3494d0 100644
--- a/com/sun/electric/database/geometry/btree/PageStorageWithDeallocation.java
+++ b/com/sun/electric/database/geometry/btree/PageStorageWithDeallocation.java
@@ -4,7 +4,7 @@
*
* File: BTree.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
diff --git a/com/sun/electric/database/geometry/btree/RadixTrie.java b/com/sun/electric/database/geometry/btree/RadixTrie.java
index 5819150..070f940 100644
--- a/com/sun/electric/database/geometry/btree/RadixTrie.java
+++ b/com/sun/electric/database/geometry/btree/RadixTrie.java
@@ -4,7 +4,7 @@
*
* File: RadixTrie.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
@@ -47,7 +47,7 @@ import java.util.*;
* "hierarchy separator"; it is the character which is most likely to
* terminate the longest common prefix of a family of strings.
*
- * @author Adam Megacz <adam.megacz at oracle.com>
+ * @author Adam Megacz
*/
public class RadixTrie<V> {
diff --git a/com/sun/electric/database/geometry/btree/unboxed/AssociativeCommutativeOperation.java b/com/sun/electric/database/geometry/btree/unboxed/AssociativeCommutativeOperation.java
index b1d3c78..6b610d4 100644
--- a/com/sun/electric/database/geometry/btree/unboxed/AssociativeCommutativeOperation.java
+++ b/com/sun/electric/database/geometry/btree/unboxed/AssociativeCommutativeOperation.java
@@ -4,7 +4,7 @@
*
* File: UnboxedCommutativeMonoid.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
diff --git a/com/sun/electric/database/geometry/btree/unboxed/AssociativeOperation.java b/com/sun/electric/database/geometry/btree/unboxed/AssociativeOperation.java
index b1b644c..d3d21e1 100644
--- a/com/sun/electric/database/geometry/btree/unboxed/AssociativeOperation.java
+++ b/com/sun/electric/database/geometry/btree/unboxed/AssociativeOperation.java
@@ -4,7 +4,7 @@
*
* File: BTree.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
diff --git a/com/sun/electric/database/geometry/btree/unboxed/InvertibleOperation.java b/com/sun/electric/database/geometry/btree/unboxed/InvertibleOperation.java
index 207ca9c..52cd933 100644
--- a/com/sun/electric/database/geometry/btree/unboxed/InvertibleOperation.java
+++ b/com/sun/electric/database/geometry/btree/unboxed/InvertibleOperation.java
@@ -4,7 +4,7 @@
*
* File: Invertible.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
diff --git a/com/sun/electric/database/geometry/btree/unboxed/LatticeOperation.java b/com/sun/electric/database/geometry/btree/unboxed/LatticeOperation.java
index 9a1ab0f..ed5888f 100644
--- a/com/sun/electric/database/geometry/btree/unboxed/LatticeOperation.java
+++ b/com/sun/electric/database/geometry/btree/unboxed/LatticeOperation.java
@@ -4,7 +4,7 @@
*
* File: MinMaxOperation.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
diff --git a/com/sun/electric/database/geometry/btree/unboxed/MinMaxOperation.java b/com/sun/electric/database/geometry/btree/unboxed/MinMaxOperation.java
index a674fe0..6281299 100644
--- a/com/sun/electric/database/geometry/btree/unboxed/MinMaxOperation.java
+++ b/com/sun/electric/database/geometry/btree/unboxed/MinMaxOperation.java
@@ -4,7 +4,7 @@
*
* File: MinMaxOperation.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
diff --git a/com/sun/electric/database/geometry/btree/unboxed/Pair.java b/com/sun/electric/database/geometry/btree/unboxed/Pair.java
index 90441a1..2e413d1 100644
--- a/com/sun/electric/database/geometry/btree/unboxed/Pair.java
+++ b/com/sun/electric/database/geometry/btree/unboxed/Pair.java
@@ -2,7 +2,7 @@
*
* Electric(tm) VLSI Design System
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
diff --git a/com/sun/electric/database/geometry/btree/unboxed/Unboxed.java b/com/sun/electric/database/geometry/btree/unboxed/Unboxed.java
index 5a82402..df16b40 100644
--- a/com/sun/electric/database/geometry/btree/unboxed/Unboxed.java
+++ b/com/sun/electric/database/geometry/btree/unboxed/Unboxed.java
@@ -4,7 +4,7 @@
*
* File: BTree.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
diff --git a/com/sun/electric/database/geometry/btree/unboxed/UnboxedByte.java b/com/sun/electric/database/geometry/btree/unboxed/UnboxedByte.java
index 3a78538..19244e8 100644
--- a/com/sun/electric/database/geometry/btree/unboxed/UnboxedByte.java
+++ b/com/sun/electric/database/geometry/btree/unboxed/UnboxedByte.java
@@ -4,7 +4,7 @@
*
* File: BTree.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
diff --git a/com/sun/electric/database/geometry/btree/unboxed/UnboxedComparable.java b/com/sun/electric/database/geometry/btree/unboxed/UnboxedComparable.java
index 6bdefe3..63b7037 100644
--- a/com/sun/electric/database/geometry/btree/unboxed/UnboxedComparable.java
+++ b/com/sun/electric/database/geometry/btree/unboxed/UnboxedComparable.java
@@ -4,7 +4,7 @@
*
* File: BTree.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
diff --git a/com/sun/electric/database/geometry/btree/unboxed/UnboxedDouble.java b/com/sun/electric/database/geometry/btree/unboxed/UnboxedDouble.java
index 08d0fe9..e2209d8 100644
--- a/com/sun/electric/database/geometry/btree/unboxed/UnboxedDouble.java
+++ b/com/sun/electric/database/geometry/btree/unboxed/UnboxedDouble.java
@@ -4,7 +4,7 @@
*
* File: UnboxedDouble.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
diff --git a/com/sun/electric/database/geometry/btree/unboxed/UnboxedFloat.java b/com/sun/electric/database/geometry/btree/unboxed/UnboxedFloat.java
index ebfc096..f7c9251 100644
--- a/com/sun/electric/database/geometry/btree/unboxed/UnboxedFloat.java
+++ b/com/sun/electric/database/geometry/btree/unboxed/UnboxedFloat.java
@@ -4,7 +4,7 @@
*
* File: BTree.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
diff --git a/com/sun/electric/database/geometry/btree/unboxed/UnboxedFunction.java b/com/sun/electric/database/geometry/btree/unboxed/UnboxedFunction.java
index cabf113..c7bf569 100644
--- a/com/sun/electric/database/geometry/btree/unboxed/UnboxedFunction.java
+++ b/com/sun/electric/database/geometry/btree/unboxed/UnboxedFunction.java
@@ -4,7 +4,7 @@
*
* File: UnboxedFunction.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
diff --git a/com/sun/electric/database/geometry/btree/unboxed/UnboxedHalfDouble.java b/com/sun/electric/database/geometry/btree/unboxed/UnboxedHalfDouble.java
index a3a966a..3f79f24 100644
--- a/com/sun/electric/database/geometry/btree/unboxed/UnboxedHalfDouble.java
+++ b/com/sun/electric/database/geometry/btree/unboxed/UnboxedHalfDouble.java
@@ -4,7 +4,7 @@
*
* File: BTree.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
diff --git a/com/sun/electric/database/geometry/btree/unboxed/UnboxedInt.java b/com/sun/electric/database/geometry/btree/unboxed/UnboxedInt.java
index bbc0c7c..eeb6c52 100644
--- a/com/sun/electric/database/geometry/btree/unboxed/UnboxedInt.java
+++ b/com/sun/electric/database/geometry/btree/unboxed/UnboxedInt.java
@@ -4,7 +4,7 @@
*
* File: BTree.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
diff --git a/com/sun/electric/database/geometry/btree/unboxed/UnboxedMinMaxHalfDouble.java b/com/sun/electric/database/geometry/btree/unboxed/UnboxedMinMaxHalfDouble.java
index 3f55ee9..2e9acca 100644
--- a/com/sun/electric/database/geometry/btree/unboxed/UnboxedMinMaxHalfDouble.java
+++ b/com/sun/electric/database/geometry/btree/unboxed/UnboxedMinMaxHalfDouble.java
@@ -4,7 +4,7 @@
*
* File: BTree.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
diff --git a/com/sun/electric/database/geometry/btree/unboxed/UnboxedPair.java b/com/sun/electric/database/geometry/btree/unboxed/UnboxedPair.java
index 76fc406..8312b47 100644
--- a/com/sun/electric/database/geometry/btree/unboxed/UnboxedPair.java
+++ b/com/sun/electric/database/geometry/btree/unboxed/UnboxedPair.java
@@ -4,7 +4,7 @@
*
* File: BTree.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
diff --git a/com/sun/electric/database/hierarchy/BatchChanges.java b/com/sun/electric/database/hierarchy/BatchChanges.java
index b560478..9091c82 100644
--- a/com/sun/electric/database/hierarchy/BatchChanges.java
+++ b/com/sun/electric/database/hierarchy/BatchChanges.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: BatchChanges.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -39,6 +39,7 @@ import com.sun.electric.database.topology.NodeInst;
import com.sun.electric.database.topology.PortInst;
import com.sun.electric.database.variable.Variable;
import com.sun.electric.technology.PrimitiveNode;
+import com.sun.electric.technology.PrimitiveNode.Function;
import com.sun.electric.technology.TechPool;
import java.io.Serializable;
@@ -107,18 +108,22 @@ public class BatchChanges
public final NodeProtoId newProtoId;
public final PrimitiveNode.Function newFunction;
public final PortProtoId[] assoc;
+ private final EPoint givenNewSize;
+
+
/**
* Constructs an object that represents a task to replace proto of node instance
*
* @param ni NodeInst to replace
* @param newProto new NodeProto
*/
- public NodeReplacement(NodeInst ni, NodeProto newProto, PrimitiveNode.Function newFunction)
+ public NodeReplacement(NodeInst ni, NodeProto newProto, PrimitiveNode.Function newFunction, EPoint newSize)
{
cellId = ni.getParent().getId();
nodeId = ni.getNodeId();
newProtoId = newProto.getId();
+ givenNewSize = newSize;
if (newFunction == null)
{
throw new NullPointerException();
@@ -127,7 +132,7 @@ public class BatchChanges
assoc = new PortProtoId[ni.getNumPortInsts()];
}
- /**
+ /**
* Returns NodeInst to be replaced
*
* @return NodeInst to be replaced
@@ -161,9 +166,14 @@ public class BatchChanges
PrimitiveNode oldPn = techPool.getPrimitiveNode((PrimitiveNodeId)oldProtoId);
ERectangle oldBaseRect = oldPn.getBaseRectangle();
ERectangle newBaseRect = pn.getBaseRectangle();
- newSize = EPoint.fromGrid(
- oldD.size.getGridX() + oldBaseRect.getGridWidth() - newBaseRect.getGridWidth(),
- oldD.size.getGridY() + oldBaseRect.getGridHeight() - newBaseRect.getGridHeight());
+ if (givenNewSize == null)
+ {
+ newSize = EPoint.fromGrid(
+ oldD.size.getGridX() + oldBaseRect.getGridWidth() - newBaseRect.getGridWidth(),
+ oldD.size.getGridY() + oldBaseRect.getGridHeight() - newBaseRect.getGridHeight());
+ }
+ else
+ newSize = givenNewSize;
} else
{
newSize = pn.getDefSize(ep);
diff --git a/com/sun/electric/database/hierarchy/Cell.java b/com/sun/electric/database/hierarchy/Cell.java
index 012f207..58e18e7 100644
--- a/com/sun/electric/database/hierarchy/Cell.java
+++ b/com/sun/electric/database/hierarchy/Cell.java
@@ -4,7 +4,7 @@
*
* File: Cell.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -4660,7 +4660,10 @@ public class Cell extends ElectricObject implements NodeProto, Comparable<Cell>
boolean isExpanded = isExpanded(ni.getNodeId());
if (isExpanded != defaultExpanded) {
String nodeName = "E" + ni.getName();
- cellPrefs.putBoolean(nodeName, isExpanded);
+ if (nodeName.length() < Preferences.MAX_KEY_LENGTH)
+ cellPrefs.putBoolean(nodeName, isExpanded);
+ else
+ System.out.println("Key string too long to store as Preference '" + nodeName + "'");
}
}
}
diff --git a/com/sun/electric/database/hierarchy/EDatabase.java b/com/sun/electric/database/hierarchy/EDatabase.java
index 6d2979b..07b3b01 100644
--- a/com/sun/electric/database/hierarchy/EDatabase.java
+++ b/com/sun/electric/database/hierarchy/EDatabase.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: EDatabase.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -628,7 +628,7 @@ public class EDatabase {
}
} else {
cellGroupsChanged = true;
- if (snapshot.libBackups.size() > 0) // Bug in BitSet.set(int,int) on Sun JDK
+ if (snapshot.libBackups.size() > 0) // Bug in BitSet.set(int,int) on JDK
{
cellNamesChangedInLibrary.set(0, snapshot.libBackups.size());
}
diff --git a/com/sun/electric/database/hierarchy/Export.java b/com/sun/electric/database/hierarchy/Export.java
index 7a293ca..931d5bc 100644
--- a/com/sun/electric/database/hierarchy/Export.java
+++ b/com/sun/electric/database/hierarchy/Export.java
@@ -4,7 +4,7 @@
*
* File: Export.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/hierarchy/HierarchyEnumerator.java b/com/sun/electric/database/hierarchy/HierarchyEnumerator.java
index 107de32..41b4e4a 100644
--- a/com/sun/electric/database/hierarchy/HierarchyEnumerator.java
+++ b/com/sun/electric/database/hierarchy/HierarchyEnumerator.java
@@ -4,7 +4,7 @@
*
* File: HierarchyEnumerator.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/hierarchy/Library.java b/com/sun/electric/database/hierarchy/Library.java
index ddc1481..fa91c71 100644
--- a/com/sun/electric/database/hierarchy/Library.java
+++ b/com/sun/electric/database/hierarchy/Library.java
@@ -4,7 +4,7 @@
*
* File: Library.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/hierarchy/Nodable.java b/com/sun/electric/database/hierarchy/Nodable.java
index 98d3320..60cbaf4 100644
--- a/com/sun/electric/database/hierarchy/Nodable.java
+++ b/com/sun/electric/database/hierarchy/Nodable.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: Nodable.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/hierarchy/ReplaceBuilder.java b/com/sun/electric/database/hierarchy/ReplaceBuilder.java
index 75bbed0..020048b 100644
--- a/com/sun/electric/database/hierarchy/ReplaceBuilder.java
+++ b/com/sun/electric/database/hierarchy/ReplaceBuilder.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ReplaceBuilder.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/hierarchy/View.java b/com/sun/electric/database/hierarchy/View.java
index 52724d0..849c035 100644
--- a/com/sun/electric/database/hierarchy/View.java
+++ b/com/sun/electric/database/hierarchy/View.java
@@ -4,7 +4,7 @@
*
* File: View.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/id/ArcProtoId.java b/com/sun/electric/database/id/ArcProtoId.java
index d751423..a59f3f3 100644
--- a/com/sun/electric/database/id/ArcProtoId.java
+++ b/com/sun/electric/database/id/ArcProtoId.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ArcProtoId.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/id/CellId.java b/com/sun/electric/database/id/CellId.java
index 16217af..302aafa 100644
--- a/com/sun/electric/database/id/CellId.java
+++ b/com/sun/electric/database/id/CellId.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: CellId.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/id/CellUsage.java b/com/sun/electric/database/id/CellUsage.java
index 318f2b9..98b5f80 100644
--- a/com/sun/electric/database/id/CellUsage.java
+++ b/com/sun/electric/database/id/CellUsage.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: CellUsage.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/id/ExportId.java b/com/sun/electric/database/id/ExportId.java
index d02475f..b056fab 100644
--- a/com/sun/electric/database/id/ExportId.java
+++ b/com/sun/electric/database/id/ExportId.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ExportId.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/id/IdManager.java b/com/sun/electric/database/id/IdManager.java
index 9ae4acf..7ff7e85 100644
--- a/com/sun/electric/database/id/IdManager.java
+++ b/com/sun/electric/database/id/IdManager.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: IdManager.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/id/IdReader.java b/com/sun/electric/database/id/IdReader.java
index e7b3b87..0235b0a 100644
--- a/com/sun/electric/database/id/IdReader.java
+++ b/com/sun/electric/database/id/IdReader.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: IdReader.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/id/IdWriter.java b/com/sun/electric/database/id/IdWriter.java
index e9763a0..0450743 100644
--- a/com/sun/electric/database/id/IdWriter.java
+++ b/com/sun/electric/database/id/IdWriter.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: IdWriter.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/id/LayerId.java b/com/sun/electric/database/id/LayerId.java
index a5dd933..721e131 100644
--- a/com/sun/electric/database/id/LayerId.java
+++ b/com/sun/electric/database/id/LayerId.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: LayerId.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/id/LibId.java b/com/sun/electric/database/id/LibId.java
index 498abd0..160251f 100644
--- a/com/sun/electric/database/id/LibId.java
+++ b/com/sun/electric/database/id/LibId.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: LibId.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/id/NodeProtoId.java b/com/sun/electric/database/id/NodeProtoId.java
index 7013b06..7f24c58 100644
--- a/com/sun/electric/database/id/NodeProtoId.java
+++ b/com/sun/electric/database/id/NodeProtoId.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: NodeProtoId.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/id/PortProtoId.java b/com/sun/electric/database/id/PortProtoId.java
index 08ddd9a..0fbde9a 100644
--- a/com/sun/electric/database/id/PortProtoId.java
+++ b/com/sun/electric/database/id/PortProtoId.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: PortProtoId.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/id/PrimitiveNodeId.java b/com/sun/electric/database/id/PrimitiveNodeId.java
index bfef39e..03523af 100644
--- a/com/sun/electric/database/id/PrimitiveNodeId.java
+++ b/com/sun/electric/database/id/PrimitiveNodeId.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: PrimitiveNodeId.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/id/PrimitivePortId.java b/com/sun/electric/database/id/PrimitivePortId.java
index 226c397..fa54425 100644
--- a/com/sun/electric/database/id/PrimitivePortId.java
+++ b/com/sun/electric/database/id/PrimitivePortId.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: PrimitivePortId.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/id/TechId.java b/com/sun/electric/database/id/TechId.java
index d1079a7..4f85da4 100644
--- a/com/sun/electric/database/id/TechId.java
+++ b/com/sun/electric/database/id/TechId.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: TechId.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/network/Global.java b/com/sun/electric/database/network/Global.java
index 1d87b81..0c8dae7 100644
--- a/com/sun/electric/database/network/Global.java
+++ b/com/sun/electric/database/network/Global.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: Global.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/network/NetCell.java b/com/sun/electric/database/network/NetCell.java
index 1211c10..0c10a31 100644
--- a/com/sun/electric/database/network/NetCell.java
+++ b/com/sun/electric/database/network/NetCell.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: NetCell.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/network/NetSchem.java b/com/sun/electric/database/network/NetSchem.java
index e45a855..1e3d6f2 100644
--- a/com/sun/electric/database/network/NetSchem.java
+++ b/com/sun/electric/database/network/NetSchem.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: NetSchem.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/network/Netlist.java b/com/sun/electric/database/network/Netlist.java
index ba88dab..b81a47a 100644
--- a/com/sun/electric/database/network/Netlist.java
+++ b/com/sun/electric/database/network/Netlist.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: Netlist.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -955,20 +955,22 @@ public abstract class Netlist {
return false;
}
if (no1 instanceof IconNodeInst || no2 instanceof IconNodeInst) {
- int portWidth1 = pp1.getNameKey().busWidth();
- int portWidth2 = pp2.getNameKey().busWidth();
+ Name portName1 = pp1.getNameKey();
+ Name portName2 = pp2.getNameKey();
+ int portWidth1 = portName1.busWidth();
+ int portWidth2 = portName2.busWidth();
for (int i = 0; i < busWidth1; i++) {
int netIndex1;
if (no1 instanceof IconNodeInst) {
- netIndex1 = getNetIndex(((IconNodeInst) no1).getNodable(i / portWidth1), pp1, i % portWidth1);
+ netIndex1 = getNetIndex(((IconNodeInst) no1).getNodable(i / portWidth1), portName1.subname(i % portWidth1));
} else {
netIndex1 = getNetIndex(no1, pp1, i);
}
int netIndex2;
if (no2 instanceof IconNodeInst) {
- netIndex2 = getNetIndex(((IconNodeInst) no2).getNodable(i / portWidth2), pp2, i % portWidth2);
+ netIndex2 = getNetIndex(((IconNodeInst) no2).getNodable(i / portWidth2), portName2.subname(i % portWidth2));
} else {
- netIndex2 = getNetIndex(no1, pp1, i);
+ netIndex2 = getNetIndex(no2, pp2, i);
}
if (netIndex1 != netIndex2) {
return false;
diff --git a/com/sun/electric/database/network/NetlistImpl.java b/com/sun/electric/database/network/NetlistImpl.java
index 0500d41..35c5af4 100644
--- a/com/sun/electric/database/network/NetlistImpl.java
+++ b/com/sun/electric/database/network/NetlistImpl.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: NetlistImpl.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/network/NetlistShorted.java b/com/sun/electric/database/network/NetlistShorted.java
index 12107ad..4d30b7d 100644
--- a/com/sun/electric/database/network/NetlistShorted.java
+++ b/com/sun/electric/database/network/NetlistShorted.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: NetlistShorted.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/network/Network.java b/com/sun/electric/database/network/Network.java
index e6a3b3a..cb12b08 100644
--- a/com/sun/electric/database/network/Network.java
+++ b/com/sun/electric/database/network/Network.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: Network.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/network/NetworkManager.java b/com/sun/electric/database/network/NetworkManager.java
index 29e59d0..726a433 100644
--- a/com/sun/electric/database/network/NetworkManager.java
+++ b/com/sun/electric/database/network/NetworkManager.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: NetworkTool.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/network/NetworkTool.java b/com/sun/electric/database/network/NetworkTool.java
index 2f5e1a0..71f7c15 100644
--- a/com/sun/electric/database/network/NetworkTool.java
+++ b/com/sun/electric/database/network/NetworkTool.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: NetworkTool.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/prototype/NodeProto.java b/com/sun/electric/database/prototype/NodeProto.java
index 87a91a9..08c8ee2 100644
--- a/com/sun/electric/database/prototype/NodeProto.java
+++ b/com/sun/electric/database/prototype/NodeProto.java
@@ -4,7 +4,7 @@
*
* File: NodeProto.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/prototype/PortCharacteristic.java b/com/sun/electric/database/prototype/PortCharacteristic.java
index 5926ddf..886b3c3 100644
--- a/com/sun/electric/database/prototype/PortCharacteristic.java
+++ b/com/sun/electric/database/prototype/PortCharacteristic.java
@@ -4,7 +4,7 @@
*
* File: PortCharacteristic.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/prototype/PortOriginal.java b/com/sun/electric/database/prototype/PortOriginal.java
index 6a98edb..942dfeb 100644
--- a/com/sun/electric/database/prototype/PortOriginal.java
+++ b/com/sun/electric/database/prototype/PortOriginal.java
@@ -4,7 +4,7 @@
*
* File: PortOriginal.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/prototype/PortProto.java b/com/sun/electric/database/prototype/PortProto.java
index 2f7031c..744e477 100644
--- a/com/sun/electric/database/prototype/PortProto.java
+++ b/com/sun/electric/database/prototype/PortProto.java
@@ -4,7 +4,7 @@
*
* File: PortProto.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/text/CellName.java b/com/sun/electric/database/text/CellName.java
index 8886213..bbf77a5 100644
--- a/com/sun/electric/database/text/CellName.java
+++ b/com/sun/electric/database/text/CellName.java
@@ -4,7 +4,7 @@
*
* File: CellName.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/text/EFormatter.java b/com/sun/electric/database/text/EFormatter.java
index e05b6fe..a479a25 100644
--- a/com/sun/electric/database/text/EFormatter.java
+++ b/com/sun/electric/database/text/EFormatter.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: EFormatter.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/text/EmptyPreferencesFactory.java b/com/sun/electric/database/text/EmptyPreferencesFactory.java
index 48a8eea..b2ccf7a 100644
--- a/com/sun/electric/database/text/EmptyPreferencesFactory.java
+++ b/com/sun/electric/database/text/EmptyPreferencesFactory.java
@@ -4,7 +4,7 @@
*
* File: Pref.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/text/Name.java b/com/sun/electric/database/text/Name.java
index 2923368..14116a3 100644
--- a/com/sun/electric/database/text/Name.java
+++ b/com/sun/electric/database/text/Name.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: Name.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/text/NameImpl.java b/com/sun/electric/database/text/NameImpl.java
index 62c178f..e5fc8ce 100644
--- a/com/sun/electric/database/text/NameImpl.java
+++ b/com/sun/electric/database/text/NameImpl.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: NameImpl.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/text/Pref.java b/com/sun/electric/database/text/Pref.java
index d9ffad4..4d2bf73 100644
--- a/com/sun/electric/database/text/Pref.java
+++ b/com/sun/electric/database/text/Pref.java
@@ -4,7 +4,7 @@
*
* File: Pref.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/text/PrefPackage.java b/com/sun/electric/database/text/PrefPackage.java
index 531006c..d2f0181 100644
--- a/com/sun/electric/database/text/PrefPackage.java
+++ b/com/sun/electric/database/text/PrefPackage.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: PrefPackage.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/text/Setting.java b/com/sun/electric/database/text/Setting.java
index e61bec8..c4149b4 100644
--- a/com/sun/electric/database/text/Setting.java
+++ b/com/sun/electric/database/text/Setting.java
@@ -4,7 +4,7 @@
*
* File: Setting.java
*
- * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/text/TempPref.java b/com/sun/electric/database/text/TempPref.java
index 57c2300..ee2ee82 100644
--- a/com/sun/electric/database/text/TempPref.java
+++ b/com/sun/electric/database/text/TempPref.java
@@ -4,7 +4,7 @@
*
* File: TempPref.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/text/TextUtils.java b/com/sun/electric/database/text/TextUtils.java
index d7be4d0..fa321bd 100644
--- a/com/sun/electric/database/text/TextUtils.java
+++ b/com/sun/electric/database/text/TextUtils.java
@@ -4,7 +4,7 @@
*
* File: TextUtils.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/text/Version.java b/com/sun/electric/database/text/Version.java
index ee6bbf0..44815ac 100644
--- a/com/sun/electric/database/text/Version.java
+++ b/com/sun/electric/database/text/Version.java
@@ -4,7 +4,7 @@
*
* File: Version.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -21,7 +21,13 @@
*/
package com.sun.electric.database.text;
+import java.io.File;
import java.io.Serializable;
+import java.text.DateFormat;
+import java.util.Date;
+import java.util.StringTokenizer;
+
+import com.sun.electric.tool.user.ActivityLogger;
/**
* A Version is a text-parsing object for Electric's version number.
@@ -56,7 +62,7 @@ public class Version implements Comparable<Version>, Serializable {
* THE TEXT ON THAT LINE IS PARSED BY the Ant file (packaging/build.xml)
* AND THE PARSING MAY FAIL IF THE LINE IS ALTERED.
*/
- public static final String ELECTRIC_VERSION = "9.06";
+ public static final String ELECTRIC_VERSION = "9.07";
private final String version;
private final String oldStyle;
@@ -144,10 +150,10 @@ public class Version implements Comparable<Version>, Serializable {
/**
* Method to return copyright information
- * @return Oracle copyright.
+ * @return copyright.
*/
public static String getCopyrightInformation() {
- return "Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.";
+ return "Copyright (c) 2016, Static Free Software. All rights reserved.";
}
/**
@@ -184,7 +190,6 @@ public class Version implements Comparable<Version>, Serializable {
* @return string containing the date in short format
*/
public static String getBuildDate() {
- return buildDate;
// // Might need to adjust token delim depending on operating system
// StringTokenizer parse = new StringTokenizer(System.getProperty("java.class.path"));
// String delim = System.getProperty("path.separator");
@@ -192,7 +197,8 @@ public class Version implements Comparable<Version>, Serializable {
// while (parse.hasMoreElements()) {
// String val = parse.nextToken(delim);
// // Find path for main jar
-// String filename = ROOTARNAME + ".jar";
+// String filename = "electric.jar";
+// System.out.println("PAth " + val);
// if (val.lastIndexOf(filename) != -1) {
// File electricJar = new File(val);
// long date = electricJar.lastModified();
@@ -203,6 +209,7 @@ public class Version implements Comparable<Version>, Serializable {
// } catch (Exception e) {
// ActivityLogger.logException(e);
// }
+ return buildDate;
// return (null);
}
diff --git a/com/sun/electric/database/topology/ArcInst.java b/com/sun/electric/database/topology/ArcInst.java
index 0377e44..200fbe5 100644
--- a/com/sun/electric/database/topology/ArcInst.java
+++ b/com/sun/electric/database/topology/ArcInst.java
@@ -4,7 +4,7 @@
*
* File: ArcInst.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/topology/Connection.java b/com/sun/electric/database/topology/Connection.java
index d53132f..1321440 100644
--- a/com/sun/electric/database/topology/Connection.java
+++ b/com/sun/electric/database/topology/Connection.java
@@ -4,7 +4,7 @@
*
* File: Connection.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/topology/Geometric.java b/com/sun/electric/database/topology/Geometric.java
index 0e931c8..174054c 100644
--- a/com/sun/electric/database/topology/Geometric.java
+++ b/com/sun/electric/database/topology/Geometric.java
@@ -4,7 +4,7 @@
*
* File: Geometric.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/topology/HeadConnection.java b/com/sun/electric/database/topology/HeadConnection.java
index 1b0079f..846fcbd 100644
--- a/com/sun/electric/database/topology/HeadConnection.java
+++ b/com/sun/electric/database/topology/HeadConnection.java
@@ -4,7 +4,7 @@
*
* File: HeadConnection.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/topology/IconNodeInst.java b/com/sun/electric/database/topology/IconNodeInst.java
index 9b8f7f0..508009b 100644
--- a/com/sun/electric/database/topology/IconNodeInst.java
+++ b/com/sun/electric/database/topology/IconNodeInst.java
@@ -4,7 +4,7 @@
*
* File: IconNodeInst.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/topology/NodeInst.java b/com/sun/electric/database/topology/NodeInst.java
index fd42b41..b51d031 100644
--- a/com/sun/electric/database/topology/NodeInst.java
+++ b/com/sun/electric/database/topology/NodeInst.java
@@ -4,7 +4,7 @@
*
* File: NodeInst.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -839,7 +839,7 @@ public class NodeInst extends Geometric implements Nodable, Comparable<NodeInst>
* Returns null if there is an error doing the replacement.
*/
public NodeInst replace(NodeProto np, EditingPreferences ep, boolean ignorePortNames, boolean allowMissingPorts, boolean preserveParameters) {
- BatchChanges.NodeReplacement replacement = new BatchChanges.NodeReplacement(this, np, PrimitiveNode.Function.UNKNOWN);
+ BatchChanges.NodeReplacement replacement = new BatchChanges.NodeReplacement(this, np, PrimitiveNode.Function.UNKNOWN, null);
if (checkReplacement(replacement, ep, ignorePortNames, allowMissingPorts)) {
return doReplace(replacement, ep, allowMissingPorts, preserveParameters);
} else {
diff --git a/com/sun/electric/database/topology/PortInst.java b/com/sun/electric/database/topology/PortInst.java
index a7f63c2..e29ee60 100644
--- a/com/sun/electric/database/topology/PortInst.java
+++ b/com/sun/electric/database/topology/PortInst.java
@@ -4,7 +4,7 @@
*
* File: PortInst.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/topology/RTBounds.java b/com/sun/electric/database/topology/RTBounds.java
index 68e312d..4b12867 100644
--- a/com/sun/electric/database/topology/RTBounds.java
+++ b/com/sun/electric/database/topology/RTBounds.java
@@ -4,7 +4,7 @@
*
* File: RTBoundsFixp.java
*
- * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/topology/RTNode.java b/com/sun/electric/database/topology/RTNode.java
index b77f812..93e9fe3 100644
--- a/com/sun/electric/database/topology/RTNode.java
+++ b/com/sun/electric/database/topology/RTNode.java
@@ -4,7 +4,7 @@
*
* File: RTNode.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/topology/SteinerTree.java b/com/sun/electric/database/topology/SteinerTree.java
index 4d98a18..13bcf80 100644
--- a/com/sun/electric/database/topology/SteinerTree.java
+++ b/com/sun/electric/database/topology/SteinerTree.java
@@ -5,7 +5,7 @@
* File: SteinerTree.java
* Written by: Steven Rubin.
*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -24,9 +24,9 @@ package com.sun.electric.database.topology;
import com.sun.electric.database.geometry.EPoint;
import com.sun.electric.database.text.TextUtils;
+import com.sun.electric.tool.Job;
import com.sun.electric.util.ElapseTimer;
-import java.awt.Dimension;
import java.awt.geom.Point2D;
import java.lang.reflect.Method;
import java.util.ArrayList;
@@ -68,17 +68,37 @@ public class SteinerTree
public static class SteinerTreePortPair implements Comparable
{
private SteinerTreePort p1, p2;
+ private List<PortInst> spineTapPorts;
public SteinerTreePortPair(SteinerTreePort p1, SteinerTreePort p2)
{
this.p1 = p1;
this.p2 = p2;
+ spineTapPorts = null;
}
public SteinerTreePort getPort1() { return p1; }
public SteinerTreePort getPort2() { return p2; }
+ /**
+ * Method to return a List of PortInst objects that should be
+ * inserted into this port pair, spine-style.
+ * @return a list of spine tap PortInst objects.
+ */
+ public List<PortInst> getSpineTaps() { return spineTapPorts; }
+
+ /**
+ * Method to add an intermediate PortInst that will be inserted, spine-style,
+ * between the two ports in the Steiner Tree.
+ * @param pi the tap port to insert.
+ */
+ public void addTapPort(PortInst pi)
+ {
+ if (spineTapPorts == null) spineTapPorts = new ArrayList<PortInst>();
+ spineTapPorts.add(pi);
+ }
+
public int compareTo(Object o)
{
SteinerTreePortPair other = (SteinerTreePortPair)o;
@@ -93,8 +113,9 @@ public class SteinerTree
/**
* Constructor takes a list of
* @param portList a List of SteinerTreePort objects that are to be organized into a Steiner Tree.
+ * @param disableAdvancedCode true to ignore private, advanced code for this.
*/
- public SteinerTree(List<SteinerTreePort> portList)
+ public SteinerTree(List<SteinerTreePort> portList, boolean disableAdvancedCode)
{
// the final list of edges in the Steiner tree
pairs = new ArrayList<SteinerTreePortPair>();
@@ -105,11 +126,12 @@ public class SteinerTree
ElapseTimer timerNew = ElapseTimer.createInstance();
ElapseTimer timerOld = ElapseTimer.createInstance();
- // new code for steiner trees (minimum spanning tree computation)
- if (hasMST() && portList.size() > 2)
+ // advanced code for steiner trees (minimum spanning tree computation)
+ if (!disableAdvancedCode && hasMST() && portList.size() > 2)
{
// run special MST code
Point2D[] points = new Point2D[portList.size()];
+
for(int i=0; i<portList.size(); i++)
{
SteinerTreePort stpThis = portList.get(i);
@@ -121,6 +143,8 @@ public class SteinerTree
try {
result = (int[])doMSTMethod.invoke(mstClass, new Object[] {points});
} catch (Exception e) {
+ if (Job.getDebug())
+ e.printStackTrace();
System.out.println("Error running the new Steiner Tree module (" + e.getClass() + ")");
}
@@ -186,7 +210,9 @@ public class SteinerTree
if (COMPAREMETHODS)
{
timerOld.end();
- System.out.println("Steiner Tree computation on " + portList.size() + " points: old code took: " + timerOld + ", new code took: " + timerNew);
+ System.out.println("Steiner Tree computation on " + portList.size()
+ + " points: old code took: " + timerOld + ", new code took: "
+ + timerNew + " on newpoints " + newPairs.size());
// compare with new code
if (newPairs.size() > 0)
@@ -259,7 +285,7 @@ public class SteinerTree
private static boolean mstChecked = false;
private static Class<?> mstClass;
- private static Method doMSTMethod;
+ private static Method doMSTMethod = null;
/**
* Method to tell whether Minimum Spanning Tree code is available.
@@ -272,6 +298,7 @@ public class SteinerTree
mstChecked = true;
try {
mstClass = Class.forName("com.oracle.labs.mso.mst.MST");
+ //mstClass = Class.forName("com.oracle.labs.mso.minspantree.MinSpanTree"); // this fails regression
doMSTMethod = mstClass.getMethod("doMST", new Class[]{Point2D[].class});
} catch (Exception e) {}
}
diff --git a/com/sun/electric/database/topology/TailConnection.java b/com/sun/electric/database/topology/TailConnection.java
index 5cff283..5820085 100644
--- a/com/sun/electric/database/topology/TailConnection.java
+++ b/com/sun/electric/database/topology/TailConnection.java
@@ -4,7 +4,7 @@
*
* File: TailConnection.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/topology/Topology.java b/com/sun/electric/database/topology/Topology.java
index 7d95e9e..54f6379 100644
--- a/com/sun/electric/database/topology/Topology.java
+++ b/com/sun/electric/database/topology/Topology.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: Topology.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/variable/AbstractTextDescriptor.java b/com/sun/electric/database/variable/AbstractTextDescriptor.java
index f4533ee..4b51fc9 100644
--- a/com/sun/electric/database/variable/AbstractTextDescriptor.java
+++ b/com/sun/electric/database/variable/AbstractTextDescriptor.java
@@ -4,7 +4,7 @@
*
* File: AbstractTextDescriptor.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/variable/CodeExpression.java b/com/sun/electric/database/variable/CodeExpression.java
index 3abe3b9..34c63e8 100644
--- a/com/sun/electric/database/variable/CodeExpression.java
+++ b/com/sun/electric/database/variable/CodeExpression.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: CodeExpression.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/variable/DisplayedText.java b/com/sun/electric/database/variable/DisplayedText.java
index cd05367..989c586 100644
--- a/com/sun/electric/database/variable/DisplayedText.java
+++ b/com/sun/electric/database/variable/DisplayedText.java
@@ -4,7 +4,7 @@
*
* File: DisplayedText.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/variable/EditWindow0.java b/com/sun/electric/database/variable/EditWindow0.java
index 4d04aa6..4d00fc5 100644
--- a/com/sun/electric/database/variable/EditWindow0.java
+++ b/com/sun/electric/database/variable/EditWindow0.java
@@ -4,7 +4,7 @@
*
* File: EditWindow0.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/variable/EditWindow_.java b/com/sun/electric/database/variable/EditWindow_.java
index e83579a..46d09eb 100644
--- a/com/sun/electric/database/variable/EditWindow_.java
+++ b/com/sun/electric/database/variable/EditWindow_.java
@@ -4,7 +4,7 @@
*
* File: EditWindow_.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/variable/ElectricObject.java b/com/sun/electric/database/variable/ElectricObject.java
index fe47402..fd56db6 100644
--- a/com/sun/electric/database/variable/ElectricObject.java
+++ b/com/sun/electric/database/variable/ElectricObject.java
@@ -4,7 +4,7 @@
*
* File: ElectricObject.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/variable/MutableTextDescriptor.java b/com/sun/electric/database/variable/MutableTextDescriptor.java
index 07cc3f1..f265460 100644
--- a/com/sun/electric/database/variable/MutableTextDescriptor.java
+++ b/com/sun/electric/database/variable/MutableTextDescriptor.java
@@ -4,7 +4,7 @@
*
* File: TextDescriptor.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/variable/TextDescriptor.java b/com/sun/electric/database/variable/TextDescriptor.java
index e56f04d..78226df 100644
--- a/com/sun/electric/database/variable/TextDescriptor.java
+++ b/com/sun/electric/database/variable/TextDescriptor.java
@@ -4,7 +4,7 @@
*
* File: ImmutableTextDescriptor.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/variable/UserInterface.java b/com/sun/electric/database/variable/UserInterface.java
index 046b68b..a341405 100644
--- a/com/sun/electric/database/variable/UserInterface.java
+++ b/com/sun/electric/database/variable/UserInterface.java
@@ -4,7 +4,7 @@
*
* File: UserInterface.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/variable/VarContext.java b/com/sun/electric/database/variable/VarContext.java
index dcbf62f..cd7f717 100644
--- a/com/sun/electric/database/variable/VarContext.java
+++ b/com/sun/electric/database/variable/VarContext.java
@@ -4,7 +4,7 @@
*
* File: VarContext.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/variable/Variable.java b/com/sun/electric/database/variable/Variable.java
index 6613c9f..c764067 100644
--- a/com/sun/electric/database/variable/Variable.java
+++ b/com/sun/electric/database/variable/Variable.java
@@ -4,7 +4,7 @@
*
* File: Variable.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -876,6 +876,9 @@ public class Variable implements Serializable {
if (name.equals("ART_message")) {
return "Annotation text";
}
+ if (name.equals("GDS_text")) {
+ return "Text for GDS output";
+ }
if (name.equals("GEN_routing_exclusion")) {
return "Routing exclusion layers";
}
diff --git a/com/sun/electric/lib/LibFile.java b/com/sun/electric/lib/LibFile.java
index 0e24fb2..8ac7f17 100644
--- a/com/sun/electric/lib/LibFile.java
+++ b/com/sun/electric/lib/LibFile.java
@@ -4,7 +4,7 @@
*
* File: LibFile.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/plugins/j3d/J3DKeyBehavior.java b/com/sun/electric/plugins/j3d/J3DKeyBehavior.java
index 31d3bbf..ff8be70 100644
--- a/com/sun/electric/plugins/j3d/J3DKeyBehavior.java
+++ b/com/sun/electric/plugins/j3d/J3DKeyBehavior.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: J3DKeyBehavior.java
- * Written by Gilda Garreton, Sun Microsystems.
+ * Written by Gilda Garreton.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/plugins/j3d/J3DKeyCollision.java b/com/sun/electric/plugins/j3d/J3DKeyCollision.java
index 30d0a2b..55a605a 100644
--- a/com/sun/electric/plugins/j3d/J3DKeyCollision.java
+++ b/com/sun/electric/plugins/j3d/J3DKeyCollision.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: J3DKeyCollision.java
- * Written by Gilda Garreton, Sun Microsystems.
+ * Written by Gilda Garreton.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/plugins/j3d/JMouseRotate.java b/com/sun/electric/plugins/j3d/JMouseRotate.java
index bb027cf..f333d39 100644
--- a/com/sun/electric/plugins/j3d/JMouseRotate.java
+++ b/com/sun/electric/plugins/j3d/JMouseRotate.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: JMouseRotate.java
- * Written by Gilda Garreton, Sun Microsystems.
+ * Written by Gilda Garreton.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/plugins/j3d/JMouseTranslate.java b/com/sun/electric/plugins/j3d/JMouseTranslate.java
index fc4e1b6..42bb8f3 100644
--- a/com/sun/electric/plugins/j3d/JMouseTranslate.java
+++ b/com/sun/electric/plugins/j3d/JMouseTranslate.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: JMouseTranslate.java
- * Written by Gilda Garreton, Sun Microsystems.
+ * Written by Gilda Garreton.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/plugins/j3d/JMouseZoom.java b/com/sun/electric/plugins/j3d/JMouseZoom.java
index cdb448c..2d96a19 100644
--- a/com/sun/electric/plugins/j3d/JMouseZoom.java
+++ b/com/sun/electric/plugins/j3d/JMouseZoom.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: JMouseZoom.java
- * Written by Gilda Garreton, Sun Microsystems.
+ * Written by Gilda Garreton.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/plugins/j3d/View3DWindow.java b/com/sun/electric/plugins/j3d/View3DWindow.java
index 5ca27e5..f88eace 100644
--- a/com/sun/electric/plugins/j3d/View3DWindow.java
+++ b/com/sun/electric/plugins/j3d/View3DWindow.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: View3DWindow.java
- * Written by Gilda Garreton, Sun Microsystems.
+ * Written by Gilda Garreton.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/plugins/j3d/ui/J3DDemoDialog.java b/com/sun/electric/plugins/j3d/ui/J3DDemoDialog.java
index 19788f8..1fb4a46 100644
--- a/com/sun/electric/plugins/j3d/ui/J3DDemoDialog.java
+++ b/com/sun/electric/plugins/j3d/ui/J3DDemoDialog.java
@@ -4,7 +4,7 @@
*
* File: J3DDemoDialog.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/plugins/j3d/ui/J3DMenu.java b/com/sun/electric/plugins/j3d/ui/J3DMenu.java
index a4e8b5c..e668d7a 100644
--- a/com/sun/electric/plugins/j3d/ui/J3DMenu.java
+++ b/com/sun/electric/plugins/j3d/ui/J3DMenu.java
@@ -4,7 +4,7 @@
*
* File: J3DMenu.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/plugins/j3d/ui/J3DViewDialog.java b/com/sun/electric/plugins/j3d/ui/J3DViewDialog.java
index 2a0f29b..2e639a1 100644
--- a/com/sun/electric/plugins/j3d/ui/J3DViewDialog.java
+++ b/com/sun/electric/plugins/j3d/ui/J3DViewDialog.java
@@ -4,7 +4,7 @@
*
* File: J3DViewDialog.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/plugins/j3d/ui/JThreeDSideView.java b/com/sun/electric/plugins/j3d/ui/JThreeDSideView.java
index 02e692d..ac18e7c 100644
--- a/com/sun/electric/plugins/j3d/ui/JThreeDSideView.java
+++ b/com/sun/electric/plugins/j3d/ui/JThreeDSideView.java
@@ -4,7 +4,7 @@
*
* File: JThreeDSideView.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/plugins/j3d/ui/JThreeDTab.java b/com/sun/electric/plugins/j3d/ui/JThreeDTab.java
index 66292d5..93c42a2 100644
--- a/com/sun/electric/plugins/j3d/ui/JThreeDTab.java
+++ b/com/sun/electric/plugins/j3d/ui/JThreeDTab.java
@@ -4,7 +4,7 @@
*
* File: JThreeDTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/plugins/j3d/utils/J3DAlpha.java b/com/sun/electric/plugins/j3d/utils/J3DAlpha.java
index 36acde0..1039426 100644
--- a/com/sun/electric/plugins/j3d/utils/J3DAlpha.java
+++ b/com/sun/electric/plugins/j3d/utils/J3DAlpha.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: J3DAlpha.java
- * Written by Gilda Garreton, Sun Microsystems.
+ * Written by Gilda Garreton.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/plugins/j3d/utils/J3DAppearance.java b/com/sun/electric/plugins/j3d/utils/J3DAppearance.java
index 3bb0ca6..1aa788f 100644
--- a/com/sun/electric/plugins/j3d/utils/J3DAppearance.java
+++ b/com/sun/electric/plugins/j3d/utils/J3DAppearance.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: J3DAppearance.java
- * Written by Gilda Garreton, Sun Microsystems.
+ * Written by Gilda Garreton.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/plugins/j3d/utils/J3DAxis.java b/com/sun/electric/plugins/j3d/utils/J3DAxis.java
index 791ee28..00e49dc 100644
--- a/com/sun/electric/plugins/j3d/utils/J3DAxis.java
+++ b/com/sun/electric/plugins/j3d/utils/J3DAxis.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: J3DAxis.java
- * Written by Gilda Garreton, Sun Microsystems.
+ * Written by Gilda Garreton.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/plugins/j3d/utils/J3DCanvas3D.java b/com/sun/electric/plugins/j3d/utils/J3DCanvas3D.java
index ce49521..2709c23 100644
--- a/com/sun/electric/plugins/j3d/utils/J3DCanvas3D.java
+++ b/com/sun/electric/plugins/j3d/utils/J3DCanvas3D.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: J3DCanvas3D.java
- * Written by Gilda Garreton, Sun Microsystems.
+ * Written by Gilda Garreton.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/plugins/j3d/utils/J3DClientApp.java b/com/sun/electric/plugins/j3d/utils/J3DClientApp.java
index 97691a6..9c5dad0 100644
--- a/com/sun/electric/plugins/j3d/utils/J3DClientApp.java
+++ b/com/sun/electric/plugins/j3d/utils/J3DClientApp.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: J3DClientApp.java
- * Written by Gilda Garreton, Sun Microsystems.
+ * Written by Gilda Garreton.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/plugins/j3d/utils/J3DSerialization.java b/com/sun/electric/plugins/j3d/utils/J3DSerialization.java
index 94029b5..3e4462c 100644
--- a/com/sun/electric/plugins/j3d/utils/J3DSerialization.java
+++ b/com/sun/electric/plugins/j3d/utils/J3DSerialization.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: J3DSerialization.java
- * Written by Gilda Garreton, Sun Microsystems.
+ * Written by Gilda Garreton.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/plugins/j3d/utils/J3DServerApp.java b/com/sun/electric/plugins/j3d/utils/J3DServerApp.java
index 4daed8d..060f11c 100644
--- a/com/sun/electric/plugins/j3d/utils/J3DServerApp.java
+++ b/com/sun/electric/plugins/j3d/utils/J3DServerApp.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: J3DServerApp.java
- * Written by Gilda Garreton, Sun Microsystems.
+ * Written by Gilda Garreton.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/plugins/j3d/utils/J3DUtils.java b/com/sun/electric/plugins/j3d/utils/J3DUtils.java
index eb8829b..856ab25 100644
--- a/com/sun/electric/plugins/j3d/utils/J3DUtils.java
+++ b/com/sun/electric/plugins/j3d/utils/J3DUtils.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: J3DUtils.java
- * Written by Gilda Garreton, Sun Microsystems.
+ * Written by Gilda Garreton.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -1187,7 +1187,7 @@ public final class J3DUtils
* From Selman's book
* @param axis
* @param angle
- * @return
+ * @return the angle.
*/
private static Quat4f createQuaternionFromAxisAndAngle( Vector3d axis, double angle )
{
diff --git a/com/sun/electric/plugins/minarea/bitmapjava/BitMapMinAreaChecker.java b/com/sun/electric/plugins/minarea/bitmapjava/BitMapMinAreaChecker.java
index b92dfd3..2f1f845 100644
--- a/com/sun/electric/plugins/minarea/bitmapjava/BitMapMinAreaChecker.java
+++ b/com/sun/electric/plugins/minarea/bitmapjava/BitMapMinAreaChecker.java
@@ -4,7 +4,7 @@
*
* File: BitMapMinAreaChecker.java
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/plugins/minarea/bitmapscala/BitMapMinAreaChecker.scala b/com/sun/electric/plugins/minarea/bitmapscala/BitMapMinAreaChecker.scala
index 9ff47e0..8ea6538 100644
--- a/com/sun/electric/plugins/minarea/bitmapscala/BitMapMinAreaChecker.scala
+++ b/com/sun/electric/plugins/minarea/bitmapscala/BitMapMinAreaChecker.scala
@@ -4,7 +4,7 @@
*
* File: BitMapMinAreaChecker.scala
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -26,6 +26,7 @@ import com.sun.electric.api.minarea.geometry.{Point, Shapes}
import java.util.{BitSet, Properties}
import scala.collection.immutable.TreeSet
import scala.collection.mutable.{Stack, HashMap, ArrayBuffer}
+import scala.language.implicitConversions
class BitMapMinAreaChecker extends MinAreaChecker {
val DEBUG = 0
diff --git a/com/sun/electric/plugins/minarea/deltamerge0/SimpleChecker.java b/com/sun/electric/plugins/minarea/deltamerge0/SimpleChecker.java
index 62a9ece..3f50ad8 100644
--- a/com/sun/electric/plugins/minarea/deltamerge0/SimpleChecker.java
+++ b/com/sun/electric/plugins/minarea/deltamerge0/SimpleChecker.java
@@ -4,7 +4,7 @@
*
* File: SimpleChecker.java
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/plugins/minarea/deltamerge1/DeltaMerge.scala b/com/sun/electric/plugins/minarea/deltamerge1/DeltaMerge.scala
index e59ff97..b4b222b 100644
--- a/com/sun/electric/plugins/minarea/deltamerge1/DeltaMerge.scala
+++ b/com/sun/electric/plugins/minarea/deltamerge1/DeltaMerge.scala
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: DeltaMerge.scala
- * Written by Dmitry Nadezhin, Sun Microsystems.
+ * Written by Dmitry Nadezhin.
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/plugins/minarea/deltamerge1/PointsSorter.scala b/com/sun/electric/plugins/minarea/deltamerge1/PointsSorter.scala
index 0062020..4997592 100644
--- a/com/sun/electric/plugins/minarea/deltamerge1/PointsSorter.scala
+++ b/com/sun/electric/plugins/minarea/deltamerge1/PointsSorter.scala
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: PointsSorter.scala
- * Written by Dmitry Nadezhin, Sun Microsystems.
+ * Written by Dmitry Nadezhin.
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/plugins/minarea/deltamerge1/SimpleChecker.scala b/com/sun/electric/plugins/minarea/deltamerge1/SimpleChecker.scala
index c2cf7c9..be327d4 100644
--- a/com/sun/electric/plugins/minarea/deltamerge1/SimpleChecker.scala
+++ b/com/sun/electric/plugins/minarea/deltamerge1/SimpleChecker.scala
@@ -4,7 +4,7 @@
*
* File: SimpleChecker.java
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -35,7 +35,8 @@ import java.io.DataOutputStream;
import java.util.BitSet
import java.util.Properties
-import scala.actors.Futures.future
+//import scala.concurrent.Future
+//import scala.concurrent.ExecutionContext.Implicits.global
import scala.collection.immutable.TreeSet
import scala.collection.mutable.ArrayBuffer
import scala.collection.mutable.HashMap
@@ -47,7 +48,7 @@ import scala.math.{min, max}
* Simple MinAreaChecker
*/
object SimpleChecker {
- val PARALLEL = true
+ val PARALLEL = false
val DEBUG = 0
val DEFAULT_RECTS_PER_STRIPE: java.lang.Long = 100000
}
@@ -138,11 +139,11 @@ class CheckerTask(topCell: LayoutCell, minArea: Long, errorLogger: ErrorLogger)
for (i <- 0 until numStripes) {
val stripeChecker = new StripeChecker(this, x(i), x(i + 1))
- if (SimpleChecker.PARALLEL) {
- exts(i) = future { stripeChecker() }
- } else {
+// if (SimpleChecker.PARALLEL) {
+// exts(i) = Future { stripeChecker() }
+// } else {
exts(i) = stripeChecker
- }
+// }
}
// serial reduce
diff --git a/com/sun/electric/plugins/minarea/deltamerge1/StripeExts.scala b/com/sun/electric/plugins/minarea/deltamerge1/StripeExts.scala
index 930230f..1c213cd 100644
--- a/com/sun/electric/plugins/minarea/deltamerge1/StripeExts.scala
+++ b/com/sun/electric/plugins/minarea/deltamerge1/StripeExts.scala
@@ -4,7 +4,7 @@
*
* File: SimpleChecker.java
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/plugins/minarea/deltamerge1/UnloadPolys.scala b/com/sun/electric/plugins/minarea/deltamerge1/UnloadPolys.scala
index 8215f5a..d682d0c 100644
--- a/com/sun/electric/plugins/minarea/deltamerge1/UnloadPolys.scala
+++ b/com/sun/electric/plugins/minarea/deltamerge1/UnloadPolys.scala
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: UnloadPolys.java
- * Written by Dmitry Nadezhin, Sun Microsystems.
+ * Written by Dmitry Nadezhin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/plugins/minarea/deltamerge1/UnloadPolys2.scala b/com/sun/electric/plugins/minarea/deltamerge1/UnloadPolys2.scala
index 0f76330..603de75 100644
--- a/com/sun/electric/plugins/minarea/deltamerge1/UnloadPolys2.scala
+++ b/com/sun/electric/plugins/minarea/deltamerge1/UnloadPolys2.scala
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: UnloadPolys.java
- * Written by Dmitry Nadezhin, Sun Microsystems.
+ * Written by Dmitry Nadezhin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/AbstractShapeBuilder.java b/com/sun/electric/technology/AbstractShapeBuilder.java
index 0cacb32..fba5fbb 100644
--- a/com/sun/electric/technology/AbstractShapeBuilder.java
+++ b/com/sun/electric/technology/AbstractShapeBuilder.java
@@ -5,7 +5,7 @@
* File: AbstractShapeBuilder.java
* Written by: Dmitry Nadezhin
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/ArcProto.java b/com/sun/electric/technology/ArcProto.java
index 754b2aa..0d4cb2b 100644
--- a/com/sun/electric/technology/ArcProto.java
+++ b/com/sun/electric/technology/ArcProto.java
@@ -4,7 +4,7 @@
*
* File: ArcProto.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/BoundsBuilder.java b/com/sun/electric/technology/BoundsBuilder.java
index 4d9a0dd..717a00e 100644
--- a/com/sun/electric/technology/BoundsBuilder.java
+++ b/com/sun/electric/technology/BoundsBuilder.java
@@ -4,7 +4,7 @@
*
* File: BoundsBuilder.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/DRC.dtd b/com/sun/electric/technology/DRC.dtd
index fa66147..de7b388 100644
--- a/com/sun/electric/technology/DRC.dtd
+++ b/com/sun/electric/technology/DRC.dtd
@@ -7,7 +7,7 @@
* File: DRC.dtd
* DRC rules scheme
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -36,7 +36,7 @@
<!ATTLIST LayerRule
ruleName CDATA #REQUIRED
layerName CDATA #REQUIRED
- type (MINWID | MINWIDCOND | MINAREA | MINENCLOSEDAREA | SURROUND) #REQUIRED
+ type (MINWID | MINWIDCOND | MINAREA | MINENCLOSEDAREA | SURROUND | G0CPL | DIAGONALVIA | DIFFMASKSEP) #REQUIRED
when CDATA #REQUIRED
value CDATA #REQUIRED
condition CDATA #IMPLIED
diff --git a/com/sun/electric/technology/DRCTemplate.java b/com/sun/electric/technology/DRCTemplate.java
index 31bd2e6..8041a80 100644
--- a/com/sun/electric/technology/DRCTemplate.java
+++ b/com/sun/electric/technology/DRCTemplate.java
@@ -4,7 +4,7 @@
*
* File: DRCTemplate.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -115,7 +115,10 @@ public class DRCTemplate implements Serializable
/** forbidden rule */ FORBIDDEN,
/** extension gate rule */ EXTENSIONGATE,
/** slot size rule */ SLOTSIZE,
- /** angles allowed */ ALLOWEDANGLES
+ /** angles allowed */ ALLOWEDANGLES,
+ /** G0 rules, CPL=critical path length */ G0CPL,
+ /** a color-diff spacing rule */ DIFFMASKSEP,
+ /** diagonal via rules */ DIAGONALVIA
}
// For sorting
diff --git a/com/sun/electric/technology/EdgeH.java b/com/sun/electric/technology/EdgeH.java
index 0db9920..731ec00 100644
--- a/com/sun/electric/technology/EdgeH.java
+++ b/com/sun/electric/technology/EdgeH.java
@@ -4,7 +4,7 @@
*
* File: EdgeH.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/EdgeV.java b/com/sun/electric/technology/EdgeV.java
index 2c917c0..c284748 100644
--- a/com/sun/electric/technology/EdgeV.java
+++ b/com/sun/electric/technology/EdgeV.java
@@ -4,7 +4,7 @@
*
* File: EdgeV.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/Foundry.java b/com/sun/electric/technology/Foundry.java
index 9df3213..f7a3ecd 100644
--- a/com/sun/electric/technology/Foundry.java
+++ b/com/sun/electric/technology/Foundry.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: Foundry.java
- * Written by Gilda Garreton, Sun Microsystems.
+ * Written by Gilda Garreton.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -262,7 +262,7 @@ public class Foundry {
/**
* Generate key name for GDS value depending on the foundry
- * @return
+ * @return key name.
*/
private String getGDSPrefName()
{
diff --git a/com/sun/electric/technology/GDSLayers.java b/com/sun/electric/technology/GDSLayers.java
index a15b8e4..2af453f 100644
--- a/com/sun/electric/technology/GDSLayers.java
+++ b/com/sun/electric/technology/GDSLayers.java
@@ -4,9 +4,9 @@
*
* File: GDSLayers.java
* Input/output tool: GDS layer parsing
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/Layer.java b/com/sun/electric/technology/Layer.java
index 756591c..27b33d5 100644
--- a/com/sun/electric/technology/Layer.java
+++ b/com/sun/electric/technology/Layer.java
@@ -4,7 +4,7 @@
*
* File: Layer.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -77,12 +77,16 @@ public class Layer implements Serializable, Comparable {
/** Describes a thick layer. */ private static final int THICK = 040000000;
/** Describes a carbon-nanotube Active layer. */ private static final int CARBNANO = 0100000000;
/** Describes a interconnect layer. */ private static final int INTERCONNECT = 0200000000;
+ /** Describes a cut layer. */ private static final int CUTLAYER = 0400000000;
private static final LayerNumbers metalLayers = new LayerNumbers();
private static final LayerNumbers metalLayers1 = new LayerNumbers();
private static final LayerNumbers metalLayers2 = new LayerNumbers();
private static final LayerNumbers metalLayers3 = new LayerNumbers();
private static final LayerNumbers contactLayers = new LayerNumbers();
+ private static final LayerNumbers contactLayers1 = new LayerNumbers();
+ private static final LayerNumbers contactLayers2 = new LayerNumbers();
+ private static final LayerNumbers contactLayers3 = new LayerNumbers();
private static final LayerNumbers polyLayers = new LayerNumbers();
private static List<Function> allFunctions;
@@ -119,6 +123,7 @@ public class Layer implements Serializable, Comparable {
list.add(null);
}
Function oldFunction = list.set(level - base, fun);
+ if (oldFunction != null) System.out.println("ERROR: Function " + fun.name + " on level " + level + " exists twice");
assert oldFunction == null;
}
@@ -137,241 +142,197 @@ public class Layer implements Serializable, Comparable {
* Function is a typesafe enum class that describes the function of a layer.
* Functions are technology-independent and describe the nature of the layer (Metal, Polysilicon, etc.)
*/
-
public static enum Function {
- /** Describes an unknown layer. */
- UNKNOWN("unknown", 0, 0, 0, 0, 35, 0, 0),
- /** Describes a local interconnect metal layer 2. */
- METALNEG2("metal-2-local", -2, 0, 0, 0, 13, 0, 0),
- /** Describes a local interconnect metal layer 1. */
- METALNEG1("metal-1-local", -1, 0, 0, 0, 15, 0, 0),
-
- /** Describes a metal layer 1. */ METAL1 ("metal-1", 1, 0, 0, 0, 17, 0, 0),
- /** Describes a metal layer 1 mask 1. */ METAL1C1 ("metal-1-C1", 1, 0, 0, 1, 17, 0, 0),
- /** Describes a metal layer 1 mask 2. */ METAL1C2 ("metal-1-C2", 1, 0, 0, 2, 17, 0, 0),
- /** Describes a metal layer 1 mask 3. */ METAL1C3 ("metal-1-C3", 1, 0, 0, 3, 17, 0, 0),
- /** Describes a metal layer 2. */ METAL2 ("metal-2", 2, 0, 0, 0, 19, 0, 0),
- /** Describes a metal layer 2 mask 1. */ METAL2C1 ("metal-2-C1", 2, 0, 0, 1, 19, 0, 0),
- /** Describes a metal layer 2 mask 2. */ METAL2C2 ("metal-2-C2", 2, 0, 0, 2, 19, 0, 0),
- /** Describes a metal layer 2 mask 3. */ METAL2C3 ("metal-2-C3", 2, 0, 0, 3, 19, 0, 0),
- /** Describes a metal layer 3. */ METAL3 ("metal-3", 3, 0, 0, 0, 21, 0, 0),
- /** Describes a metal layer 3 mask 1. */ METAL3C1 ("metal-3-C1", 3, 0, 0, 1, 21, 0, 0),
- /** Describes a metal layer 3 mask 2. */ METAL3C2 ("metal-3-C2", 3, 0, 0, 2, 21, 0, 0),
- /** Describes a metal layer 3 mask 3. */ METAL3C3 ("metal-3-C3", 3, 0, 0, 3, 21, 0, 0),
- /** Describes a metal layer 4. */ METAL4 ("metal-4", 4, 0, 0, 0, 23, 0, 0),
- /** Describes a metal layer 4 mask 1. */ METAL4C1 ("metal-4-C1", 4, 0, 0, 1, 23, 0, 0),
- /** Describes a metal layer 4 mask 2. */ METAL4C2 ("metal-4-C2", 4, 0, 0, 2, 23, 0, 0),
- /** Describes a metal layer 4 mask 3. */ METAL4C3 ("metal-4-C3", 4, 0, 0, 3, 23, 0, 0),
- /** Describes a metal layer 5. */ METAL5 ("metal-5", 5, 0, 0, 0, 25, 0, 0),
- /** Describes a metal layer 5 mask 1. */ METAL5C1 ("metal-5-C1", 5, 0, 0, 1, 25, 0, 0),
- /** Describes a metal layer 5 mask 2. */ METAL5C2 ("metal-5-C2", 5, 0, 0, 2, 25, 0, 0),
- /** Describes a metal layer 5 mask 3. */ METAL5C3 ("metal-5-C3", 5, 0, 0, 3, 25, 0, 0),
- /** Describes a metal layer 6. */ METAL6 ("metal-6", 6, 0, 0, 0, 27, 0, 0),
- /** Describes a metal layer 6 mask 1. */ METAL6C1 ("metal-6-C1", 6, 0, 0, 1, 27, 0, 0),
- /** Describes a metal layer 6 mask 2. */ METAL6C2 ("metal-6-C2", 6, 0, 0, 2, 27, 0, 0),
- /** Describes a metal layer 6 mask 3. */ METAL6C3 ("metal-6-C3", 6, 0, 0, 3, 27, 0, 0),
- /** Describes a metal layer 7. */ METAL7 ("metal-7", 7, 0, 0, 0, 29, 0, 0),
- /** Describes a metal layer 7 mask 1. */ METAL7C1 ("metal-7-C1", 7, 0, 0, 1, 29, 0, 0),
- /** Describes a metal layer 7 mask 2. */ METAL7C2 ("metal-7-C2", 7, 0, 0, 2, 29, 0, 0),
- /** Describes a metal layer 7 mask 3. */ METAL7C3 ("metal-7-C3", 7, 0, 0, 3, 29, 0, 0),
- /** Describes a metal layer 8. */ METAL8 ("metal-8", 8, 0, 0, 0, 31, 0, 0),
- /** Describes a metal layer 8 mask 1. */ METAL8C1 ("metal-8-C1", 8, 0, 0, 1, 31, 0, 0),
- /** Describes a metal layer 8 mask 2. */ METAL8C2 ("metal-8-C2", 8, 0, 0, 2, 31, 0, 0),
- /** Describes a metal layer 8 mask 3. */ METAL8C3 ("metal-8-C3", 8, 0, 0, 3, 31, 0, 0),
- /** Describes a metal layer 9. */ METAL9 ("metal-9", 9, 0, 0, 0, 33, 0, 0),
- /** Describes a metal layer 9 mask 1. */ METAL9C1 ("metal-9-C1", 9, 0, 0, 1, 33, 0, 0),
- /** Describes a metal layer 9 mask 2. */ METAL9C2 ("metal-9-C2", 9, 0, 0, 2, 33, 0, 0),
- /** Describes a metal layer 9 mask 3. */ METAL9C3 ("metal-9-C3", 9, 0, 0, 3, 33, 0, 0),
- /** Describes a metal layer 10. */ METAL10 ("metal-10", 10, 0, 0, 0, 35, 0, 0),
- /** Describes a metal layer 10 mask 1. */ METAL10C1("metal-10-C1", 10, 0, 0, 1, 35, 0, 0),
- /** Describes a metal layer 10 mask 2. */ METAL10C2("metal-10-C2", 10, 0, 0, 2, 35, 0, 0),
- /** Describes a metal layer 10 mask 3. */ METAL10C3("metal-10-C3", 10, 0, 0, 3, 35, 0, 0),
- /** Describes a metal layer 11. */ METAL11 ("metal-11", 11, 0, 0, 0, 37, 0, 0),
- /** Describes a metal layer 11 mask 1. */ METAL11C1("metal-11-C1", 11, 0, 0, 1, 37, 0, 0),
- /** Describes a metal layer 11 mask 2. */ METAL11C2("metal-11-C2", 11, 0, 0, 2, 37, 0, 0),
- /** Describes a metal layer 11 mask 3. */ METAL11C3("metal-11-C3", 11, 0, 0, 3, 37, 0, 0),
- /** Describes a metal layer 12. */ METAL12 ("metal-12", 12, 0, 0, 0, 39, 0, 0),
- /** Describes a metal layer 12 mask 1. */ METAL12C1("metal-12-C1", 12, 0, 0, 1, 39, 0, 0),
- /** Describes a metal layer 12 mask 2. */ METAL12C2("metal-12-C2", 12, 0, 0, 2, 39, 0, 0),
- /** Describes a metal layer 12 mask 3. */ METAL12C3("metal-12-C3", 12, 0, 0, 3, 39, 0, 0),
- /** Describes a metal layer 13. */ METAL13 ("metal-13", 13, 0, 0, 0, 41, 0, 0),
- /** Describes a metal layer 13 mask 1. */ METAL13C1("metal-13-C1", 13, 0, 0, 1, 41, 0, 0),
- /** Describes a metal layer 13 mask 2. */ METAL13C2("metal-13-C2", 13, 0, 0, 2, 41, 0, 0),
- /** Describes a metal layer 13 mask 3. */ METAL13C3("metal-13-C3", 13, 0, 0, 3, 41, 0, 0),
- /** Describes a metal layer 14. */ METAL14 ("metal-14", 14, 0, 0, 0, 43, 0, 0),
- /** Describes a metal layer 14 mask 1. */ METAL14C1("metal-14-C1", 14, 0, 0, 1, 43, 0, 0),
- /** Describes a metal layer 14 mask 2. */ METAL14C2("metal-14-C2", 14, 0, 0, 2, 43, 0, 0),
- /** Describes a metal layer 14 mask 3. */ METAL14C3("metal-14-C3", 14, 0, 0, 3, 43, 0, 0),
+ /** Describes an unknown layer. */ UNKNOWN("unknown", 0, 0, 0, 0, 35, 0, 0),
+ /** Describes a local interconnect metal layer 2. */ METALNEG2("metal-2-local", -2, 0, 0, 0, 13, 0, 0),
+ /** Describes a local interconnect metal layer 1. */ METALNEG1("metal-1-local", -1, 0, 0, 0, 15, 0, 0),
+
+ /** Describes a metal layer 1. */ METAL1 ("metal-1", 1, 0, 0, 0, 17, 0, 0),
+ /** Describes a metal layer 1a. */ METAL1C1 ("metal-1-C1", 1, 0, 0, 1, 17, 0, 0),
+ /** Describes a metal layer 1b. */ METAL1C2 ("metal-1-C2", 1, 0, 0, 2, 17, 0, 0),
+ /** Describes a metal layer 1c. */ METAL1C3 ("metal-1-C3", 1, 0, 0, 3, 17, 0, 0),
+ /** Describes a metal layer 2. */ METAL2 ("metal-2", 2, 0, 0, 0, 19, 0, 0),
+ /** Describes a metal layer 2a. */ METAL2C1 ("metal-2-C1", 2, 0, 0, 1, 19, 0, 0),
+ /** Describes a metal layer 2b. */ METAL2C2 ("metal-2-C2", 2, 0, 0, 2, 19, 0, 0),
+ /** Describes a metal layer 2c. */ METAL2C3 ("metal-2-C3", 2, 0, 0, 3, 19, 0, 0),
+ /** Describes a metal layer 3. */ METAL3 ("metal-3", 3, 0, 0, 0, 21, 0, 0),
+ /** Describes a metal layer 3a. */ METAL3C1 ("metal-3-C1", 3, 0, 0, 1, 21, 0, 0),
+ /** Describes a metal layer 3b. */ METAL3C2 ("metal-3-C2", 3, 0, 0, 2, 21, 0, 0),
+ /** Describes a metal layer 3c. */ METAL3C3 ("metal-3-C3", 3, 0, 0, 3, 21, 0, 0),
+ /** Describes a metal layer 4. */ METAL4 ("metal-4", 4, 0, 0, 0, 23, 0, 0),
+ /** Describes a metal layer 4a. */ METAL4C1 ("metal-4-C1", 4, 0, 0, 1, 23, 0, 0),
+ /** Describes a metal layer 4b. */ METAL4C2 ("metal-4-C2", 4, 0, 0, 2, 23, 0, 0),
+ /** Describes a metal layer 4c. */ METAL4C3 ("metal-4-C3", 4, 0, 0, 3, 23, 0, 0),
+ /** Describes a metal layer 5. */ METAL5 ("metal-5", 5, 0, 0, 0, 25, 0, 0),
+ /** Describes a metal layer 5a. */ METAL5C1 ("metal-5-C1", 5, 0, 0, 1, 25, 0, 0),
+ /** Describes a metal layer 5b. */ METAL5C2 ("metal-5-C2", 5, 0, 0, 2, 25, 0, 0),
+ /** Describes a metal layer 5c. */ METAL5C3 ("metal-5-C3", 5, 0, 0, 3, 25, 0, 0),
+ /** Describes a metal layer 6. */ METAL6 ("metal-6", 6, 0, 0, 0, 27, 0, 0),
+ /** Describes a metal layer 6a. */ METAL6C1 ("metal-6-C1", 6, 0, 0, 1, 27, 0, 0),
+ /** Describes a metal layer 6b. */ METAL6C2 ("metal-6-C2", 6, 0, 0, 2, 27, 0, 0),
+ /** Describes a metal layer 6c. */ METAL6C3 ("metal-6-C3", 6, 0, 0, 3, 27, 0, 0),
+ /** Describes a metal layer 7. */ METAL7 ("metal-7", 7, 0, 0, 0, 29, 0, 0),
+ /** Describes a metal layer 7a. */ METAL7C1 ("metal-7-C1", 7, 0, 0, 1, 29, 0, 0),
+ /** Describes a metal layer 7b. */ METAL7C2 ("metal-7-C2", 7, 0, 0, 2, 29, 0, 0),
+ /** Describes a metal layer 7c. */ METAL7C3 ("metal-7-C3", 7, 0, 0, 3, 29, 0, 0),
+ /** Describes a metal layer 8. */ METAL8 ("metal-8", 8, 0, 0, 0, 31, 0, 0),
+ /** Describes a metal layer 8a. */ METAL8C1 ("metal-8-C1", 8, 0, 0, 1, 31, 0, 0),
+ /** Describes a metal layer 8b. */ METAL8C2 ("metal-8-C2", 8, 0, 0, 2, 31, 0, 0),
+ /** Describes a metal layer 8c. */ METAL8C3 ("metal-8-C3", 8, 0, 0, 3, 31, 0, 0),
+ /** Describes a metal layer 9. */ METAL9 ("metal-9", 9, 0, 0, 0, 33, 0, 0),
+ /** Describes a metal layer 9a. */ METAL9C1 ("metal-9-C1", 9, 0, 0, 1, 33, 0, 0),
+ /** Describes a metal layer 9b. */ METAL9C2 ("metal-9-C2", 9, 0, 0, 2, 33, 0, 0),
+ /** Describes a metal layer 9c. */ METAL9C3 ("metal-9-C3", 9, 0, 0, 3, 33, 0, 0),
+ /** Describes a metal layer 10. */ METAL10 ("metal-10", 10, 0, 0, 0, 35, 0, 0),
+ /** Describes a metal layer 10a. */ METAL10C1("metal-10-C1", 10, 0, 0, 1, 35, 0, 0),
+ /** Describes a metal layer 10b. */ METAL10C2("metal-10-C2", 10, 0, 0, 2, 35, 0, 0),
+ /** Describes a metal layer 10c. */ METAL10C3("metal-10-C3", 10, 0, 0, 3, 35, 0, 0),
+ /** Describes a metal layer 11. */ METAL11 ("metal-11", 11, 0, 0, 0, 37, 0, 0),
+ /** Describes a metal layer 11a. */ METAL11C1("metal-11-C1", 11, 0, 0, 1, 37, 0, 0),
+ /** Describes a metal layer 11b. */ METAL11C2("metal-11-C2", 11, 0, 0, 2, 37, 0, 0),
+ /** Describes a metal layer 11c. */ METAL11C3("metal-11-C3", 11, 0, 0, 3, 37, 0, 0),
+ /** Describes a metal layer 12. */ METAL12 ("metal-12", 12, 0, 0, 0, 39, 0, 0),
+ /** Describes a metal layer 12a. */ METAL12C1("metal-12-C1", 12, 0, 0, 1, 39, 0, 0),
+ /** Describes a metal layer 12b. */ METAL12C2("metal-12-C2", 12, 0, 0, 2, 39, 0, 0),
+ /** Describes a metal layer 12c. */ METAL12C3("metal-12-C3", 12, 0, 0, 3, 39, 0, 0),
+ /** Describes a metal layer 13. */ METAL13 ("metal-13", 13, 0, 0, 0, 41, 0, 0),
+ /** Describes a metal layer 13a. */ METAL13C1("metal-13-C1", 13, 0, 0, 1, 41, 0, 0),
+ /** Describes a metal layer 13b. */ METAL13C2("metal-13-C2", 13, 0, 0, 2, 41, 0, 0),
+ /** Describes a metal layer 13c. */ METAL13C3("metal-13-C3", 13, 0, 0, 3, 41, 0, 0),
+ /** Describes a metal layer 14. */ METAL14 ("metal-14", 14, 0, 0, 0, 43, 0, 0),
+ /** Describes a metal layer 14a. */ METAL14C1("metal-14-C1", 14, 0, 0, 1, 43, 0, 0),
+ /** Describes a metal layer 14b. */ METAL14C2("metal-14-C2", 14, 0, 0, 2, 43, 0, 0),
+ /** Describes a metal layer 14c. */ METAL14C3("metal-14-C3", 14, 0, 0, 3, 43, 0, 0),
- /** Describes a polysilicon layer 1. */
- POLY1("poly-1", 0, 0, 1, 0, 12, 0, 0),
- /** Describes a polysilicon layer 2. */
- POLY2("poly-2", 0, 0, 2, 0, 13, 0, 0),
- /** Describes a polysilicon layer 3. */
- POLY3("poly-3", 0, 0, 3, 0, 14, 0, 0),
- /** Describes a polysilicon gate layer. */
- GATE("gate", 0, 0, 0, 0, 15, INTRANS, 0),
- /** Describes a diffusion layer. */
- DIFF("diffusion", 0, 0, 0, 0, 11, 0, 0),
- /** Describes a P-diffusion layer. */
- DIFFP("p-diffusion", 0, 0, 0, 0, 11, PTYPE, 0),
- /** Describes a N-diffusion layer. */
- DIFFN("n-diffusion", 0, 0, 0, 0, 11, NTYPE, 0),
- /** Describes a N-diffusion carbon nanotube layer. */
- DIFFNCN("n-diffusion-cn", 0, 0, 0, 0, 11, NTYPE | CARBNANO, 0),
- /** Describes a P-diffusion carbon nanotube layer. */
- DIFFPCN("n-diffusion-cn", 0, 0, 0, 0, 11, NTYPE | CARBNANO, 0),
- /** Describes an implant layer. */
- IMPLANT("implant", 0, 0, 0, 0, 2, 0, 0),
- /** Describes a P-implant layer. */
- IMPLANTP("p-implant", 0, 0, 0, 0, 2, PTYPE, 0),
- /** Describes an N-implant layer. */
- IMPLANTN("n-implant", 0, 0, 0, 0, 2, NTYPE, 0),
+ /** Describes a polysilicon layer 1. */ POLY1("poly-1", 0, 0, 1, 0, 12, 0, 0),
+ /** Describes a polysilicon layer 2. */ POLY2("poly-2", 0, 0, 2, 0, 13, 0, 0),
+ /** Describes a polysilicon layer 3. */ POLY3("poly-3", 0, 0, 3, 0, 14, 0, 0),
+ /** Describes a polysilicon gate layer. */ GATE("gate", 0, 0, 0, 0, 15, INTRANS, 0),
+ /** Describes a diffusion layer. */ DIFF("diffusion", 0, 0, 0, 0, 11, 0, 0),
+ /** Describes a P-diffusion layer. */ DIFFP("p-diffusion", 0, 0, 0, 0, 11, PTYPE, 0),
+ /** Describes a N-diffusion layer. */ DIFFN("n-diffusion", 0, 0, 0, 0, 11, NTYPE, 0),
+ /** Describes a N-diffusion carbon nanotube layer. */ DIFFNCN("n-diffusion-cn", 0, 0, 0, 0, 11, NTYPE | CARBNANO, 0),
+ /** Describes a P-diffusion carbon nanotube layer. */ DIFFPCN("n-diffusion-cn", 0, 0, 0, 0, 11, NTYPE | CARBNANO, 0),
+ /** Describes an implant layer. */ IMPLANT("implant", 0, 0, 0, 0, 2, 0, 0),
+ /** Describes a P-implant layer. */ IMPLANTP("p-implant", 0, 0, 0, 0, 2, PTYPE, 0),
+ /** Describes an N-implant layer. */ IMPLANTN("n-implant", 0, 0, 0, 0, 2, NTYPE, 0),
- /** Describes a contact layer 1. */
- CONTACT1("contact-1", 0, 1, 0, 0, 16, 0, 0),
- /** Describes a contact layer 2. */
- CONTACT2("contact-2", 0, 2, 0, 0, 18, 0, 0),
- /** Describes a contact layer 3. */
- CONTACT3("contact-3", 0, 3, 0, 0, 20, 0, 0),
- /** Describes a contact layer 4. */
- CONTACT4("contact-4", 0, 4, 0, 0, 22, 0, 0),
- /** Describes a contact layer 5. */
- CONTACT5("contact-5", 0, 5, 0, 0, 24, 0, 0),
- /** Describes a contact layer 6. */
- CONTACT6("contact-6", 0, 6, 0, 0, 26, 0, 0),
- /** Describes a contact layer 7. */
- CONTACT7("contact-7", 0, 7, 0, 0, 28, 0, 0),
- /** Describes a contact layer 8. */
- CONTACT8("contact-8", 0, 8, 0, 0, 30, 0, 0),
- /** Describes a contact layer 9. */
- CONTACT9("contact-9", 0, 9, 0, 0, 32, 0, 0),
- /** Describes a contact layer 10. */
- CONTACT10("contact-10", 0, 10, 0, 0, 34, 0, 0),
- /** Describes a contact layer 11. */
- CONTACT11("contact-11", 0, 11, 0, 0, 36, 0, 0),
- /** Describes a contact layer 12. */
- CONTACT12("contact-12", 0, 12, 0, 0, 38, 0, 0),
- /** Describes a contact layer 13. */
- CONTACT13("contact-13", 0, 13, 0, 0, 40, 0, 0),
- /** Describes a contact layer 14. */
- CONTACT14("contact-14", 0, 14, 0, 0, 42, 0, 0),
+ /** Describes a contact layer 1. */ CONTACT1 ("contact-1", 0, 1, 0, 0, 16, 0, 0),
+ /** Describes a contact layer 1a. */ CONTACT1C1 ("contact-1-C1", 0, 1, 0, 1, 16, 0, 0),
+ /** Describes a contact layer 1b. */ CONTACT1C2 ("contact-1-C2", 0, 1, 0, 2, 16, 0, 0),
+ /** Describes a contact layer 1c. */ CONTACT1C3 ("contact-1-C3", 0, 1, 0, 3, 16, 0, 0),
+ /** Describes a contact layer 2. */ CONTACT2 ("contact-2", 0, 2, 0, 0, 18, 0, 0),
+ /** Describes a contact layer 2a. */ CONTACT2C1 ("contact-2-C1", 0, 2, 0, 1, 18, 0, 0),
+ /** Describes a contact layer 2b. */ CONTACT2C2 ("contact-2-C2", 0, 2, 0, 2, 18, 0, 0),
+ /** Describes a contact layer 2c. */ CONTACT2C3 ("contact-2-C3", 0, 2, 0, 3, 18, 0, 0),
+ /** Describes a contact layer 3. */ CONTACT3 ("contact-3", 0, 3, 0, 0, 20, 0, 0),
+ /** Describes a contact layer 3a. */ CONTACT3C1 ("contact-3-C1", 0, 3, 0, 1, 20, 0, 0),
+ /** Describes a contact layer 3b. */ CONTACT3C2 ("contact-3-C2", 0, 3, 0, 2, 20, 0, 0),
+ /** Describes a contact layer 3c. */ CONTACT3C3 ("contact-3-C3", 0, 3, 0, 3, 20, 0, 0),
+ /** Describes a contact layer 4. */ CONTACT4 ("contact-4", 0, 4, 0, 0, 22, 0, 0),
+ /** Describes a contact layer 4a. */ CONTACT4C1 ("contact-4-C1", 0, 4, 0, 1, 22, 0, 0),
+ /** Describes a contact layer 4b. */ CONTACT4C2 ("contact-4-C2", 0, 4, 0, 2, 22, 0, 0),
+ /** Describes a contact layer 4c. */ CONTACT4C3 ("contact-4-C3", 0, 4, 0, 3, 22, 0, 0),
+ /** Describes a contact layer 5. */ CONTACT5 ("contact-5", 0, 5, 0, 0, 24, 0, 0),
+ /** Describes a contact layer 5a. */ CONTACT5C1 ("contact-5-C1", 0, 5, 0, 1, 24, 0, 0),
+ /** Describes a contact layer 5b. */ CONTACT5C2 ("contact-5-C2", 0, 5, 0, 2, 24, 0, 0),
+ /** Describes a contact layer 5c. */ CONTACT5C3 ("contact-5-C3", 0, 5, 0, 3, 24, 0, 0),
+ /** Describes a contact layer 6. */ CONTACT6 ("contact-6", 0, 6, 0, 0, 26, 0, 0),
+ /** Describes a contact layer 6a. */ CONTACT6C1 ("contact-6-C1", 0, 6, 0, 1, 26, 0, 0),
+ /** Describes a contact layer 6b. */ CONTACT6C2 ("contact-6-C2", 0, 6, 0, 2, 26, 0, 0),
+ /** Describes a contact layer 6c. */ CONTACT6C3 ("contact-6-C3", 0, 6, 0, 3, 26, 0, 0),
+ /** Describes a contact layer 7. */ CONTACT7 ("contact-7", 0, 7, 0, 0, 28, 0, 0),
+ /** Describes a contact layer 7a. */ CONTACT7C1 ("contact-7-C1", 0, 7, 0, 1, 28, 0, 0),
+ /** Describes a contact layer 7b. */ CONTACT7C2 ("contact-7-C2", 0, 7, 0, 2, 28, 0, 0),
+ /** Describes a contact layer 7c. */ CONTACT7C3 ("contact-7-C3", 0, 7, 0, 3, 28, 0, 0),
+ /** Describes a contact layer 8. */ CONTACT8 ("contact-8", 0, 8, 0, 0, 30, 0, 0),
+ /** Describes a contact layer 8a. */ CONTACT8C1 ("contact-8-C1", 0, 8, 0, 1, 30, 0, 0),
+ /** Describes a contact layer 8b. */ CONTACT8C2 ("contact-8-C2", 0, 8, 0, 2, 30, 0, 0),
+ /** Describes a contact layer 8c. */ CONTACT8C3 ("contact-8-C3", 0, 8, 0, 3, 30, 0, 0),
+ /** Describes a contact layer 9. */ CONTACT9 ("contact-9", 0, 9, 0, 0, 32, 0, 0),
+ /** Describes a contact layer 9a. */ CONTACT9C1 ("contact-9-C1", 0, 9, 0, 1, 32, 0, 0),
+ /** Describes a contact layer 9b. */ CONTACT9C2 ("contact-9-C2", 0, 9, 0, 2, 32, 0, 0),
+ /** Describes a contact layer 9c. */ CONTACT9C3 ("contact-9-C3", 0, 9, 0, 3, 32, 0, 0),
+ /** Describes a contact layer 10. */ CONTACT10 ("contact-10", 0, 10, 0, 0, 34, 0, 0),
+ /** Describes a contact layer 10a. */ CONTACT10C1("contact-10-C1", 0, 10, 0, 1, 34, 0, 0),
+ /** Describes a contact layer 10b. */ CONTACT10C2("contact-10-C2", 0, 10, 0, 2, 34, 0, 0),
+ /** Describes a contact layer 10c. */ CONTACT10C3("contact-10-C3", 0, 10, 0, 3, 34, 0, 0),
+ /** Describes a contact layer 11. */ CONTACT11 ("contact-11", 0, 11, 0, 0, 36, 0, 0),
+ /** Describes a contact layer 11a. */ CONTACT11C1("contact-11-C1", 0, 11, 0, 1, 36, 0, 0),
+ /** Describes a contact layer 11b. */ CONTACT11C2("contact-11-C2", 0, 11, 0, 2, 36, 0, 0),
+ /** Describes a contact layer 11c. */ CONTACT11C3("contact-11-C3", 0, 11, 0, 3, 36, 0, 0),
+ /** Describes a contact layer 12. */ CONTACT12 ("contact-12", 0, 12, 0, 0, 38, 0, 0),
+ /** Describes a contact layer 12a. */ CONTACT12C1("contact-12-C1", 0, 12, 0, 1, 38, 0, 0),
+ /** Describes a contact layer 12b. */ CONTACT12C2("contact-12-C2", 0, 12, 0, 2, 38, 0, 0),
+ /** Describes a contact layer 12c. */ CONTACT12C3("contact-12-C3", 0, 12, 0, 3, 38, 0, 0),
+ /** Describes a contact layer 13. */ CONTACT13 ("contact-13", 0, 13, 0, 0, 40, 0, 0),
+ /** Describes a contact layer 13a. */ CONTACT13C1("contact-13-C1", 0, 13, 0, 1, 40, 0, 0),
+ /** Describes a contact layer 13b. */ CONTACT13C2("contact-13-C2", 0, 13, 0, 2, 40, 0, 0),
+ /** Describes a contact layer 13c. */ CONTACT13C3("contact-13-C3", 0, 13, 0, 3, 40, 0, 0),
+ /** Describes a contact layer 14. */ CONTACT14 ("contact-14", 0, 14, 0, 0, 42, 0, 0),
+ /** Describes a contact layer 14a. */ CONTACT14C1("contact-14-C1", 0, 14, 0, 1, 42, 0, 0),
+ /** Describes a contact layer 14b. */ CONTACT14C2("contact-14-C2", 0, 14, 0, 2, 42, 0, 0),
+ /** Describes a contact layer 14c. */ CONTACT14C3("contact-14-C3", 0, 14, 0, 3, 42, 0, 0),
- /** Describes a sinker (diffusion-to-buried plug). */
- PLUG("plug", 0, 0, 0, 0, 40, 0, 0),
- /** Describes an overglass layer (passivation). */
- OVERGLASS("overglass", 0, 0, 0, 0, 41, 0, 0),
- /** Describes a resistor layer. */
- RESISTOR("resistor", 0, 0, 0, 0, 4, 0, 0),
- /** Describes a capacitor layer. */
- CAP("capacitor", 0, 0, 0, 0, 5, 0, 0),
- /** Describes a transistor layer. */
- TRANSISTOR("transistor", 0, 0, 0, 0, 3, 0, 0),
- /** Describes an emitter of bipolar transistor. */
- EMITTER("emitter", 0, 0, 0, 0, 6, 0, 0),
- /** Describes a base of bipolar transistor. */
- BASE("base", 0, 0, 0, 0, 7, 0, 0),
- /** Describes a collector of bipolar transistor. */
- COLLECTOR("collector", 0, 0, 0, 0, 8, 0, 0),
- /** Describes a substrate layer. */
- SUBSTRATE("substrate", 0, 0, 0, 0, 1, 0, 0),
- /** Describes a well layer. */
- WELL("well", 0, 0, 0, 0, 0, 0, 0),
- /** Describes a P-well layer. */
- WELLP("p-well", 0, 0, 0, 0, 0, PTYPE, 0),
- /** Describes a N-well layer. */
- WELLN("n-well", 0, 0, 0, 0, 0, NTYPE, 0),
- /** Describes a guard layer. */
- GUARD("guard", 0, 0, 0, 0, 9, 0, 0),
- /** Describes an isolation layer (bipolar). */
- ISOLATION("isolation", 0, 0, 0, 0, 10, 0, 0),
- /** Describes a bus layer. */
- BUS("bus", 0, 0, 0, 0, 42, 0, 0),
- /** Describes an artwork layer. */
- ART("art", 0, 0, 0, 0, 43, 0, 0),
- /** Describes a control layer. */
- CONTROL("control", 0, 0, 0, 0, 44, 0, 0),
- /** Describes a tileNot layer. */
- TILENOT("tileNot", 0, 0, 0, 0, 45, 0, 0),
- /** Describes a dummy polysilicon layer 1 */
- DMYPOLY1("dmy-poly-1", 0, 0, 0, 0, POLY1.getHeight(), 0, 0),
- /** Describes a dummy polysilicon layer 2 */
- DMYPOLY2("dmy-poly-2", 0, 0, 0, 0, POLY2.getHeight(), 0, 0),
- /** Describes a dummy polysilicon layer 3 */
- DMYPOLY3("dmy-poly-3", 0, 0, 0, 0, POLY3.getHeight(), 0, 0),
- /** Describes a dummy diffusion layer */
- DMYDIFF("dmy-diffusion", 0, 0, 0, 0, DIFF.getHeight(), 0, 0),
+ /** Describes a sinker (diffusion-to-buried plug). */ PLUG("plug", 0, 0, 0, 0, 40, 0, 0),
+ /** Describes an overglass layer (passivation). */ OVERGLASS("overglass", 0, 0, 0, 0, 41, 0, 0),
+ /** Describes a resistor layer. */ RESISTOR("resistor", 0, 0, 0, 0, 4, 0, 0),
+ /** Describes a capacitor layer. */ CAP("capacitor", 0, 0, 0, 0, 5, 0, 0),
+ /** Describes a transistor layer. */ TRANSISTOR("transistor", 0, 0, 0, 0, 3, 0, 0),
+ /** Describes an emitter of bipolar transistor. */ EMITTER("emitter", 0, 0, 0, 0, 6, 0, 0),
+ /** Describes a base of bipolar transistor. */ BASE("base", 0, 0, 0, 0, 7, 0, 0),
+ /** Describes a collector of bipolar transistor. */ COLLECTOR("collector", 0, 0, 0, 0, 8, 0, 0),
+ /** Describes a substrate layer. */ SUBSTRATE("substrate", 0, 0, 0, 0, 1, 0, 0),
+ /** Describes a well layer. */ WELL("well", 0, 0, 0, 0, 0, 0, 0),
+ /** Describes a P-well layer. */ WELLP("p-well", 0, 0, 0, 0, 0, PTYPE, 0),
+ /** Describes a N-well layer. */ WELLN("n-well", 0, 0, 0, 0, 0, NTYPE, 0),
+ /** Describes a guard layer. */ GUARD("guard", 0, 0, 0, 0, 9, 0, 0),
+ /** Describes an isolation layer (bipolar). */ ISOLATION("isolation", 0, 0, 0, 0, 10, 0, 0),
+ /** Describes a bus layer. */ BUS("bus", 0, 0, 0, 0, 42, 0, 0),
+ /** Describes an artwork layer. */ ART("art", 0, 0, 0, 0, 43, 0, 0),
+ /** Describes a control layer. */ CONTROL("control", 0, 0, 0, 0, 44, 0, 0),
+ /** Describes a tileNot layer. */ TILENOT("tileNot", 0, 0, 0, 0, 45, 0, 0),
+ /** Describes a dummy polysilicon layer 1 */ DMYPOLY1("dmy-poly-1", 0, 0, 0, 0, POLY1.getHeight(), 0, 0),
+ /** Describes a dummy polysilicon layer 2 */ DMYPOLY2("dmy-poly-2", 0, 0, 0, 0, POLY2.getHeight(), 0, 0),
+ /** Describes a dummy polysilicon layer 3 */ DMYPOLY3("dmy-poly-3", 0, 0, 0, 0, POLY3.getHeight(), 0, 0),
+ /** Describes a dummy diffusion layer */ DMYDIFF("dmy-diffusion", 0, 0, 0, 0, DIFF.getHeight(), 0, 0),
- /** Describes a dummy metal layer 1 */
- DMYMETAL1("dmy-metal-1", 0, 0, 0, 0, METAL1.getHeight(), 0, 1),
- /** Describes a dummy metal layer 2 */
- DMYMETAL2("dmy-metal-2", 0, 0, 0, 0, METAL2.getHeight(), 0, 2),
- /** Describes a dummy metal layer 3 */
- DMYMETAL3("dmy-metal-3", 0, 0, 0, 0, METAL3.getHeight(), 0, 3),
- /** Describes a dummy metal layer 4 */
- DMYMETAL4("dmy-metal-4", 0, 0, 0, 0, METAL4.getHeight(), 0, 4),
- /** Describes a dummy metal layer 5 */
- DMYMETAL5("dmy-metal-5", 0, 0, 0, 0, METAL5.getHeight(), 0, 5),
- /** Describes a dummy metal layer 6 */
- DMYMETAL6("dmy-metal-6", 0, 0, 0, 0, METAL6.getHeight(), 0, 6),
- /** Describes a dummy metal layer 7 */
- DMYMETAL7("dmy-metal-7", 0, 0, 0, 0, METAL7.getHeight(), 0, 7),
- /** Describes a dummy metal layer 8 */
- DMYMETAL8("dmy-metal-8", 0, 0, 0, 0, METAL8.getHeight(), 0, 8),
- /** Describes a dummy metal layer 9 */
- DMYMETAL9("dmy-metal-9", 0, 0, 0, 0, METAL9.getHeight(), 0, 9),
- /** Describes a dummy metal layer 10 */
- DMYMETAL10("dmy-metal-10", 0, 0, 0, 0, METAL10.getHeight(), 0, 10),
- /** Describes a dummy metal layer 11 */
- DMYMETAL11("dmy-metal-11", 0, 0, 0, 0, METAL11.getHeight(), 0, 11),
- /** Describes a dummy metal layer 12 */
- DMYMETAL12("dmy-metal-12", 0, 0, 0, 0, METAL12.getHeight(), 0, 12),
- /** Describes a dummy metal layer 13 */
- DMYMETAL13("dmy-metal-13", 0, 0, 0, 0, METAL13.getHeight(), 0, 13),
- /** Describes a dummy metal layer 14 */
- DMYMETAL14("dmy-metal-14", 0, 0, 0, 0, METAL14.getHeight(), 0, 14),
+ /** Describes a dummy metal layer 1 */ DMYMETAL1("dmy-metal-1", 0, 0, 0, 0, METAL1.getHeight(), 0, 1),
+ /** Describes a dummy metal layer 2 */ DMYMETAL2("dmy-metal-2", 0, 0, 0, 0, METAL2.getHeight(), 0, 2),
+ /** Describes a dummy metal layer 3 */ DMYMETAL3("dmy-metal-3", 0, 0, 0, 0, METAL3.getHeight(), 0, 3),
+ /** Describes a dummy metal layer 4 */ DMYMETAL4("dmy-metal-4", 0, 0, 0, 0, METAL4.getHeight(), 0, 4),
+ /** Describes a dummy metal layer 5 */ DMYMETAL5("dmy-metal-5", 0, 0, 0, 0, METAL5.getHeight(), 0, 5),
+ /** Describes a dummy metal layer 6 */ DMYMETAL6("dmy-metal-6", 0, 0, 0, 0, METAL6.getHeight(), 0, 6),
+ /** Describes a dummy metal layer 7 */ DMYMETAL7("dmy-metal-7", 0, 0, 0, 0, METAL7.getHeight(), 0, 7),
+ /** Describes a dummy metal layer 8 */ DMYMETAL8("dmy-metal-8", 0, 0, 0, 0, METAL8.getHeight(), 0, 8),
+ /** Describes a dummy metal layer 9 */ DMYMETAL9("dmy-metal-9", 0, 0, 0, 0, METAL9.getHeight(), 0, 9),
+ /** Describes a dummy metal layer 10 */ DMYMETAL10("dmy-metal-10", 0, 0, 0, 0, METAL10.getHeight(), 0, 10),
+ /** Describes a dummy metal layer 11 */ DMYMETAL11("dmy-metal-11", 0, 0, 0, 0, METAL11.getHeight(), 0, 11),
+ /** Describes a dummy metal layer 12 */ DMYMETAL12("dmy-metal-12", 0, 0, 0, 0, METAL12.getHeight(), 0, 12),
+ /** Describes a dummy metal layer 13 */ DMYMETAL13("dmy-metal-13", 0, 0, 0, 0, METAL13.getHeight(), 0, 13),
+ /** Describes a dummy metal layer 14 */ DMYMETAL14("dmy-metal-14", 0, 0, 0, 0, METAL14.getHeight(), 0, 14),
- /** Describes a exclusion polysilicon layer 1 */
- DEXCLPOLY1("dexcl-poly-1", 0, 0, 0, 0, POLY1.getHeight(), 0, 0),
- /** Describes a exclusion polysilicon layer 2 */
- DEXCLPOLY2("dexcl-poly-2", 0, 0, 0, 0, POLY2.getHeight(), 0, 0),
- /** Describes a exclusion polysilicon layer 3 */
- DEXCLPOLY3("dexcl-poly-3", 0, 0, 0, 0, POLY3.getHeight(), 0, 0),
- /** Describes a exclusion diffusion layer */
- DEXCLDIFF("dexcl-diffusion", 0, 0, 0, 0, DIFF.getHeight(), 0, 0),
+ /** Describes a exclusion polysilicon layer 1 */ DEXCLPOLY1("dexcl-poly-1", 0, 0, 0, 0, POLY1.getHeight(), 0, 0),
+ /** Describes a exclusion polysilicon layer 2 */ DEXCLPOLY2("dexcl-poly-2", 0, 0, 0, 0, POLY2.getHeight(), 0, 0),
+ /** Describes a exclusion polysilicon layer 3 */ DEXCLPOLY3("dexcl-poly-3", 0, 0, 0, 0, POLY3.getHeight(), 0, 0),
+ /** Describes a exclusion diffusion layer */ DEXCLDIFF("dexcl-diffusion", 0, 0, 0, 0, DIFF.getHeight(), 0, 0),
- /** Describes a exclusion metal layer 1 */
- DEXCLMETAL1("dexcl-metal-1", 0, 0, 0, 0, METAL1.getHeight(), 0, 1),
- /** Describes a exclusion metal layer 2 */
- DEXCLMETAL2("dexcl-metal-2", 0, 0, 0, 0, METAL2.getHeight(), 0, 2),
- /** Describes a exclusion metal layer 3 */
- DEXCLMETAL3("dexcl-metal-3", 0, 0, 0, 0, METAL3.getHeight(), 0, 3),
- /** Describes a exclusion metal layer 4 */
- DEXCLMETAL4("dexcl-metal-4", 0, 0, 0, 0, METAL4.getHeight(), 0, 4),
- /** Describes a exclusion metal layer 5 */
- DEXCLMETAL5("dexcl-metal-5", 0, 0, 0, 0, METAL5.getHeight(), 0, 5),
- /** Describes a exclusion metal layer 6 */
- DEXCLMETAL6("dexcl-metal-6", 0, 0, 0, 0, METAL6.getHeight(), 0, 6),
- /** Describes a exclusion metal layer 7 */
- DEXCLMETAL7("dexcl-metal-7", 0, 0, 0, 0, METAL7.getHeight(), 0, 7),
- /** Describes a exclusion metal layer 8 */
- DEXCLMETAL8("dexcl-metal-8", 0, 0, 0, 0, METAL8.getHeight(), 0, 8),
- /** Describes a exclusion metal layer 9 */
- DEXCLMETAL9("dexcl-metal-9", 0, 0, 0, 0, METAL9.getHeight(), 0, 9),
- /** Describes a exclusion metal layer 10 */
- DEXCLMETAL10("dexcl-metal-10", 0, 0, 0, 0, METAL10.getHeight(), 0, 10),
- /** Describes a exclusion metal layer 11 */
- DEXCLMETAL11("dexcl-metal-11", 0, 0, 0, 0, METAL11.getHeight(), 0, 11),
- /** Describes a exclusion metal layer 12 */
- DEXCLMETAL12("dexcl-metal-12", 0, 0, 0, 0, METAL12.getHeight(), 0, 12),
- /** Describes a exclusion metal layer 13 */
- DEXCLMETAL13("dexcl-metal-13", 0, 0, 0, 0, METAL13.getHeight(), 0, 13),
- /** Describes a exclusion metal layer 14 */
- DEXCLMETAL14("dexcl-metal-14", 0, 0, 0, 0, METAL14.getHeight(), 0, 14);
+ /** Describes a exclusion metal layer 1 */ DEXCLMETAL1("dexcl-metal-1", 0, 0, 0, 0, METAL1.getHeight(), 0, 1),
+ /** Describes a exclusion metal layer 2 */ DEXCLMETAL2("dexcl-metal-2", 0, 0, 0, 0, METAL2.getHeight(), 0, 2),
+ /** Describes a exclusion metal layer 3 */ DEXCLMETAL3("dexcl-metal-3", 0, 0, 0, 0, METAL3.getHeight(), 0, 3),
+ /** Describes a exclusion metal layer 4 */ DEXCLMETAL4("dexcl-metal-4", 0, 0, 0, 0, METAL4.getHeight(), 0, 4),
+ /** Describes a exclusion metal layer 5 */ DEXCLMETAL5("dexcl-metal-5", 0, 0, 0, 0, METAL5.getHeight(), 0, 5),
+ /** Describes a exclusion metal layer 6 */ DEXCLMETAL6("dexcl-metal-6", 0, 0, 0, 0, METAL6.getHeight(), 0, 6),
+ /** Describes a exclusion metal layer 7 */ DEXCLMETAL7("dexcl-metal-7", 0, 0, 0, 0, METAL7.getHeight(), 0, 7),
+ /** Describes a exclusion metal layer 8 */ DEXCLMETAL8("dexcl-metal-8", 0, 0, 0, 0, METAL8.getHeight(), 0, 8),
+ /** Describes a exclusion metal layer 9 */ DEXCLMETAL9("dexcl-metal-9", 0, 0, 0, 0, METAL9.getHeight(), 0, 9),
+ /** Describes a exclusion metal layer 10 */ DEXCLMETAL10("dexcl-metal-10", 0, 0, 0, 0, METAL10.getHeight(), 0, 10),
+ /** Describes a exclusion metal layer 11 */ DEXCLMETAL11("dexcl-metal-11", 0, 0, 0, 0, METAL11.getHeight(), 0, 11),
+ /** Describes a exclusion metal layer 12 */ DEXCLMETAL12("dexcl-metal-12", 0, 0, 0, 0, METAL12.getHeight(), 0, 12),
+ /** Describes a exclusion metal layer 13 */ DEXCLMETAL13("dexcl-metal-13", 0, 0, 0, 0, METAL13.getHeight(), 0, 13),
+ /** Describes a exclusion metal layer 14 */ DEXCLMETAL14("dexcl-metal-14", 0, 0, 0, 0, METAL14.getHeight(), 0, 14);
-// /** Describes a P-type layer. */ public static final int PTYPE = Layer.PTYPE;
-// /** Describes a N-type layer. */ public static final int NTYPE = Layer.NTYPE;
/** Describes a depletion layer. */
public static final int DEPLETION = Layer.DEPLETION;
/** Describes a enhancement layer. */
@@ -382,7 +343,7 @@ public class Layer implements Serializable, Comparable {
public static final int HEAVY = Layer.HEAVY;
/** Describes a interconnect layer. */
public static final int INTERCONNECT = Layer.INTERCONNECT;
- /** Describes a nonelectrical layer (does not carry signals). */
+ /** Describes a non-electrical layer (does not carry signals). */
public static final int NONELEC = Layer.NONELEC;
/** Describes a layer that contacts metal (used to identify contacts/vias). */
public static final int CONMETAL = Layer.CONMETAL;
@@ -392,14 +353,15 @@ public class Layer implements Serializable, Comparable {
public static final int CONDIFF = Layer.CONDIFF;
/** Describes a layer that is VTH or VTL */
public static final int HLVT = Layer.HLVT;
-// /** Describes a layer that is inside transistor. */ public static final int INTRANS = Layer.INTRANS;
/** Describes a thick layer. */
public static final int THICK = Layer.THICK;
/** Describes a native layer. */
public static final int NATIVE = Layer.NATIVE;
/** Describes a deep layer. */
public static final int DEEP = Layer.DEEP;
-// /** Describes a carbon-nanotube Active layer. */ public static final int CARBNANO = Layer.CARBNANO;
+ /** Describes a cut layer. */
+ public static final int CUTLAYER = Layer.CUTLAYER;
+
private final String name;
private final boolean isMetal;
private final boolean isContact;
@@ -408,7 +370,8 @@ public class Layer implements Serializable, Comparable {
private final int maskColor;
private final int height;
private final int extraBits;
- private static final int[] extras = {PTYPE, NTYPE, DEPLETION, ENHANCEMENT, LIGHT, HEAVY, INTERCONNECT, NONELEC, CONMETAL, CONPOLY, CONDIFF, HLVT, INTRANS, THICK, CARBNANO};
+ private static final int[] extras = {PTYPE, NTYPE, DEPLETION, ENHANCEMENT, LIGHT, HEAVY, INTERCONNECT, NONELEC,
+ CONMETAL, CONPOLY, CONDIFF, HLVT, INTRANS, THICK, CARBNANO, CUTLAYER};
static {
allFunctions = Arrays.asList(Function.class.getEnumConstants());
@@ -436,7 +399,13 @@ public class Layer implements Serializable, Comparable {
}
}
if (isContact) {
- contactLayers.addLayer(this, level = contactLevel);
+ switch (maskColor)
+ {
+ case 0: contactLayers.addLayer(this, level = contactLevel); break;
+ case 1: contactLayers1.addLayer(this, level = contactLevel); break;
+ case 2: contactLayers2.addLayer(this, level = contactLevel); break;
+ case 3: contactLayers3.addLayer(this, level = contactLevel); break;
+ }
}
if (isPoly) {
polyLayers.addLayer(this, level = polyLevel);
@@ -512,119 +481,26 @@ public class Layer implements Serializable, Comparable {
* @param extra the extra bits value (must be a single bit, not an ORed combination).
* @return the name of that extra bit.
*/
- public static String getExtraName(int extra) {
- if (extra == PTYPE) {
- return "p-type";
- }
- if (extra == NTYPE) {
- return "n-type";
- }
- if (extra == DEPLETION) {
- return "depletion";
- }
- if (extra == ENHANCEMENT) {
- return "enhancement";
- }
- if (extra == LIGHT) {
- return "light";
- }
- if (extra == HEAVY) {
- return "heavy";
- }
- if (extra == INTERCONNECT) {
- return "interconnect";
- }
- if (extra == NONELEC) {
- return "nonelectrical";
- }
- if (extra == CONMETAL) {
- return "connects-metal";
- }
- if (extra == CONPOLY) {
- return "connects-poly";
- }
- if (extra == CONDIFF) {
- return "connects-diff";
- }
- if (extra == HLVT) {
- return "vt";
- }
- if (extra == INTRANS) {
- return "inside-transistor";
- }
- if (extra == THICK) {
- return "thick";
- }
- if (extra == NATIVE) {
- return "native";
- }
- if (extra == DEEP) {
- return "deep";
- }
- if (extra == CARBNANO) {
- return "carb-nano";
- }
- return "";
- }
-
- /**
- * Method to convert an "extra bits" value to a constant name.
- * Constant names are used when writing Java code, so they must be the same as the actual symbol name.
- * @param extra the extra bits value (must be a single bit, not an ORed combination).
- * @return the name of that extra bit's constant.
- */
- public static String getExtraConstantName(int extra) {
- if (extra == PTYPE) {
- return "PTYPE";
- }
- if (extra == NTYPE) {
- return "NTYPE";
- }
- if (extra == DEPLETION) {
- return "DEPLETION";
- }
- if (extra == ENHANCEMENT) {
- return "ENHANCEMENT";
- }
- if (extra == LIGHT) {
- return "LIGHT";
- }
- if (extra == HEAVY) {
- return "HEAVY";
- }
- if (extra == INTERCONNECT) {
- return "INTERCONNECT";
- }
- if (extra == NONELEC) {
- return "NONELEC";
- }
- if (extra == CONMETAL) {
- return "CONMETAL";
- }
- if (extra == CONPOLY) {
- return "CONPOLY";
- }
- if (extra == CONDIFF) {
- return "CONDIFF";
- }
- if (extra == HLVT) {
- return "HLVT";
- }
- if (extra == INTRANS) {
- return "INTRANS";
- }
- if (extra == THICK) {
- return "THICK";
- }
- if (extra == NATIVE) {
- return "NATIVE";
- }
- if (extra == DEEP) {
- return "DEEP";
- }
- if (extra == CARBNANO) {
- return "CN";
- }
+ public static String getExtraName(int extra)
+ {
+ if (extra == PTYPE) return "p-type";
+ if (extra == NTYPE) return "n-type";
+ if (extra == DEPLETION) return "depletion";
+ if (extra == ENHANCEMENT) return "enhancement";
+ if (extra == LIGHT) return "light";
+ if (extra == HEAVY) return "heavy";
+ if (extra == INTERCONNECT) return "interconnect";
+ if (extra == NONELEC) return "nonelectrical";
+ if (extra == CONMETAL) return "connects-metal";
+ if (extra == CONPOLY) return "connects-poly";
+ if (extra == CONDIFF) return "connects-diff";
+ if (extra == HLVT) return "vt";
+ if (extra == INTRANS) return "inside-transistor";
+ if (extra == THICK) return "thick";
+ if (extra == NATIVE) return "native";
+ if (extra == DEEP) return "deep";
+ if (extra == CARBNANO) return "carb-nano";
+ if (extra == CUTLAYER) return "cut-layer";
return "";
}
@@ -634,61 +510,57 @@ public class Layer implements Serializable, Comparable {
* @return the numeric equivalent of that bit.
*/
public static int parseExtraName(String name) {
- if (name.equalsIgnoreCase("p-type")) {
- return PTYPE;
- }
- if (name.equalsIgnoreCase("n-type")) {
- return NTYPE;
- }
- if (name.equalsIgnoreCase("depletion")) {
- return DEPLETION;
- }
- if (name.equalsIgnoreCase("enhancement")) {
- return ENHANCEMENT;
- }
- if (name.equalsIgnoreCase("light")) {
- return LIGHT;
- }
- if (name.equalsIgnoreCase("heavy")) {
- return HEAVY;
- }
- if (name.equalsIgnoreCase("interconnect")) {
- return INTERCONNECT;
- }
- if (name.equalsIgnoreCase("nonelectrical")) {
- return NONELEC;
- }
- if (name.equalsIgnoreCase("connects-metal")) {
- return CONMETAL;
- }
- if (name.equalsIgnoreCase("connects-poly")) {
- return CONPOLY;
- }
- if (name.equalsIgnoreCase("connects-diff")) {
- return CONDIFF;
- }
- if (name.equalsIgnoreCase("inside-transistor")) {
- return INTRANS;
- }
- if (name.equalsIgnoreCase("thick")) {
- return THICK;
- }
- if (name.equalsIgnoreCase("vt")) {
- return HLVT;
- }
- if (name.equalsIgnoreCase("native")) {
- return NATIVE;
- }
- if (name.equalsIgnoreCase("deep")) {
- return DEEP;
- }
- if (name.equalsIgnoreCase("carb-nano")) {
- return CARBNANO;
- }
+ if (name.equalsIgnoreCase("p-type")) return PTYPE;
+ if (name.equalsIgnoreCase("n-type")) return NTYPE;
+ if (name.equalsIgnoreCase("depletion")) return DEPLETION;
+ if (name.equalsIgnoreCase("enhancement")) return ENHANCEMENT;
+ if (name.equalsIgnoreCase("light")) return LIGHT;
+ if (name.equalsIgnoreCase("heavy")) return HEAVY;
+ if (name.equalsIgnoreCase("interconnect")) return INTERCONNECT;
+ if (name.equalsIgnoreCase("nonelectrical")) return NONELEC;
+ if (name.equalsIgnoreCase("connects-metal")) return CONMETAL;
+ if (name.equalsIgnoreCase("connects-poly")) return CONPOLY;
+ if (name.equalsIgnoreCase("connects-diff")) return CONDIFF;
+ if (name.equalsIgnoreCase("vt")) return HLVT;
+ if (name.equalsIgnoreCase("inside-transistor")) return INTRANS;
+ if (name.equalsIgnoreCase("thick")) return THICK;
+ if (name.equalsIgnoreCase("native")) return NATIVE;
+ if (name.equalsIgnoreCase("deep")) return DEEP;
+ if (name.equalsIgnoreCase("carb-nano")) return CARBNANO;
+ if (name.equalsIgnoreCase("cut-layer")) return CUTLAYER;
return 0;
}
/**
+ * Method to convert an "extra bits" value to a constant name.
+ * Constant names are used when writing Java code, so they must be the same as the actual symbol name.
+ * @param extra the extra bits value (must be a single bit, not an ORed combination).
+ * @return the name of that extra bit's constant.
+ */
+ public static String getExtraConstantName(int extra)
+ {
+ if (extra == PTYPE) return "PTYPE";
+ if (extra == NTYPE) return "NTYPE";
+ if (extra == DEPLETION) return "DEPLETION";
+ if (extra == ENHANCEMENT) return "ENHANCEMENT";
+ if (extra == LIGHT) return "LIGHT";
+ if (extra == HEAVY) return "HEAVY";
+ if (extra == INTERCONNECT) return "INTERCONNECT";
+ if (extra == NONELEC) return "NONELEC";
+ if (extra == CONMETAL) return "CONMETAL";
+ if (extra == CONPOLY) return "CONPOLY";
+ if (extra == CONDIFF) return "CONDIFF";
+ if (extra == HLVT) return "HLVT";
+ if (extra == INTRANS) return "INTRANS";
+ if (extra == THICK) return "THICK";
+ if (extra == NATIVE) return "NATIVE";
+ if (extra == DEEP) return "DEEP";
+ if (extra == CARBNANO) return "CN";
+ if (extra == CUTLAYER) return "CUT";
+ return "";
+ }
+
+ /**
* Method to get the level of this Layer.
* The level applies to metal and polysilicon functions, and gives the layer number
* (i.e. Metal-2 is level 2).
@@ -836,15 +708,22 @@ public class Layer implements Serializable, Comparable {
/**
* Method to find the Function that corresponds to a contact on a given layer.
* @param l the layer (starting at 1 for Contact-1).
+ * @param maskColor the mask number (maximum is 3; 0 for uncolored layers)
* @return the Function that represents that Contact layer. Null if the given layer level is invalid.
*/
- public static Function getContact(int l) {
+ public static Function getContact(int l, int maskColor) {
if (l > EGraphics.getMaxTransparentLayer()) {
System.out.println("Invalid via layer level:" + l);
return null;
}
- Function func = contactLayers.get(l);
- return func;
+ switch (maskColor)
+ {
+ case 0: return contactLayers.get(l);
+ case 1: return contactLayers1.get(l);
+ case 2: return contactLayers2.get(l);
+ case 3: return contactLayers3.get(l);
+ }
+ return null;
}
/**
@@ -1954,7 +1833,7 @@ public class Layer implements Serializable, Comparable {
/**
* Method to create XML version of a Layer.
- * @return
+ * @return the Xml.Layer for the Layer.
*/
Xml.Layer makeXml() {
Xml.Layer l = new Xml.Layer();
diff --git a/com/sun/electric/technology/PrimitiveNode.java b/com/sun/electric/technology/PrimitiveNode.java
index 5212989..ddbccd0 100644
--- a/com/sun/electric/technology/PrimitiveNode.java
+++ b/com/sun/electric/technology/PrimitiveNode.java
@@ -4,7 +4,7 @@
*
* File: PrimitiveNode.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/PrimitiveNodeGroup.java b/com/sun/electric/technology/PrimitiveNodeGroup.java
index 4956e3a..e050a2f 100644
--- a/com/sun/electric/technology/PrimitiveNodeGroup.java
+++ b/com/sun/electric/technology/PrimitiveNodeGroup.java
@@ -4,7 +4,7 @@
*
* File: PrimitiveNode.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/PrimitiveNodeSize.java b/com/sun/electric/technology/PrimitiveNodeSize.java
index dc97af0..cf1272a 100644
--- a/com/sun/electric/technology/PrimitiveNodeSize.java
+++ b/com/sun/electric/technology/PrimitiveNodeSize.java
@@ -4,7 +4,7 @@
*
* File: TransistorSize.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/PrimitivePort.java b/com/sun/electric/technology/PrimitivePort.java
index b331265..e9b09ec 100644
--- a/com/sun/electric/technology/PrimitivePort.java
+++ b/com/sun/electric/technology/PrimitivePort.java
@@ -4,7 +4,7 @@
*
* File: PrimitivePort.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/SizeOffset.java b/com/sun/electric/technology/SizeOffset.java
index dcc3ab5..e163433 100644
--- a/com/sun/electric/technology/SizeOffset.java
+++ b/com/sun/electric/technology/SizeOffset.java
@@ -4,7 +4,7 @@
*
* File: SizeOffset.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/TechFactory.java b/com/sun/electric/technology/TechFactory.java
index d67ab2a..a0ff398 100644
--- a/com/sun/electric/technology/TechFactory.java
+++ b/com/sun/electric/technology/TechFactory.java
@@ -4,7 +4,7 @@
*
* File: TechFactory.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -49,11 +49,10 @@ import java.util.Map;
*
*/
public abstract class TechFactory {
-
- private static boolean DUMMY_TECH = false;
final String techName;
private final List<Param> techParams;
+ private static List<String> sensitiveTechNames = new ArrayList<String>();
public static class Param {
@@ -134,6 +133,13 @@ public abstract class TechFactory {
return techParams;
}
+ /**
+ * Method to return a list of technology names that are IP sensitive,
+ * and are therefore NOT expected to be in the public version of Electric.
+ * @return a list of technology names that are IP sensitive.
+ */
+ public static List<String> getSensitiveTechNames() { return sensitiveTechNames; }
+
abstract String getDescription();
void write(IdWriter writer) throws IOException {
@@ -155,26 +161,25 @@ public abstract class TechFactory {
c(m, "artwork", "com.sun.electric.technology.technologies.Artwork");
c(m, "fpga", "com.sun.electric.technology.technologies.FPGA");
c(m, "schematic", "com.sun.electric.technology.technologies.Schematics");
- r(m, "bicmos", "technology/technologies/bicmos.xml");
- r(m, "bipolar", "technology/technologies/bipolar.xml");
- r(m, "cmos", "technology/technologies/cmos.xml");
- if (DUMMY_TECH) {
- r(m, "dummy", "technology/technologies/dummy.xml");
- }
- r(m, "efido", "technology/technologies/efido.xml");
+ r(m, "bicmos", "technology/technologies/bicmos.xml", false);
+ r(m, "bipolar", "technology/technologies/bipolar.xml", false);
+ r(m, "cmos", "technology/technologies/cmos.xml", false);
+ r(m, "efido", "technology/technologies/efido.xml", false);
c(m, "gem", "com.sun.electric.technology.technologies.GEM");
- r(m, "pcb", "technology/technologies/pcb.xml");
- r(m, "rcmos", "technology/technologies/rcmos.xml");
+ r(m, "pcb", "technology/technologies/pcb.xml", false);
+ r(m, "rcmos", "technology/technologies/rcmos.xml", false);
p(m, "mocmos", "com.sun.electric.technology.technologies.MoCMOS", false);
- r(m, "mocmosold", "technology/technologies/mocmosold.xml");
- r(m, "mocmossub", "technology/technologies/mocmossub.xml");
- r(m, "nmos", "technology/technologies/nmos.xml");
- r(m, "tft", "technology/technologies/tft.xml");
- p(m, "tsmc180", "com.sun.electric.plugins.tsmc.TSMC180", false);
- p(m, "cmos90", "com.sun.electric.plugins.tsmc.CMOS90", false);
-// r(m, "CLN40G", "plugins/tsmc/CLN40G.xml");
- r(m, "tsmcSun40GP", "plugins/tsmc/tsmcSun40GP.xml");
- r(m, "tsmcCLN40G", "plugins/tsmc/tsmcCLN40G.xml");
+ r(m, "mocmosold", "technology/technologies/mocmosold.xml", false);
+ r(m, "mocmossub", "technology/technologies/mocmossub.xml", false);
+ r(m, "mocmos-cn", "technology/technologies/mocmos-cn.xml", false);
+ r(m, "nmos", "technology/technologies/nmos.xml", false);
+ p(m, "photonics", "com.sun.electric.technology.technologies.photonics.Photonics", false);
+ r(m, "tft", "technology/technologies/tft.xml", false);
+ p(m, "tsmc180", "com.sun.electric.plugins.tsmc.TSMC180", true);
+ p(m, "cmos90", "com.sun.electric.plugins.tsmc.CMOS90", true);
+// r(m, "CLN40G", "plugins/tsmc/CLN40G.xml", true);
+ r(m, "tsmcSun40GP", "plugins/tsmc/tsmcSun40GP.xml", true);
+ r(m, "tsmcCLN40G", "plugins/tsmc/tsmcCLN40G.xml", true);
return Collections.unmodifiableMap(m);
}
@@ -199,8 +204,9 @@ public abstract class TechFactory {
Method getTechParamsMethod = techClass.getMethod("getTechParams");
params = (List<Param>) getTechParamsMethod.invoke(null);
techFactory = new FromParamClass(techName, techClass, params);
+ if (restricted) sensitiveTechNames.add(techName);
} catch (Exception e) {
- if (!restricted) TextUtils.recordMissingTechnology(techName);
+ TextUtils.recordMissingTechnology(techName);
return;
}
m.put(techName, techFactory);
@@ -210,13 +216,14 @@ public abstract class TechFactory {
m.put(techName, new FromClass(techName, techClassName));
}
- private static void r(Map<String, TechFactory> m, String techName, String resourceName) {
+ private static void r(Map<String, TechFactory> m, String techName, String resourceName, boolean restricted) {
assert techName != null;
URL url = Main.class.getResource(resourceName);
if (url == null) {
return;
}
m.put(techName, new FromXml(techName, false, url, null));
+ if (restricted) sensitiveTechNames.add(techName);
}
abstract Technology newInstanceImpl(Generic generic, Map<Param, Object> paramValues) throws Exception;
@@ -350,10 +357,10 @@ public abstract class TechFactory {
if (xmlTech == null) {
throw new Exception("Can't load extra technology: " + urlXml);
}
- if (!xmlTech.techName.equals(techName)) {
- String techName = xmlTech.techName;
+ String xmlTechName = xmlTech.techName;
+ if (!xmlTechName.equals(techName)) {
xmlTech = null;
- throw new Exception("Tech name " + techName + " doesn't match file name:" + urlXml);
+ throw new Exception("Tech name " + xmlTechName + " doesn't match " + techName + " in file:" + urlXml);
}
}
return xmlTech;
diff --git a/com/sun/electric/technology/TechPool.java b/com/sun/electric/technology/TechPool.java
index 71e8e22..bfa81e6 100644
--- a/com/sun/electric/technology/TechPool.java
+++ b/com/sun/electric/technology/TechPool.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: TechPool.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/Technology.java b/com/sun/electric/technology/Technology.java
index 6c3e6d3..9e0bbb1 100644
--- a/com/sun/electric/technology/Technology.java
+++ b/com/sun/electric/technology/Technology.java
@@ -4,7 +4,7 @@
*
* File: Technology.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -2740,7 +2740,20 @@ public class Technology implements Comparable<Technology>, Serializable {
* @return a PortInst for the bias of the transistor
*/
public PortInst getTransistorBiasPort(NodeInst ni) {
- // By default, transistors have no bias port
+ // The position dependent implementation is a hack, but no worse than the MoCMOS.java override.
+ if (ni.getNumPortInsts() > 4) {
+ // By convention FET primitivies have 5 or more ports defined in the xml:
+ // port[0] --> gate_left
+ // port[1] --> diff_top
+ // port[2] --> gate_right
+ // port[3] --> diff_bottom
+ // port[4] --> transistor-well, the last port is the back-gate bias
+ return ni.getPortInst(ni.getNumPortInsts()-1);
+ }
+
+ // By default, transistors have no bias port.
+ // The Schematic and MoCMOS technologies override this function.
+ // should only return null when a FET in a DIY process.xml is badly formed.
return null;
}
diff --git a/com/sun/electric/technology/Technology.xsd b/com/sun/electric/technology/Technology.xsd
index f09b5f8..8ea24ac 100644
--- a/com/sun/electric/technology/Technology.xsd
+++ b/com/sun/electric/technology/Technology.xsd
@@ -7,7 +7,7 @@
* File: Technology.xsd
* technology scheme
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -371,20 +371,20 @@
<xsd:enumeration value="IMPLANT"/>
<xsd:enumeration value="IMPLANTP"/>
<xsd:enumeration value="IMPLANTN"/>
- <xsd:enumeration value="CONTACT1"/>
- <xsd:enumeration value="CONTACT2"/>
- <xsd:enumeration value="CONTACT3"/>
- <xsd:enumeration value="CONTACT4"/>
- <xsd:enumeration value="CONTACT5"/>
- <xsd:enumeration value="CONTACT6"/>
- <xsd:enumeration value="CONTACT7"/>
- <xsd:enumeration value="CONTACT8"/>
- <xsd:enumeration value="CONTACT9"/>
- <xsd:enumeration value="CONTACT10"/>
- <xsd:enumeration value="CONTACT11"/>
- <xsd:enumeration value="CONTACT12"/>
- <xsd:enumeration value="CONTACT13"/>
- <xsd:enumeration value="CONTACT14"/>
+ <xsd:enumeration value="CONTACT1"/> <xsd:enumeration value="CONTACT1C1"/> <xsd:enumeration value="CONTACT1C2"/> <xsd:enumeration value="CONTACT1C3"/>
+ <xsd:enumeration value="CONTACT2"/> <xsd:enumeration value="CONTACT2C1"/> <xsd:enumeration value="CONTACT2C2"/> <xsd:enumeration value="CONTACT2C3"/>
+ <xsd:enumeration value="CONTACT3"/> <xsd:enumeration value="CONTACT3C1"/> <xsd:enumeration value="CONTACT3C2"/> <xsd:enumeration value="CONTACT3C3"/>
+ <xsd:enumeration value="CONTACT4"/> <xsd:enumeration value="CONTACT4C1"/> <xsd:enumeration value="CONTACT4C2"/> <xsd:enumeration value="CONTACT4C3"/>
+ <xsd:enumeration value="CONTACT5"/> <xsd:enumeration value="CONTACT5C1"/> <xsd:enumeration value="CONTACT5C2"/> <xsd:enumeration value="CONTACT5C3"/>
+ <xsd:enumeration value="CONTACT6"/> <xsd:enumeration value="CONTACT6C1"/> <xsd:enumeration value="CONTACT6C2"/> <xsd:enumeration value="CONTACT6C3"/>
+ <xsd:enumeration value="CONTACT7"/> <xsd:enumeration value="CONTACT7C1"/> <xsd:enumeration value="CONTACT7C2"/> <xsd:enumeration value="CONTACT7C3"/>
+ <xsd:enumeration value="CONTACT8"/> <xsd:enumeration value="CONTACT8C1"/> <xsd:enumeration value="CONTACT8C2"/> <xsd:enumeration value="CONTACT8C3"/>
+ <xsd:enumeration value="CONTACT9"/> <xsd:enumeration value="CONTACT9C1"/> <xsd:enumeration value="CONTACT9C2"/> <xsd:enumeration value="CONTACT9C3"/>
+ <xsd:enumeration value="CONTACT10"/> <xsd:enumeration value="CONTACT10C1"/> <xsd:enumeration value="CONTACT10C2"/> <xsd:enumeration value="CONTACT10C3"/>
+ <xsd:enumeration value="CONTACT11"/> <xsd:enumeration value="CONTACT11C1"/> <xsd:enumeration value="CONTACT11C2"/> <xsd:enumeration value="CONTACT11C3"/>
+ <xsd:enumeration value="CONTACT12"/> <xsd:enumeration value="CONTACT12C1"/> <xsd:enumeration value="CONTACT12C2"/> <xsd:enumeration value="CONTACT12C3"/>
+ <xsd:enumeration value="CONTACT13"/> <xsd:enumeration value="CONTACT13C1"/> <xsd:enumeration value="CONTACT13C2"/> <xsd:enumeration value="CONTACT13C3"/>
+ <xsd:enumeration value="CONTACT14"/> <xsd:enumeration value="CONTACT14C1"/> <xsd:enumeration value="CONTACT14C2"/> <xsd:enumeration value="CONTACT14C3"/>
<xsd:enumeration value="PLUG"/>
<xsd:enumeration value="OVERGLASS"/>
<xsd:enumeration value="RESISTOR"/>
@@ -460,6 +460,7 @@
<xsd:enumeration value="deep"/>
<xsd:enumeration value="carb-nano"/>
<xsd:enumeration value="interconnect"/>
+ <xsd:enumeration value="cut-layer"/>
</xsd:restriction>
</xsd:simpleType>
@@ -731,6 +732,9 @@
<xsd:enumeration value="MINAREA"/>
<xsd:enumeration value="MINENCLOSEDAREA"/>
<xsd:enumeration value="SURROUND"/>
+ <xsd:enumeration value="G0CPL"/>
+ <xsd:enumeration value="DIAGONALVIA"/>
+ <xsd:enumeration value="DIFFMASKSEP"/>
</xsd:restriction>
</xsd:simpleType>
@@ -745,6 +749,8 @@
<xsd:enumeration value="EXTENSION"/>
<xsd:enumeration value="EXTENSIONGATE"/>
<xsd:enumeration value="SURROUND"/>
+ <xsd:enumeration value="G0CPL"/>
+ <xsd:enumeration value="DIAGONALVIA"/>
</xsd:restriction>
</xsd:simpleType>
diff --git a/com/sun/electric/technology/TransistorSize.java b/com/sun/electric/technology/TransistorSize.java
index 81a6061..d45e17b 100644
--- a/com/sun/electric/technology/TransistorSize.java
+++ b/com/sun/electric/technology/TransistorSize.java
@@ -4,7 +4,7 @@
*
* File: TransistorSize.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/XMLRules.java b/com/sun/electric/technology/XMLRules.java
index 71f3a6e..55d499c 100644
--- a/com/sun/electric/technology/XMLRules.java
+++ b/com/sun/electric/technology/XMLRules.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: XMLRules.java
- * Written by Gilda Garreton, Sun Microsystems.
+ * Written by Gilda Garreton.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -1124,6 +1124,9 @@ public class XMLRules implements Serializable
else
addRule(index, theRule);
break;
+ case G0CPL:
+ case DIAGONALVIA:
+ case DIFFMASKSEP:
case MINAREA:
case MINENCLOSEDAREA:
case EXTENSION:
@@ -1165,7 +1168,7 @@ public class XMLRules implements Serializable
{
System.out.println("Rule " + theRule.ruleName + " type " + theRule.ruleType +
" not implemented in " + tech.getTechName());
- assert(false);
+ //assert(false);
}
}
}
diff --git a/com/sun/electric/technology/Xml.java b/com/sun/electric/technology/Xml.java
index dbda931..8cd8a25 100644
--- a/com/sun/electric/technology/Xml.java
+++ b/com/sun/electric/technology/Xml.java
@@ -4,7 +4,7 @@
*
* File: Xml.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/technologies/Artwork.java b/com/sun/electric/technology/technologies/Artwork.java
index d227e16..04df458 100644
--- a/com/sun/electric/technology/technologies/Artwork.java
+++ b/com/sun/electric/technology/technologies/Artwork.java
@@ -4,7 +4,7 @@
*
* File: Artwork.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/technologies/Dummy.java b/com/sun/electric/technology/technologies/Dummy.java
index c195635..fdfedc4 100644
--- a/com/sun/electric/technology/technologies/Dummy.java
+++ b/com/sun/electric/technology/technologies/Dummy.java
@@ -4,7 +4,7 @@
*
* File: MoCMOS.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/technologies/FPGA.java b/com/sun/electric/technology/technologies/FPGA.java
index 5eb315d..9ed2044 100644
--- a/com/sun/electric/technology/technologies/FPGA.java
+++ b/com/sun/electric/technology/technologies/FPGA.java
@@ -6,7 +6,7 @@
* FPGA, a customizable technology.
* Written by Steven M. Rubin
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/technologies/GEM.java b/com/sun/electric/technology/technologies/GEM.java
index d47c764..4d1755c 100644
--- a/com/sun/electric/technology/technologies/GEM.java
+++ b/com/sun/electric/technology/technologies/GEM.java
@@ -6,7 +6,7 @@
* gem technology description
* Generated automatically from a library
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/technologies/Generic.java b/com/sun/electric/technology/technologies/Generic.java
index c0ce0ab..3e1131f 100644
--- a/com/sun/electric/technology/technologies/Generic.java
+++ b/com/sun/electric/technology/technologies/Generic.java
@@ -4,7 +4,7 @@
*
* File: Generic.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/technologies/MoCMOS.java b/com/sun/electric/technology/technologies/MoCMOS.java
index 30ebe2a..8565b32 100644
--- a/com/sun/electric/technology/technologies/MoCMOS.java
+++ b/com/sun/electric/technology/technologies/MoCMOS.java
@@ -4,7 +4,7 @@
*
* File: MoCMOS.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/technologies/Schematics.java b/com/sun/electric/technology/technologies/Schematics.java
index ec7e102..15edcbe 100644
--- a/com/sun/electric/technology/technologies/Schematics.java
+++ b/com/sun/electric/technology/technologies/Schematics.java
@@ -4,7 +4,7 @@
*
* File: Schematics.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/technologies/artworkMenu.xml b/com/sun/electric/technology/technologies/artworkMenu.xml
index 967cc9e..8b7fff6 100644
--- a/com/sun/electric/technology/technologies/artworkMenu.xml
+++ b/com/sun/electric/technology/technologies/artworkMenu.xml
@@ -8,7 +8,7 @@
* artwork technology menu description
* Generated automatically from a library
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/technologies/bicmos.xml b/com/sun/electric/technology/technologies/bicmos.xml
index 4aa2e9a..ae5cffe 100644
--- a/com/sun/electric/technology/technologies/bicmos.xml
+++ b/com/sun/electric/technology/technologies/bicmos.xml
@@ -8,7 +8,7 @@
* bicmos technology description
* Generated automatically from a library
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/technologies/bipolar.xml b/com/sun/electric/technology/technologies/bipolar.xml
index 62fd175..9382170 100644
--- a/com/sun/electric/technology/technologies/bipolar.xml
+++ b/com/sun/electric/technology/technologies/bipolar.xml
@@ -8,7 +8,7 @@
* bipolar technology description
* Generated automatically from a library
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/technologies/cmos.xml b/com/sun/electric/technology/technologies/cmos.xml
index f90c54f..a87b6aa 100644
--- a/com/sun/electric/technology/technologies/cmos.xml
+++ b/com/sun/electric/technology/technologies/cmos.xml
@@ -8,7 +8,7 @@
* cmos technology description
* Generated automatically from a library
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/technologies/dummy.xml b/com/sun/electric/technology/technologies/dummy.xml
index 53f2d6a..c04b7fa 100644
--- a/com/sun/electric/technology/technologies/dummy.xml
+++ b/com/sun/electric/technology/technologies/dummy.xml
@@ -7,7 +7,7 @@
* File: dummy.xml
* dummy technology description
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/technologies/efido.xml b/com/sun/electric/technology/technologies/efido.xml
index 81c69c9..9544eef 100644
--- a/com/sun/electric/technology/technologies/efido.xml
+++ b/com/sun/electric/technology/technologies/efido.xml
@@ -8,7 +8,7 @@
* Digital Filter technology technology description
* Generated automatically from a library
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/technologies/fpgaMenu.xml b/com/sun/electric/technology/technologies/fpgaMenu.xml
index 8106597..db17a11 100644
--- a/com/sun/electric/technology/technologies/fpgaMenu.xml
+++ b/com/sun/electric/technology/technologies/fpgaMenu.xml
@@ -8,7 +8,7 @@
* fpga technology menu description
* Generated automatically from a library
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/technologies/gemMenu.xml b/com/sun/electric/technology/technologies/gemMenu.xml
index db9e008..52ae842 100644
--- a/com/sun/electric/technology/technologies/gemMenu.xml
+++ b/com/sun/electric/technology/technologies/gemMenu.xml
@@ -8,7 +8,7 @@
* gem technology menu description
* Generated automatically from a library
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/technologies/mocmos-cn.xml b/com/sun/electric/technology/technologies/mocmos-cn.xml
new file mode 100644
index 0000000..e1f59ce
--- /dev/null
+++ b/com/sun/electric/technology/technologies/mocmos-cn.xml
@@ -0,0 +1,1826 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ *
+ * Electric(tm) VLSI Design System, version 8.10
+ *
+ * File: mocmos-cn.xml
+ * mocmos-cn technology description
+ * Generated automatically from a library
+ *
+-->
+
+<technology name="mocmos-cn"
+ xmlns="http://electric.sun.com/Technology"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://electric.sun.com/Technology ../../technology/Technology.xsd">
+
+ <shortName>MOSIS CMOS CN</shortName>
+ <description>MOSIS CMOS Carbon Nanotube (3 metals, 1 poly, flex rules [now submicron], alternate contact rules)</description>
+ <numMetals min="3" max="3" default="3"/>
+ <scale value="200.0" relevant="true"/>
+ <resolution value="0.0"/>
+ <defaultFoundry value="MOSIS"/>
+ <minResistance value="4.0"/>
+ <minCapacitance value="0.1"/>
+
+ <!-- Transparent layers -->
+ <transparentLayer transparent="1">
+ <r>96</r>
+ <g>209</g>
+ <b>255</b>
+ </transparentLayer>
+ <transparentLayer transparent="2">
+ <r>255</r>
+ <g>155</g>
+ <b>192</b>
+ </transparentLayer>
+ <transparentLayer transparent="3">
+ <r>107</r>
+ <g>226</g>
+ <b>96</b>
+ </transparentLayer>
+ <transparentLayer transparent="4">
+ <r>224</r>
+ <g>95</g>
+ <b>255</b>
+ </transparentLayer>
+ <transparentLayer transparent="5">
+ <r>247</r>
+ <g>251</g>
+ <b>20</b>
+ </transparentLayer>
+ <transparentLayer transparent="6">
+ <r>51</r>
+ <g>153</g>
+ <b>0</b>
+ </transparentLayer>
+ <transparentLayer transparent="7">
+ <r>0</r>
+ <g>102</g>
+ <b>102</b>
+ </transparentLayer>
+
+ <!-- **************************************** LAYERS **************************************** -->
+ <layer name="Metal-1" fun="METAL1">
+ <transparentColor transparent="1"/>
+ <patternedOnDisplay>false</patternedOnDisplay>
+ <patternedOnPrinter>true</patternedOnPrinter>
+ <pattern> X X X X </pattern>
+ <pattern> </pattern>
+ <pattern>X X X X </pattern>
+ <pattern> </pattern>
+ <pattern> X X X X </pattern>
+ <pattern> </pattern>
+ <pattern>X X X X </pattern>
+ <pattern> </pattern>
+ <pattern> X X X X </pattern>
+ <pattern> </pattern>
+ <pattern>X X X X </pattern>
+ <pattern> </pattern>
+ <pattern> X X X X </pattern>
+ <pattern> </pattern>
+ <pattern>X X X X </pattern>
+ <pattern> </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>0.8</opacity>
+ <foreground>true</foreground>
+ <display3D thick="2.65" height="16.5" mode="NONE" factor="0.0"/>
+ <cifLayer cif="CMF"/>
+ <parasitics resistance="0.078" capacitance="0.1209" edgeCapacitance="0.1104"/>
+ <pureLayerNode name="Metal-1-Node" port="metal-1">
+ <lambda>3.0</lambda>
+ <portArc>Metal-1</portArc>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="Metal-2" fun="METAL2">
+ <transparentColor transparent="4"/>
+ <patternedOnDisplay>false</patternedOnDisplay>
+ <patternedOnPrinter>true</patternedOnPrinter>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern>X X </pattern>
+ <pattern> X X</pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern>X X </pattern>
+ <pattern> X X</pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>0.7</opacity>
+ <foreground>true</foreground>
+ <display3D thick="2.65" height="22.15" mode="NONE" factor="0.0"/>
+ <cifLayer cif="CMS"/>
+ <parasitics resistance="0.078" capacitance="0.0843" edgeCapacitance="0.0974"/>
+ <pureLayerNode name="Metal-2-Node" port="metal-2">
+ <lambda>3.0</lambda>
+ <portArc>Metal-2</portArc>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="Metal-3" fun="METAL3">
+ <transparentColor transparent="5"/>
+ <patternedOnDisplay>false</patternedOnDisplay>
+ <patternedOnPrinter>true</patternedOnPrinter>
+ <pattern> X X X X </pattern>
+ <pattern> </pattern>
+ <pattern>X X X X </pattern>
+ <pattern> </pattern>
+ <pattern> X X X X </pattern>
+ <pattern> </pattern>
+ <pattern>X X X X </pattern>
+ <pattern> </pattern>
+ <pattern> X X X X </pattern>
+ <pattern> </pattern>
+ <pattern>X X X X </pattern>
+ <pattern> </pattern>
+ <pattern> X X X X </pattern>
+ <pattern> </pattern>
+ <pattern>X X X X </pattern>
+ <pattern> </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>0.6</opacity>
+ <foreground>true</foreground>
+ <display3D thick="2.65" height="27.8" mode="NONE" factor="0.0"/>
+ <cifLayer cif="CMT"/>
+ <parasitics resistance="0.078" capacitance="0.0843" edgeCapacitance="0.0974"/>
+ <pureLayerNode name="Metal-3-Node" port="metal-3">
+ <lambda>3.0</lambda>
+ <portArc>Metal-3</portArc>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="Polysilicon-1" fun="POLY1">
+ <transparentColor transparent="2"/>
+ <patternedOnDisplay>false</patternedOnDisplay>
+ <patternedOnPrinter>true</patternedOnPrinter>
+ <pattern> X X X X</pattern>
+ <pattern>XXXXXXXXXXXXXXXX</pattern>
+ <pattern> X X X X</pattern>
+ <pattern> X X X X X X X X</pattern>
+ <pattern> X X X X</pattern>
+ <pattern>XXXXXXXXXXXXXXXX</pattern>
+ <pattern> X X X X</pattern>
+ <pattern> X X X X X X X X</pattern>
+ <pattern> X X X X</pattern>
+ <pattern>XXXXXXXXXXXXXXXX</pattern>
+ <pattern> X X X X</pattern>
+ <pattern> X X X X X X X X</pattern>
+ <pattern> X X X X</pattern>
+ <pattern>XXXXXXXXXXXXXXXX</pattern>
+ <pattern> X X X X</pattern>
+ <pattern> X X X X X X X X</pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>1.0</opacity>
+ <foreground>true</foreground>
+ <display3D thick="1.0" height="13.0" mode="NONE" factor="0.0"/>
+ <cifLayer cif="CPG"/>
+ <parasitics resistance="6.2" capacitance="0.1467" edgeCapacitance="0.0608"/>
+ <pureLayerNode name="Polysilicon-1-Node" port="polysilicon-1">
+ <lambda>2.0</lambda>
+ <portArc>Polysilicon-1</portArc>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="P-Active" fun="DIFFP">
+ <transparentColor transparent="3"/>
+ <patternedOnDisplay>false</patternedOnDisplay>
+ <patternedOnPrinter>true</patternedOnPrinter>
+ <pattern> </pattern>
+ <pattern> XX XX</pattern>
+ <pattern> X X X X </pattern>
+ <pattern> XX XX</pattern>
+ <pattern> </pattern>
+ <pattern> XX XX </pattern>
+ <pattern>X X X X </pattern>
+ <pattern> XX XX </pattern>
+ <pattern> </pattern>
+ <pattern> XX XX</pattern>
+ <pattern> X X X X </pattern>
+ <pattern> XX XX</pattern>
+ <pattern> </pattern>
+ <pattern> XX XX </pattern>
+ <pattern>X X X X </pattern>
+ <pattern> XX XX </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>1.0</opacity>
+ <foreground>true</foreground>
+ <display3D thick="4.0" height="9.0" mode="NONE" factor="0.0"/>
+ <cifLayer cif="CAA"/>
+ <parasitics resistance="2.5" capacitance="0.9" edgeCapacitance="0.0"/>
+ <pureLayerNode name="P-Active-Node" port="active">
+ <lambda>3.0</lambda>
+ <portArc>P-Active</portArc>
+ <portArc>N-Active</portArc>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="N-Active" fun="DIFFN">
+ <transparentColor transparent="3"/>
+ <patternedOnDisplay>false</patternedOnDisplay>
+ <patternedOnPrinter>true</patternedOnPrinter>
+ <pattern> </pattern>
+ <pattern> XX XX</pattern>
+ <pattern> X X X X </pattern>
+ <pattern> XX XX</pattern>
+ <pattern> </pattern>
+ <pattern> XX XX </pattern>
+ <pattern>X X X X </pattern>
+ <pattern> XX XX </pattern>
+ <pattern> </pattern>
+ <pattern> XX XX</pattern>
+ <pattern> X X X X </pattern>
+ <pattern> XX XX</pattern>
+ <pattern> </pattern>
+ <pattern> XX XX </pattern>
+ <pattern>X X X X </pattern>
+ <pattern> XX XX </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>1.0</opacity>
+ <foreground>true</foreground>
+ <display3D thick="4.0" height="9.0" mode="NONE" factor="0.0"/>
+ <cifLayer cif="CAA"/>
+ <parasitics resistance="3.0" capacitance="0.9" edgeCapacitance="0.0"/>
+ <pureLayerNode name="N-Active-Node" port="active">
+ <lambda>3.0</lambda>
+ <portArc>P-Active</portArc>
+ <portArc>N-Active</portArc>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="P-Select" fun="IMPLANTP">
+ <opaqueColor r="255" g="255" b="0"/>
+ <patternedOnDisplay>true</patternedOnDisplay>
+ <patternedOnPrinter>true</patternedOnPrinter>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern>X X </pattern>
+ <pattern> X X</pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern>X X </pattern>
+ <pattern> X X</pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>1.0</opacity>
+ <foreground>false</foreground>
+ <display3D thick="5.0" height="8.0" mode="NONE" factor="0.0"/>
+ <cifLayer cif="CSP"/>
+ </layer>
+
+ <layer name="N-Select" fun="IMPLANTN">
+ <opaqueColor r="255" g="255" b="0"/>
+ <patternedOnDisplay>true</patternedOnDisplay>
+ <patternedOnPrinter>true</patternedOnPrinter>
+ <pattern> X X</pattern>
+ <pattern> </pattern>
+ <pattern> X X </pattern>
+ <pattern> </pattern>
+ <pattern> X X</pattern>
+ <pattern> </pattern>
+ <pattern> X X </pattern>
+ <pattern> </pattern>
+ <pattern> X X</pattern>
+ <pattern> </pattern>
+ <pattern> X X </pattern>
+ <pattern> </pattern>
+ <pattern> X X</pattern>
+ <pattern> </pattern>
+ <pattern> X X </pattern>
+ <pattern> </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>1.0</opacity>
+ <foreground>false</foreground>
+ <display3D thick="5.0" height="8.0" mode="NONE" factor="0.0"/>
+ <cifLayer cif="CSN"/>
+ </layer>
+
+ <layer name="P-Well" fun="WELLP">
+ <opaqueColor r="139" g="99" b="46"/>
+ <patternedOnDisplay>true</patternedOnDisplay>
+ <patternedOnPrinter>true</patternedOnPrinter>
+ <pattern> X X </pattern>
+ <pattern> X X</pattern>
+ <pattern>X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X</pattern>
+ <pattern>X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>1.0</opacity>
+ <foreground>false</foreground>
+ <display3D thick="13.0" height="0.0" mode="NONE" factor="0.0"/>
+ <cifLayer cif="CWP"/>
+ <pureLayerNode name="P-Well-Node" port="well">
+ <lambda>12.0</lambda>
+ <portArc>P-Well</portArc>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="N-Well" fun="WELLN">
+ <opaqueColor r="139" g="99" b="46"/>
+ <patternedOnDisplay>true</patternedOnDisplay>
+ <patternedOnPrinter>true</patternedOnPrinter>
+ <pattern> X X </pattern>
+ <pattern> </pattern>
+ <pattern> X X </pattern>
+ <pattern> </pattern>
+ <pattern> X X </pattern>
+ <pattern> </pattern>
+ <pattern> X X </pattern>
+ <pattern> </pattern>
+ <pattern> X X </pattern>
+ <pattern> </pattern>
+ <pattern> X X </pattern>
+ <pattern> </pattern>
+ <pattern> X X </pattern>
+ <pattern> </pattern>
+ <pattern> X X </pattern>
+ <pattern> </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>1.0</opacity>
+ <foreground>false</foreground>
+ <display3D thick="13.0" height="0.0" mode="NONE" factor="0.0"/>
+ <cifLayer cif="CWN"/>
+ <pureLayerNode name="N-Well-Node" port="well">
+ <lambda>12.0</lambda>
+ <portArc>N-Well</portArc>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="Poly-Cut" fun="CONTACT1" extraFun="connects-poly">
+ <opaqueColor r="100" g="100" b="100"/>
+ <patternedOnDisplay>false</patternedOnDisplay>
+ <patternedOnPrinter>false</patternedOnPrinter>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>1.0</opacity>
+ <foreground>true</foreground>
+ <display3D thick="2.5" height="14.0" mode="NONE" factor="0.0"/>
+ <cifLayer cif="CCC"/>
+ <parasitics resistance="2.2" capacitance="0.0" edgeCapacitance="0.0"/>
+ <pureLayerNode name="Poly-Cut-Node" port="polycut">
+ <lambda>2.0</lambda>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="Active-Cut" fun="CONTACT1" extraFun="connects-diff">
+ <opaqueColor r="100" g="100" b="100"/>
+ <patternedOnDisplay>false</patternedOnDisplay>
+ <patternedOnPrinter>false</patternedOnPrinter>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>1.0</opacity>
+ <foreground>true</foreground>
+ <display3D thick="3.5" height="13.0" mode="NONE" factor="0.0"/>
+ <cifLayer cif="CCC"/>
+ <parasitics resistance="2.5" capacitance="0.0" edgeCapacitance="0.0"/>
+ <pureLayerNode name="Active-Cut-Node" port="activecut">
+ <lambda>2.0</lambda>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="Via1" fun="CONTACT2" extraFun="connects-metal">
+ <opaqueColor r="180" g="180" b="180"/>
+ <patternedOnDisplay>false</patternedOnDisplay>
+ <patternedOnPrinter>false</patternedOnPrinter>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>1.0</opacity>
+ <foreground>true</foreground>
+ <display3D thick="3.0" height="19.15" mode="NONE" factor="0.0"/>
+ <cifLayer cif="CVA"/>
+ <parasitics resistance="1.0" capacitance="0.0" edgeCapacitance="0.0"/>
+ <pureLayerNode name="Via-1-Node" port="via-1">
+ <lambda>2.0</lambda>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="Via2" fun="CONTACT3" extraFun="connects-metal">
+ <opaqueColor r="180" g="180" b="180"/>
+ <patternedOnDisplay>false</patternedOnDisplay>
+ <patternedOnPrinter>false</patternedOnPrinter>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>1.0</opacity>
+ <foreground>true</foreground>
+ <display3D thick="3.0" height="24.8" mode="NONE" factor="0.0"/>
+ <cifLayer cif="CVS"/>
+ <parasitics resistance="0.9" capacitance="0.0" edgeCapacitance="0.0"/>
+ <pureLayerNode name="Via-2-Node" port="via-2">
+ <lambda>2.0</lambda>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="Via3" fun="CONTACT4" extraFun="connects-metal">
+ <opaqueColor r="180" g="180" b="180"/>
+ <patternedOnDisplay>false</patternedOnDisplay>
+ <patternedOnPrinter>false</patternedOnPrinter>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>1.0</opacity>
+ <foreground>true</foreground>
+ <display3D thick="3.0" height="30.45" mode="NONE" factor="0.0"/>
+ <cifLayer cif="CVT"/>
+ <parasitics resistance="0.8" capacitance="0.0" edgeCapacitance="0.0"/>
+ <pureLayerNode name="Via-3-Node" port="via-3">
+ <lambda>2.0</lambda>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="Transistor-Poly" fun="GATE">
+ <transparentColor transparent="2"/>
+ <patternedOnDisplay>false</patternedOnDisplay>
+ <patternedOnPrinter>true</patternedOnPrinter>
+ <pattern> X X X X</pattern>
+ <pattern>XXXXXXXXXXXXXXXX</pattern>
+ <pattern> X X X X</pattern>
+ <pattern> X X X X X X X X</pattern>
+ <pattern> X X X X</pattern>
+ <pattern>XXXXXXXXXXXXXXXX</pattern>
+ <pattern> X X X X</pattern>
+ <pattern> X X X X X X X X</pattern>
+ <pattern> X X X X</pattern>
+ <pattern>XXXXXXXXXXXXXXXX</pattern>
+ <pattern> X X X X</pattern>
+ <pattern> X X X X X X X X</pattern>
+ <pattern> X X X X</pattern>
+ <pattern>XXXXXXXXXXXXXXXX</pattern>
+ <pattern> X X X X</pattern>
+ <pattern> X X X X X X X X</pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>1.0</opacity>
+ <foreground>true</foreground>
+ <display3D thick="1.0" height="13.0" mode="NONE" factor="0.0"/>
+ <cifLayer cif="CPG"/>
+ <parasitics resistance="2.5" capacitance="0.09" edgeCapacitance="0.0"/>
+ <pureLayerNode name="Transistor-Poly-Node" port="trans-poly-1">
+ <lambda>2.0</lambda>
+ <portArc>Polysilicon-1</portArc>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="Poly-Cap" fun="CAP">
+ <opaqueColor r="0" g="0" b="0"/>
+ <patternedOnDisplay>false</patternedOnDisplay>
+ <patternedOnPrinter>false</patternedOnPrinter>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>1.0</opacity>
+ <foreground>true</foreground>
+ <display3D thick="1.0" height="13.0" mode="NONE" factor="0.0"/>
+ <cifLayer cif="CPC"/>
+ <pureLayerNode name="Poly-Cap-Node" port="poly-cap">
+ <lambda>8.0</lambda>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="P-Active-Well" fun="DIFFP">
+ <transparentColor transparent="3"/>
+ <patternedOnDisplay>false</patternedOnDisplay>
+ <patternedOnPrinter>true</patternedOnPrinter>
+ <pattern> </pattern>
+ <pattern> XX XX</pattern>
+ <pattern> X X X X </pattern>
+ <pattern> XX XX</pattern>
+ <pattern> </pattern>
+ <pattern> XX XX </pattern>
+ <pattern>X X X X </pattern>
+ <pattern> XX XX </pattern>
+ <pattern> </pattern>
+ <pattern> XX XX</pattern>
+ <pattern> X X X X </pattern>
+ <pattern> XX XX</pattern>
+ <pattern> </pattern>
+ <pattern> XX XX </pattern>
+ <pattern>X X X X </pattern>
+ <pattern> XX XX </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>1.0</opacity>
+ <foreground>false</foreground>
+ <display3D thick="4.0" height="9.0" mode="NONE" factor="0.0"/>
+ <cifLayer cif="CAA"/>
+ <pureLayerNode name="P-Active-Well-Node" port="p-active-well">
+ <lambda>8.0</lambda>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="Thick-Active" fun="DIFF" extraFun="thick">
+ <opaqueColor r="0" g="0" b="0"/>
+ <patternedOnDisplay>true</patternedOnDisplay>
+ <patternedOnPrinter>true</patternedOnPrinter>
+ <pattern> X X </pattern>
+ <pattern>X X </pattern>
+ <pattern> X X</pattern>
+ <pattern> X X </pattern>
+ <pattern> X X</pattern>
+ <pattern>X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern>X X </pattern>
+ <pattern> X X</pattern>
+ <pattern> X X </pattern>
+ <pattern> X X</pattern>
+ <pattern>X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>1.0</opacity>
+ <foreground>false</foreground>
+ <display3D thick="7.0" height="6.0" mode="NONE" factor="0.0"/>
+ <cifLayer cif="CTA"/>
+ <pureLayerNode name="Thick-Active-Node" port="thick-active">
+ <lambda>4.0</lambda>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="P-Base" fun="BASE">
+ <opaqueColor r="107" g="226" b="96"/>
+ <patternedOnDisplay>true</patternedOnDisplay>
+ <patternedOnPrinter>true</patternedOnPrinter>
+ <pattern> X X X X </pattern>
+ <pattern> X X X X </pattern>
+ <pattern> X X X X</pattern>
+ <pattern>X X X X </pattern>
+ <pattern> X X X X </pattern>
+ <pattern> X X X X </pattern>
+ <pattern> X X X X</pattern>
+ <pattern> X X X </pattern>
+ <pattern> X X X X </pattern>
+ <pattern> X X X X </pattern>
+ <pattern> X X X X</pattern>
+ <pattern>X X X X </pattern>
+ <pattern> X X X X </pattern>
+ <pattern> X X X X </pattern>
+ <pattern> X X X X</pattern>
+ <pattern> X X X </pattern>
+ <outlined>PAT_S</outlined>
+ <opacity>0.8</opacity>
+ <foreground>true</foreground>
+ <display3D thick="0.0" height="0.0" mode="NONE" factor="0.0"/>
+ <cifLayer cif="CBA"/>
+ <pureLayerNode name="P-Base-Node" port="p-base">
+ <lambda>22.0</lambda>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="N-Active-CN" fun="DIFFN" extraFun="carb-nano">
+ <transparentColor transparent="7"/>
+ <patternedOnDisplay>false</patternedOnDisplay>
+ <patternedOnPrinter>true</patternedOnPrinter>
+ <pattern> </pattern>
+ <pattern> XX XX</pattern>
+ <pattern> X X X X </pattern>
+ <pattern> XX XX</pattern>
+ <pattern> </pattern>
+ <pattern> XX XX </pattern>
+ <pattern>X X X X </pattern>
+ <pattern> XX XX </pattern>
+ <pattern> </pattern>
+ <pattern> XX XX</pattern>
+ <pattern> X X X X </pattern>
+ <pattern> XX XX</pattern>
+ <pattern> </pattern>
+ <pattern> XX XX </pattern>
+ <pattern>X X X X </pattern>
+ <pattern> XX XX </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>1.0</opacity>
+ <foreground>true</foreground>
+ <display3D thick="4.0" height="9.0" mode="NONE" factor="0.0"/>
+ <cifLayer cif="CAA"/>
+ <parasitics resistance="3.0" capacitance="0.9" edgeCapacitance="0.0"/>
+ </layer>
+
+ <layer name="P-Active-CN" fun="DIFFP" extraFun="carb-nano">
+ <transparentColor transparent="6"/>
+ <patternedOnDisplay>false</patternedOnDisplay>
+ <patternedOnPrinter>true</patternedOnPrinter>
+ <pattern> </pattern>
+ <pattern> XX XX</pattern>
+ <pattern> X X X X </pattern>
+ <pattern> XX XX</pattern>
+ <pattern> </pattern>
+ <pattern> XX XX </pattern>
+ <pattern>X X X X </pattern>
+ <pattern> XX XX </pattern>
+ <pattern> </pattern>
+ <pattern> XX XX</pattern>
+ <pattern> X X X X </pattern>
+ <pattern> XX XX</pattern>
+ <pattern> </pattern>
+ <pattern> XX XX </pattern>
+ <pattern>X X X X </pattern>
+ <pattern> XX XX </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>1.0</opacity>
+ <foreground>true</foreground>
+ <display3D thick="4.0" height="9.0" mode="NONE" factor="0.0"/>
+ <cifLayer cif="CAA"/>
+ <parasitics resistance="3.0" capacitance="0.9" edgeCapacitance="0.0"/>
+ </layer>
+
+ <!-- ******************** ARCS ******************** -->
+ <arcProto name="Metal-1" fun="METAL1">
+ <wipable/>
+ <extended>true</extended>
+ <fixedAngle>true</fixedAngle>
+ <angleIncrement>90</angleIncrement>
+ <antennaRatio>400.0</antennaRatio>
+ <arcLayer layer="Metal-1" style="FILLED">
+ <lambda>1.5</lambda>
+ </arcLayer>
+ </arcProto>
+
+ <arcProto name="Metal-2" fun="METAL2">
+ <wipable/>
+ <extended>true</extended>
+ <fixedAngle>true</fixedAngle>
+ <angleIncrement>90</angleIncrement>
+ <antennaRatio>400.0</antennaRatio>
+ <arcLayer layer="Metal-2" style="FILLED">
+ <lambda>1.5</lambda>
+ </arcLayer>
+ </arcProto>
+
+ <arcProto name="Metal-3" fun="METAL3">
+ <wipable/>
+ <extended>true</extended>
+ <fixedAngle>true</fixedAngle>
+ <angleIncrement>90</angleIncrement>
+ <antennaRatio>400.0</antennaRatio>
+ <arcLayer layer="Metal-3" style="FILLED">
+ <lambda>1.5</lambda>
+ </arcLayer>
+ </arcProto>
+
+ <arcProto name="Polysilicon-1" fun="POLY1">
+ <wipable/>
+ <extended>true</extended>
+ <fixedAngle>true</fixedAngle>
+ <angleIncrement>90</angleIncrement>
+ <antennaRatio>200.0</antennaRatio>
+ <arcLayer layer="Polysilicon-1" style="FILLED">
+ <lambda>1.0</lambda>
+ </arcLayer>
+ </arcProto>
+
+ <arcProto name="P-Active" fun="DIFFP">
+ <wipable/>
+ <extended>true</extended>
+ <fixedAngle>true</fixedAngle>
+ <angleIncrement>90</angleIncrement>
+ <antennaRatio>200.0</antennaRatio>
+ <arcLayer layer="P-Active" style="FILLED">
+ <lambda>1.5</lambda>
+ </arcLayer>
+ <arcLayer layer="P-Select" style="FILLED">
+ <lambda>3.5</lambda>
+ </arcLayer>
+ <arcLayer layer="N-Well" style="FILLED">
+ <lambda>7.5</lambda>
+ </arcLayer>
+ </arcProto>
+
+ <arcProto name="N-Active" fun="DIFFN">
+ <wipable/>
+ <extended>true</extended>
+ <fixedAngle>true</fixedAngle>
+ <angleIncrement>90</angleIncrement>
+ <antennaRatio>200.0</antennaRatio>
+ <arcLayer layer="N-Active" style="FILLED">
+ <lambda>1.5</lambda>
+ </arcLayer>
+ <arcLayer layer="N-Select" style="FILLED">
+ <lambda>3.5</lambda>
+ </arcLayer>
+ <arcLayer layer="P-Well" style="FILLED">
+ <lambda>7.5</lambda>
+ </arcLayer>
+ </arcProto>
+
+ <arcProto name="P-Well" fun="WELL">
+ <wipable/>
+ <extended>true</extended>
+ <fixedAngle>true</fixedAngle>
+ <angleIncrement>90</angleIncrement>
+ <antennaRatio>200.0</antennaRatio>
+ <arcLayer layer="P-Well" style="FILLED">
+ <lambda>1.0</lambda>
+ </arcLayer>
+ </arcProto>
+
+ <arcProto name="N-Well" fun="WELL">
+ <wipable/>
+ <extended>true</extended>
+ <fixedAngle>true</fixedAngle>
+ <angleIncrement>90</angleIncrement>
+ <antennaRatio>200.0</antennaRatio>
+ <arcLayer layer="N-Well" style="FILLED">
+ <lambda>1.0</lambda>
+ </arcLayer>
+ </arcProto>
+
+ <arcProto name="N-Active-CN" fun="DIFFN">
+ <wipable/>
+ <extended>false</extended>
+ <fixedAngle>true</fixedAngle>
+ <angleIncrement>90</angleIncrement>
+ <antennaRatio>200.0</antennaRatio>
+ <arcLayer layer="N-Active-CN" style="FILLED">
+ <lambda>1.5</lambda>
+ </arcLayer>
+ </arcProto>
+
+ <arcProto name="P-Active-CN" fun="DIFFP">
+ <wipable/>
+ <extended>false</extended>
+ <fixedAngle>true</fixedAngle>
+ <angleIncrement>90</angleIncrement>
+ <antennaRatio>200.0</antennaRatio>
+ <arcLayer layer="P-Active-CN" style="FILLED">
+ <lambda>1.5</lambda>
+ </arcLayer>
+ </arcProto>
+
+ <!-- ******************** NODES ******************** -->
+ <primitiveNodeGroup>
+ <primitiveNode name="Metal-1-Pin" fun="PIN"/>
+ <shrinkArcs/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-1.5" khx="1.5" kly="-1.5" khy="1.5"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="Metal-1" style="CROSSED">
+ <box>
+ <lambdaBox klx="-1.5" khx="1.5" kly="-1.5" khy="1.5"/>
+ </box>
+ </nodeLayer>
+ <primitivePort name="metal-1">
+ <portAngle primary="0" range="180"/>
+ <portTopology>0</portTopology>
+ <box>
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </box>
+ <portArc>Metal-1</portArc>
+ </primitivePort>
+ </primitiveNodeGroup>
+
+ <primitiveNodeGroup>
+ <primitiveNode name="Metal-2-Pin" fun="PIN"/>
+ <shrinkArcs/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-1.5" khx="1.5" kly="-1.5" khy="1.5"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="Metal-2" style="CROSSED">
+ <box>
+ <lambdaBox klx="-1.5" khx="1.5" kly="-1.5" khy="1.5"/>
+ </box>
+ </nodeLayer>
+ <primitivePort name="metal-2">
+ <portAngle primary="0" range="180"/>
+ <portTopology>0</portTopology>
+ <box>
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </box>
+ <portArc>Metal-2</portArc>
+ </primitivePort>
+ </primitiveNodeGroup>
+
+ <primitiveNodeGroup>
+ <primitiveNode name="Metal-3-Pin" fun="PIN"/>
+ <shrinkArcs/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-1.5" khx="1.5" kly="-1.5" khy="1.5"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="Metal-3" style="CROSSED">
+ <box>
+ <lambdaBox klx="-1.5" khx="1.5" kly="-1.5" khy="1.5"/>
+ </box>
+ </nodeLayer>
+ <primitivePort name="metal-3">
+ <portAngle primary="0" range="180"/>
+ <portTopology>0</portTopology>
+ <box>
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </box>
+ <portArc>Metal-3</portArc>
+ </primitivePort>
+ </primitiveNodeGroup>
+
+ <primitiveNodeGroup>
+ <primitiveNode name="Polysilicon-1-Pin" fun="PIN"/>
+ <shrinkArcs/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-1.0" khx="1.0" kly="-1.0" khy="1.0"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="Polysilicon-1" style="CROSSED">
+ <box>
+ <lambdaBox klx="-1.0" khx="1.0" kly="-1.0" khy="1.0"/>
+ </box>
+ </nodeLayer>
+ <primitivePort name="polysilicon-1">
+ <portAngle primary="0" range="180"/>
+ <portTopology>0</portTopology>
+ <box>
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </box>
+ <portArc>Polysilicon-1</portArc>
+ </primitivePort>
+ </primitiveNodeGroup>
+
+ <primitiveNodeGroup>
+ <primitiveNode name="P-Active-Pin" fun="PIN"/>
+ <shrinkArcs/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-1.5" khx="1.5" kly="-1.5" khy="1.5"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="P-Active" style="CROSSED">
+ <box>
+ <lambdaBox klx="-1.5" khx="1.5" kly="-1.5" khy="1.5"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="P-Select" style="CROSSED">
+ <box>
+ <lambdaBox klx="-3.5" khx="3.5" kly="-3.5" khy="3.5"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="N-Well" style="CROSSED">
+ <box>
+ <lambdaBox klx="-7.5" khx="7.5" kly="-7.5" khy="7.5"/>
+ </box>
+ </nodeLayer>
+ <primitivePort name="p-active">
+ <portAngle primary="0" range="180"/>
+ <portTopology>0</portTopology>
+ <box>
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </box>
+ <portArc>P-Active</portArc>
+ </primitivePort>
+ </primitiveNodeGroup>
+
+ <primitiveNodeGroup>
+ <primitiveNode name="N-Active-Pin" fun="PIN"/>
+ <shrinkArcs/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-1.5" khx="1.5" kly="-1.5" khy="1.5"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="N-Active" style="CROSSED">
+ <box>
+ <lambdaBox klx="-1.5" khx="1.5" kly="-1.5" khy="1.5"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="N-Select" style="CROSSED">
+ <box>
+ <lambdaBox klx="-3.5" khx="3.5" kly="-3.5" khy="3.5"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="P-Well" style="CROSSED">
+ <box>
+ <lambdaBox klx="-7.5" khx="7.5" kly="-7.5" khy="7.5"/>
+ </box>
+ </nodeLayer>
+ <primitivePort name="n-active">
+ <portAngle primary="0" range="180"/>
+ <portTopology>0</portTopology>
+ <box>
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </box>
+ <portArc>N-Active</portArc>
+ </primitivePort>
+ </primitiveNodeGroup>
+
+ <primitiveNodeGroup>
+ <primitiveNode name="P-Well-Pin" fun="PIN"/>
+ <shrinkArcs/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-1.0" khx="1.0" kly="-1.0" khy="1.0"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="P-Well" style="CROSSED">
+ <box>
+ <lambdaBox klx="-1.0" khx="1.0" kly="-1.0" khy="1.0"/>
+ </box>
+ </nodeLayer>
+ <primitivePort name="p-active">
+ <portAngle primary="0" range="180"/>
+ <portTopology>0</portTopology>
+ <box>
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </box>
+ <portArc>P-Well</portArc>
+ </primitivePort>
+ </primitiveNodeGroup>
+
+ <primitiveNodeGroup>
+ <primitiveNode name="N-Well-Pin" fun="PIN"/>
+ <shrinkArcs/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-1.0" khx="1.0" kly="-1.0" khy="1.0"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="N-Well" style="CROSSED">
+ <box>
+ <lambdaBox klx="-1.0" khx="1.0" kly="-1.0" khy="1.0"/>
+ </box>
+ </nodeLayer>
+ <primitivePort name="n-active">
+ <portAngle primary="0" range="180"/>
+ <portTopology>0</portTopology>
+ <box>
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </box>
+ <portArc>N-Well</portArc>
+ </primitivePort>
+ </primitiveNodeGroup>
+
+ <primitiveNodeGroup>
+ <primitiveNode name="N-Active-CN-pin" fun="PIN"/>
+ <shrinkArcs/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="N-Active" style="CROSSED">
+ <box klx="-0.5" khx="0.5" kly="-0.5" khy="0.5">
+ <lambdaBox klx="-1.0" khx="1.0" kly="-1.0" khy="1.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="N-Active-CN" style="CROSSED">
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeLayer>
+ <primitivePort name="n-active-cn">
+ <portAngle primary="0" range="180"/>
+ <portTopology>0</portTopology>
+ <box>
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </box>
+ <portArc>N-Active-CN</portArc>
+ </primitivePort>
+ </primitiveNodeGroup>
+
+ <primitiveNodeGroup>
+ <primitiveNode name="P-Active-CN-pin" fun="PIN"/>
+ <shrinkArcs/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="P-Active" style="CROSSED">
+ <box klx="-0.5" khx="0.5" kly="-0.5" khy="0.5">
+ <lambdaBox klx="-1.0" khx="1.0" kly="-1.0" khy="1.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="P-Active-CN" style="CROSSED">
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeLayer>
+ <primitivePort name="p-active-cn">
+ <portAngle primary="0" range="180"/>
+ <portTopology>0</portTopology>
+ <box>
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </box>
+ <portArc>P-Active-CN</portArc>
+ </primitivePort>
+ </primitiveNodeGroup>
+
+ <primitiveNodeGroup>
+ <primitiveNode name="Metal-1-P-Active-Con" fun="CONTACT"/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="Metal-1" style="FILLED">
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="P-Active" style="FILLED">
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="P-Select" style="FILLED">
+ <box>
+ <lambdaBox klx="-4.0" khx="4.0" kly="-4.0" khy="4.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="N-Well" style="FILLED">
+ <box>
+ <lambdaBox klx="-8.0" khx="8.0" kly="-8.0" khy="8.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="Active-Cut" style="FILLED">
+ <multicutbox sizex="2.0" sizey="2.0" sep1d="3.0" sep2d="3.0">
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </multicutbox>
+ </nodeLayer>
+ <primitivePort name="metal-1-p-act">
+ <portAngle primary="0" range="180"/>
+ <portTopology>0</portTopology>
+ <box>
+ <lambdaBox klx="-0.5" khx="0.5" kly="-0.5" khy="0.5"/>
+ </box>
+ <portArc>P-Active</portArc>
+ <portArc>Metal-1</portArc>
+ </primitivePort>
+ </primitiveNodeGroup>
+
+ <primitiveNodeGroup>
+ <primitiveNode name="Metal-1-N-Active-Con" fun="CONTACT"/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="Metal-1" style="FILLED">
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="N-Active" style="FILLED">
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="N-Select" style="FILLED">
+ <box>
+ <lambdaBox klx="-4.0" khx="4.0" kly="-4.0" khy="4.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="P-Well" style="FILLED">
+ <box>
+ <lambdaBox klx="-8.0" khx="8.0" kly="-8.0" khy="8.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="Active-Cut" style="FILLED">
+ <multicutbox sizex="2.0" sizey="2.0" sep1d="3.0" sep2d="3.0">
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </multicutbox>
+ </nodeLayer>
+ <primitivePort name="metal-1-n-act">
+ <portAngle primary="0" range="180"/>
+ <portTopology>0</portTopology>
+ <box>
+ <lambdaBox klx="-0.5" khx="0.5" kly="-0.5" khy="0.5"/>
+ </box>
+ <portArc>N-Active</portArc>
+ <portArc>Metal-1</portArc>
+ </primitivePort>
+ </primitiveNodeGroup>
+
+ <primitiveNodeGroup>
+ <primitiveNode name="Metal-1-Polysilicon-1-Con" fun="CONTACT"/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="Metal-1" style="FILLED">
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="Polysilicon-1" style="FILLED">
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="Poly-Cut" style="FILLED">
+ <multicutbox sizex="2.0" sizey="2.0" sep1d="3.0" sep2d="3.0">
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </multicutbox>
+ </nodeLayer>
+ <primitivePort name="metal-1-polysilicon-1">
+ <portAngle primary="0" range="180"/>
+ <portTopology>0</portTopology>
+ <box>
+ <lambdaBox klx="-0.5" khx="0.5" kly="-0.5" khy="0.5"/>
+ </box>
+ <portArc>Metal-1</portArc>
+ <portArc>Polysilicon-1</portArc>
+ </primitivePort>
+ </primitiveNodeGroup>
+
+ <primitiveNodeGroup>
+ <primitiveNode name="Metal-1-Metal-2-Con" fun="CONTACT"/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="Metal-1" style="FILLED">
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="Metal-2" style="FILLED">
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="Via1" style="FILLED">
+ <multicutbox sizex="2.0" sizey="2.0" sep1d="3.0" sep2d="3.0">
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </multicutbox>
+ </nodeLayer>
+ <primitivePort name="metal-1-metal-2">
+ <portAngle primary="0" range="180"/>
+ <portTopology>0</portTopology>
+ <box>
+ <lambdaBox klx="-1.0" khx="1.0" kly="-1.0" khy="1.0"/>
+ </box>
+ <portArc>Metal-1</portArc>
+ <portArc>Metal-2</portArc>
+ </primitivePort>
+ </primitiveNodeGroup>
+
+ <primitiveNodeGroup>
+ <primitiveNode name="Metal-2-Metal-3-Con" fun="CONTACT"/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="Metal-2" style="FILLED">
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="Metal-3" style="FILLED">
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="Via2" style="FILLED">
+ <multicutbox sizex="2.0" sizey="2.0" sep1d="3.0" sep2d="3.0">
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </multicutbox>
+ </nodeLayer>
+ <primitivePort name="metal-2-metal-3">
+ <portAngle primary="0" range="180"/>
+ <portTopology>0</portTopology>
+ <box>
+ <lambdaBox klx="-0.5" khx="0.5" kly="-0.5" khy="0.5"/>
+ </box>
+ <portArc>Metal-2</portArc>
+ <portArc>Metal-3</portArc>
+ </primitivePort>
+ </primitiveNodeGroup>
+
+ <primitiveNodeGroup>
+ <primitiveNode name="Metal-1-P-Well-Con" fun="SUBSTRATE"/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="Metal-1" style="FILLED">
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="P-Select" style="FILLED">
+ <box>
+ <lambdaBox klx="-4.0" khx="4.0" kly="-4.0" khy="4.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="P-Well" style="FILLED">
+ <box>
+ <lambdaBox klx="-5.0" khx="5.0" kly="-5.0" khy="5.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="Active-Cut" style="FILLED">
+ <multicutbox sizex="2.0" sizey="2.0" sep1d="3.0" sep2d="3.0">
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </multicutbox>
+ </nodeLayer>
+ <nodeLayer layer="P-Active-Well" style="FILLED">
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeLayer>
+ <primitivePort name="metal-1-well">
+ <portAngle primary="0" range="180"/>
+ <portTopology>0</portTopology>
+ <box>
+ <lambdaBox klx="-0.5" khx="0.5" kly="-0.5" khy="0.5"/>
+ </box>
+ <portArc>Metal-1</portArc>
+ <portArc>P-Well</portArc>
+ </primitivePort>
+ </primitiveNodeGroup>
+
+ <primitiveNodeGroup>
+ <primitiveNode name="Metal-1-N-Well-Con" fun="WELL"/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="Metal-1" style="FILLED">
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="N-Active" style="FILLED">
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="N-Select" style="FILLED">
+ <box>
+ <lambdaBox klx="-4.0" khx="4.0" kly="-4.0" khy="4.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="N-Well" style="FILLED">
+ <box>
+ <lambdaBox klx="-5.0" khx="5.0" kly="-5.0" khy="5.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="Active-Cut" style="FILLED">
+ <multicutbox sizex="2.0" sizey="2.0" sep1d="3.0" sep2d="3.0">
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </multicutbox>
+ </nodeLayer>
+ <primitivePort name="metal-1-substrate">
+ <portAngle primary="0" range="180"/>
+ <portTopology>0</portTopology>
+ <box>
+ <lambdaBox klx="-0.5" khx="0.5" kly="-0.5" khy="0.5"/>
+ </box>
+ <portArc>Metal-1</portArc>
+ <portArc>N-Well</portArc>
+ </primitivePort>
+ </primitiveNodeGroup>
+
+ <primitiveNodeGroup>
+ <primitiveNode name="Metal-1-N-Active-CN-Con" fun="CONTACT"/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="Metal-1" style="FILLED">
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="Active-Cut" style="FILLED">
+ <multicutbox sizex="2.0" sizey="2.0" sep1d="3.0" sep2d="3.0">
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </multicutbox>
+ </nodeLayer>
+ <nodeLayer layer="N-Active-CN" style="FILLED">
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeLayer>
+ <primitivePort name="metal-1-n-act-cn">
+ <portAngle primary="0" range="180"/>
+ <portTopology>0</portTopology>
+ <box>
+ <lambdaBox klx="-0.5" khx="0.5" kly="-0.5" khy="0.5"/>
+ </box>
+ <portArc>Metal-1</portArc>
+ <portArc>N-Active-CN</portArc>
+ </primitivePort>
+ </primitiveNodeGroup>
+
+ <primitiveNodeGroup>
+ <primitiveNode name="NCN-Transistor" fun="TRANMOSCN"/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-3.0" khy="3.0"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="Transistor-Poly" style="FILLED">
+ <box>
+ <lambdaBox klx="-3.0" khx="3.0" kly="-1.0" khy="1.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="N-Active-CN" style="FILLED">
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-3.0" khy="3.0"/>
+ </box>
+ </nodeLayer>
+ <primitivePort name="poly-left">
+ <portAngle primary="180" range="90"/>
+ <portTopology>0</portTopology>
+ <box khx="-1.0" kly="0.0" khy="0.0">
+ <lambdaBox klx="-3.0" khx="-3.0" kly="0.0" khy="0.0"/>
+ </box>
+ <portArc>Polysilicon-1</portArc>
+ </primitivePort>
+ <primitivePort name="tube-top">
+ <portAngle primary="90" range="90"/>
+ <portTopology>1</portTopology>
+ <box klx="0.0" khx="0.0" kly="1.0">
+ <lambdaBox klx="0.0" khx="0.0" kly="2.5" khy="2.5"/>
+ </box>
+ <portArc>N-Active-CN</portArc>
+ </primitivePort>
+ <primitivePort name="poly-right">
+ <portAngle primary="0" range="90"/>
+ <portTopology>0</portTopology>
+ <box klx="1.0" kly="0.0" khy="0.0">
+ <lambdaBox klx="3.0" khx="3.0" kly="0.0" khy="0.0"/>
+ </box>
+ <portArc>Polysilicon-1</portArc>
+ </primitivePort>
+ <primitivePort name="tube-bottom">
+ <portAngle primary="270" range="90"/>
+ <portTopology>3</portTopology>
+ <box klx="0.0" khx="0.0" khy="-1.0">
+ <lambdaBox klx="0.0" khx="0.0" kly="-2.5" khy="-2.5"/>
+ </box>
+ <portArc>N-Active-CN</portArc>
+ </primitivePort>
+ </primitiveNodeGroup>
+
+ <primitiveNodeGroup>
+ <primitiveNode name="PCN-Transistor" fun="TRAPMOSCN"/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-3.0" khy="3.0"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="Transistor-Poly" style="FILLED">
+ <box>
+ <lambdaBox klx="-3.0" khx="3.0" kly="-1.0" khy="1.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="P-Active-CN" style="FILLED">
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-3.0" khy="3.0"/>
+ </box>
+ </nodeLayer>
+ <primitivePort name="poly-left">
+ <portAngle primary="180" range="90"/>
+ <portTopology>0</portTopology>
+ <box khx="-1.0" kly="0.0" khy="0.0">
+ <lambdaBox klx="-3.0" khx="-3.0" kly="0.0" khy="0.0"/>
+ </box>
+ <portArc>Polysilicon-1</portArc>
+ </primitivePort>
+ <primitivePort name="tube-top">
+ <portAngle primary="90" range="90"/>
+ <portTopology>1</portTopology>
+ <box klx="0.0" khx="0.0" kly="1.0">
+ <lambdaBox klx="0.0" khx="0.0" kly="2.5" khy="2.5"/>
+ </box>
+ <portArc>P-Active-CN</portArc>
+ </primitivePort>
+ <primitivePort name="poly-right">
+ <portAngle primary="0" range="90"/>
+ <portTopology>0</portTopology>
+ <box klx="1.0" kly="0.0" khy="0.0">
+ <lambdaBox klx="3.0" khx="3.0" kly="0.0" khy="0.0"/>
+ </box>
+ <portArc>Polysilicon-1</portArc>
+ </primitivePort>
+ <primitivePort name="tube-bottom">
+ <portAngle primary="270" range="90"/>
+ <portTopology>3</portTopology>
+ <box klx="0.0" khx="0.0" khy="-1.0">
+ <lambdaBox klx="0.0" khx="0.0" kly="-2.5" khy="-2.5"/>
+ </box>
+ <portArc>P-Active-CN</portArc>
+ </primitivePort>
+ </primitiveNodeGroup>
+
+ <primitiveNodeGroup>
+ <primitiveNode name="Metal-1-P-Active-CN-Con" fun="CONTACT"/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="Metal-1" style="FILLED">
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="Active-Cut" style="FILLED">
+ <multicutbox sizex="2.0" sizey="2.0" sep1d="3.0" sep2d="3.0">
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </multicutbox>
+ </nodeLayer>
+ <nodeLayer layer="P-Active-CN" style="FILLED">
+ <box>
+ <lambdaBox klx="-2.0" khx="2.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeLayer>
+ <primitivePort name="metal-1-p-act-cn">
+ <portAngle primary="0" range="180"/>
+ <portTopology>0</portTopology>
+ <box>
+ <lambdaBox klx="-0.5" khx="0.5" kly="-0.5" khy="0.5"/>
+ </box>
+ <portArc>Metal-1</portArc>
+ <portArc>P-Active-CN</portArc>
+ </primitivePort>
+ </primitiveNodeGroup>
+
+ <menuPalette numColumns="3">
+
+ <menuBox/>
+ <menuBox/>
+ <menuBox>
+ <menuNode>Metal-1-N-Active-CN-Con</menuNode>
+ </menuBox>
+
+ <menuBox>
+ <menuNode>Metal-1-N-Well-Con</menuNode>
+ </menuBox>
+ <menuBox>
+ <menuNode>P-Active-CN-pin</menuNode>
+ </menuBox>
+ <menuBox>
+ <menuNode>Metal-1-P-Active-CN-Con</menuNode>
+ </menuBox>
+
+ <menuBox>
+ <menuNode>Metal-1-P-Well-Con</menuNode>
+ </menuBox>
+ <menuBox>
+ <menuNode>N-Active-CN-pin</menuNode>
+ </menuBox>
+ <menuBox>
+ <menuNode>PCN-Transistor</menuNode>
+ </menuBox>
+
+ <menuBox>
+ <menuArc>Polysilicon-1</menuArc>
+ </menuBox>
+ <menuBox>
+ <menuNode>Polysilicon-1-Pin</menuNode>
+ </menuBox>
+ <menuBox>
+ <menuNode>NCN-Transistor</menuNode>
+ </menuBox>
+
+ <menuBox>
+ <menuArc>Metal-1</menuArc>
+ </menuBox>
+ <menuBox>
+ <menuNode>Metal-1-Pin</menuNode>
+ </menuBox>
+ <menuBox>
+ <menuNode>Metal-1-Polysilicon-1-Con</menuNode>
+ </menuBox>
+
+ <menuBox>
+ <menuArc>Metal-2</menuArc>
+ </menuBox>
+ <menuBox>
+ <menuNode>Metal-2-Pin</menuNode>
+ </menuBox>
+ <menuBox>
+ <menuNode>Metal-1-Metal-2-Con</menuNode>
+ </menuBox>
+
+ <menuBox>
+ <menuArc>Metal-3</menuArc>
+ </menuBox>
+ <menuBox>
+ <menuNode>Metal-3-Pin</menuNode>
+ </menuBox>
+ <menuBox>
+ <menuNode>Metal-2-Metal-3-Con</menuNode>
+ </menuBox>
+
+ <menuBox>
+ <menuText>Pure</menuText>
+ </menuBox>
+ <menuBox>
+ <menuText>Misc.</menuText>
+ </menuBox>
+ <menuBox>
+ <menuText>Cell</menuText>
+ </menuBox>
+
+ </menuPalette>
+
+ <Foundry name="MOSIS">
+
+ <layerGds layer="Metal-1" gds="49,80p,80t"/>
+ <layerGds layer="Metal-2" gds="51,82p,82t"/>
+ <layerGds layer="Metal-3" gds="62,93p,93t"/>
+ <layerGds layer="Polysilicon-1" gds="46,77p,77t"/>
+ <layerGds layer="P-Active" gds="43"/>
+ <layerGds layer="N-Active" gds="43"/>
+ <layerGds layer="P-Select" gds="44"/>
+ <layerGds layer="N-Select" gds="45"/>
+ <layerGds layer="P-Well" gds="41"/>
+ <layerGds layer="N-Well" gds="42"/>
+ <layerGds layer="Poly-Cut" gds="25"/>
+ <layerGds layer="Active-Cut" gds="25"/>
+ <layerGds layer="Via1" gds="50"/>
+ <layerGds layer="Via2" gds="61"/>
+ <layerGds layer="Via3" gds="30"/>
+ <layerGds layer="Transistor-Poly" gds="46"/>
+ <layerGds layer="Poly-Cap" gds="28"/>
+ <layerGds layer="P-Active-Well" gds="43"/>
+ <layerGds layer="Thick-Active" gds="60"/>
+ <layerGds layer="P-Base" gds="58"/>
+ <layerGds layer="N-Active-CN" gds="43"/>
+ <layerGds layer="P-Active-CN" gds="43"/>
+
+ <LayerRule ruleName="1.1 Mosis-cn" layerName="P-Well" type="MINWID" when="DE|SU" value="12.0" />
+ <LayerRule ruleName="1.1 Mosis-cn" layerName="N-Well" type="MINWID" when="DE|SU" value="12.0" />
+ <LayerRule ruleName="1.1 Mosis-cn" layerName="P-Well" type="MINWID" when="SC" value="10.0" />
+ <LayerRule ruleName="1.1 Mosis-cn" layerName="N-Well" type="MINWID" when="SC" value="10.0" />
+ <LayersRule ruleName="1.2 Mosis-cn" layerNames="{P-Well,P-Well}" type="UCONSPA" when="DE|SU" value="18.0" />
+ <LayersRule ruleName="1.2 Mosis-cn" layerNames="{N-Well,N-Well}" type="UCONSPA" when="DE|SU" value="18.0" />
+ <LayersRule ruleName="1.2 Mosis-cn" layerNames="{P-Well,P-Well}" type="UCONSPA" when="SC" value="9.0" />
+ <LayersRule ruleName="1.2 Mosis-cn" layerNames="{N-Well,N-Well}" type="UCONSPA" when="SC" value="9.0" />
+ <LayersRule ruleName="1.3 Mosis-cn" layerNames="{P-Well,P-Well}" type="CONSPA" when="ALL" value="6.0" />
+ <LayersRule ruleName="1.3 Mosis-cn" layerNames="{N-Well,N-Well}" type="CONSPA" when="ALL" value="6.0" />
+ <LayersRule ruleName="1.4 Mosis-cn" layerNames="{P-Well,N-Well}" type="SPACING" when="ALL" value="0.0" />
+ <LayerRule ruleName="2.1 Mosis-cn" layerName="P-Active" type="MINWID" when="ALL" value="3.0" />
+ <LayerRule ruleName="2.1 Mosis-cn" layerName="N-Active" type="MINWID" when="ALL" value="3.0" />
+ <LayerRule ruleName="2.1 Mosis-cn" layerName="P-Active-CN" type="MINWID" when="ALL" value="0" />
+ <LayerRule ruleName="2.1 Mosis-cn" layerName="N-Active-CN" type="MINWID" when="ALL" value="0" />
+ <LayersRule ruleName="2.2a Mosis-cn" layerNames="{P-Active,P-Active}" type="SPACING" when="ALL" value="3.0" />
+ <LayersRule ruleName="2.2b Mosis-cn" layerNames="{N-Active,N-Active}" type="SPACING" when="ALL" value="3.0" />
+ <LayersRule ruleName="2.2c Mosis-cn" layerNames="{P-Active-Well,P-Active-Well}" type="SPACING" when="ALL" value="3.0" />
+ <LayersRule ruleName="2.2d Mosis-cn" layerNames="{P-Active,P-Active-Well}" type="SPACING" when="ALL" value="3.0" />
+ <LayersRule ruleName="2.2e Mosis-cn" layerNames="{N-Active,P-Active-Well}" type="SPACING" when="ALL" value="3.0" />
+ <LayersRule ruleName="2.2f Mosis-cn" layerNames="{P-Active-CN,P-Active-Well}" type="SPACING" when="ALL" value="3.0" />
+ <LayersRule ruleName="2.2g Mosis-cn" layerNames="{N-Active-CN,P-Active-Well}" type="SPACING" when="ALL" value="3.0" />
+ <LayersRule ruleName="2.2h Mosis-cn" layerNames="{N-Active-CN,N-Active-Well}" type="SPACING" when="ALL" value="3.0" />
+ <LayersRule ruleName="2.2i Mosis-cn" layerNames="{P-Active-CN,N-Active-Well}" type="SPACING" when="ALL" value="3.0" />
+ <NodeLayersRule ruleName="2.3 Mosis-cn" layerNames="{N-Well,P-Active}" type="SURROUND" when="DE|SU" value="6.0" nodeName="Metal-1-P-Active-Con" />
+ <NodeLayersRule ruleName="2.3 Mosis-cn" layerNames="{N-Well,P-Active}" type="SURROUND" when="DE|SU" value="6.0" nodeName="PCN-Transistor" />
+ <NodeLayersRule ruleName="2.3 Mosis-cn" layerNames="{N-Well,P-Active}" type="ASURROUND" when="DE|SU" value="6.0" nodeName="P-Active" />
+ <NodeLayersRule ruleName="2.3 Mosis-cn" layerNames="{P-Well,N-Active}" type="SURROUND" when="DE|SU" value="6.0" nodeName="Metal-1-N-Active-Con" />
+ <NodeLayersRule ruleName="2.3 Mosis-cn" layerNames="{N-Well,P-Active-CN}" type="SURROUND" when="DE|SU" value="6.0" nodeName="PCN-Transistor" />
+ <NodeLayersRule ruleName="2.3 Mosis-cn" layerNames="{N-Well,P-Active-CN}" type="ASURROUND" when="DE|SU" value="6.0" nodeName="P-Active-CN" />
+ <NodeLayersRule ruleName="2.3 Mosis-cn" layerNames="{P-Well,N-Active}" type="SURROUND" when="DE|SU" value="6.0" nodeName="NCN-Transistor" />
+ <NodeLayersRule ruleName="2.3 Mosis-cn" layerNames="{P-Well,N-Active}" type="ASURROUND" when="DE|SU" value="6.0" nodeName="N-Active" />
+ <NodeLayersRule ruleName="2.3 Mosis-cn" layerNames="{N-Well,P-Active}" type="SURROUND" when="SC" value="5.0" nodeName="PCN-Transistor" />
+ <NodeLayersRule ruleName="2.3 Mosis-cn" layerNames="{P-Well,N-Active}" type="SURROUND" when="SC" value="5.0" nodeName="NCN-Transistor" />
+ <NodeLayersRule ruleName="2.3 Mosis-cn" layerNames="{N-Well,P-Active}" type="ASURROUND" when="SC" value="5.0" nodeName="P-Active" />
+ <NodeLayersRule ruleName="2.3 Mosis-cn" layerNames="{P-Well,N-Active}" type="ASURROUND" when="SC" value="5.0" nodeName="N-Active" />
+ <NodeLayersRule ruleName="2.3 Mosis-cn" layerNames="{P-Well,N-Active-CN}" type="SURROUND" when="DE|SU" value="6.0" nodeName="NCN-Transistor" />
+ <NodeLayersRule ruleName="2.3 Mosis-cn" layerNames="{P-Well,N-Active-CN}" type="ASURROUND" when="DE|SU" value="6.0" nodeName="N-Active-CN" />
+ <NodeLayersRule ruleName="2.3 Mosis-cn" layerNames="{N-Well,P-Active-CN}" type="SURROUND" when="SC" value="5.0" nodeName="PCN-Transistor" />
+ <NodeLayersRule ruleName="2.3 Mosis-cn" layerNames="{P-Well,N-Active-CN}" type="SURROUND" when="SC" value="5.0" nodeName="NCN-Transistor" />
+ <NodeLayersRule ruleName="2.3 Mosis-cn" layerNames="{N-Well,P-Active-CN}" type="ASURROUND" when="SC" value="5.0" nodeName="P-Active-CN" />
+ <NodeLayersRule ruleName="2.3 Mosis-cn" layerNames="{P-Well,N-Active-CN}" type="ASURROUND" when="SC" value="5.0" nodeName="N-Active-CN" />
+ <NodeLayersRule ruleName="2.4 Mosis-cn" layerNames="{P-Well,P-Active-Well}" type="SURROUND" when="ALL" value="3.0" nodeName="Metal-1-P-Well-Con" />
+ <NodeLayersRule ruleName="2.4 Mosis-cn" layerNames="{N-Well,N-Active}" type="SURROUND" when="ALL" value="3.0" nodeName="Metal-1-N-Well-Con" />
+ <LayersRule ruleName="2.5 Mosis-cn" layerNames="{P-Active,N-Active}" type="SPACING" when="ALL" value="4.0" />
+ <LayersRule ruleName="2.5 Mosis-cn" layerNames="{P-Active-CN,N-Active-CN}" type="SPACING" when="ALL" value="4" />
+ <LayerRule ruleName="3.1 Mosis-cn" layerName="Polysilicon-1" type="MINWID" when="ALL" value="2.0" />
+ <LayerRule ruleName="3.1 Mosis-cn" layerName="Transistor-Poly" type="MINWID" when="ALL" value="2.0" />
+ <LayersRule ruleName="3.2 Mosis-cn" layerNames="{Polysilicon-1,Polysilicon-1}" type="SPACING" when="DE|SU" value="3.0" />
+ <LayersRule ruleName="3.2 Mosis-cn" layerNames="{Polysilicon-1,Transistor-Poly}" type="SPACING" when="DE|SU" value="3.0" />
+ <LayersRule ruleName="3.2 Mosis-cn" layerNames="{Polysilicon-1,Polysilicon-1}" type="SPACING" when="SC" value="2.0" />
+ <LayersRule ruleName="3.2 Mosis-cn" layerNames="{Polysilicon-1,Transistor-Poly}" type="SPACING" when="SC" value="2.0" />
+ <LayersRule ruleName="3.2a Mosis-cn" layerNames="{Transistor-Poly,Transistor-Poly}" type="SPACING" when="DE" value="4.0" />
+ <LayersRule ruleName="3.2a Mosis-cn" layerNames="{Transistor-Poly,Transistor-Poly}" type="SPACING" when="SU" value="3.0" />
+ <LayersRule ruleName="3.2a Mosis-cn" layerNames="{Transistor-Poly,Transistor-Poly}" type="SPACING" when="SC" value="2.0" />
+ <LayersRule ruleName="3.3 Mosis-cn" layerNames="{Transistor-Poly,P-Active}" type="EXTENSION" when="DE" value="2.5" />
+ <LayersRule ruleName="3.3 Mosis-cn" layerNames="{Transistor-Poly,N-Active}" type="EXTENSION" when="DE" value="2.5" />
+ <LayersRule ruleName="3.3 Mosis-cn" layerNames="{Transistor-Poly,P-Active}" type="EXTENSION" when="SU|SC" value="2.0" />
+ <LayersRule ruleName="3.3 Mosis-cn" layerNames="{Transistor-Poly,N-Active}" type="EXTENSION" when="SU|SC" value="2.0" />
+ <LayersRule ruleName="Active from Poly Mosis-cn" layerNames="{P-Active,Transistor-Poly}" type="EXTENSION" when="DE" value="4.0" />
+ <LayersRule ruleName="Active from Poly Mosis-cn" layerNames="{N-Active,Transistor-Poly}" type="EXTENSION" when="DE" value="4.0" />
+ <LayersRule ruleName="Active from Poly Mosis-cn" layerNames="{P-Active,Transistor-Poly}" type="EXTENSION" when="SU|SC" value="3.0" />
+ <LayersRule ruleName="Active from Poly Mosis-cn" layerNames="{N-Active,Transistor-Poly}" type="EXTENSION" when="SU|SC" value="3.0" />
+ <NodeLayersRule ruleName="Trans SelPoly Surround Mosis-cn" layerNames="{P-Select,Transistor-Poly}" type="SURROUND" when="ALL" value="2.0" nodeName="PCN-Transistor" />
+ <NodeLayersRule ruleName="Trans SelPoly Surround Mosis-cn" layerNames="{N-Select,Transistor-Poly}" type="SURROUND" when="ALL" value="2.0" nodeName="NCN-Transistor" />
+ <LayersRule ruleName="3.5 Mosis-cn" layerNames="{Polysilicon-1,P-Active}" type="SPACING" when="ALL" value="1.0" />
+ <LayersRule ruleName="3.5 Mosis-cn" layerNames="{Transistor-Poly,P-Active}" type="SPACING" when="ALL" value="1.0" />
+ <LayersRule ruleName="3.5 Mosis-cn" layerNames="{Polysilicon-1,N-Active}" type="SPACING" when="ALL" value="1.0" />
+ <LayersRule ruleName="3.5 Mosis-cn" layerNames="{Transistor-Poly,N-Active}" type="SPACING" when="ALL" value="1.0" />
+ <LayersRule ruleName="3.5 Mosis-cn" layerNames="{Polysilicon-1,P-Active-Well}" type="SPACING" when="ALL" value="1.0" />
+ <LayersRule ruleName="3.5 Mosis-cn" layerNames="{Transistor-Poly,P-Active-Well}" type="SPACING" when="ALL" value="1.0" />
+ <NodeLayersRule ruleName="4.2 Mosis-cn" layerNames="{P-Select,P-Active}" type="SURROUND" when="ALL" value="2.0" nodeName="PCN-Transistor" />
+ <NodeLayersRule ruleName="4.2 Mosis-cn" layerNames="{N-Select,N-Active}" type="SURROUND" when="ALL" value="2.0" nodeName="NCN-Transistor" />
+ <LayerRule ruleName="4.4 Mosis-cn" layerName="P-Select" type="MINWID" when="DE" value="4.0" />
+ <LayerRule ruleName="4.4 Mosis-cn" layerName="N-Select" type="MINWID" when="DE" value="4.0" />
+ <LayersRule ruleName="4.4 Mosis-cn" layerNames="{P-Select,P-Select}" type="SPACING" when="DE" value="4.0" />
+ <LayersRule ruleName="4.4 Mosis-cn" layerNames="{N-Select,N-Select}" type="SPACING" when="DE" value="4.0" />
+ <LayerRule ruleName="4.4 Mosis-cn" layerName="P-Select" type="MINWID" when="SU|SC" value="2.0" />
+ <LayerRule ruleName="4.4 Mosis-cn" layerName="N-Select" type="MINWID" when="SU|SC" value="2.0" />
+ <LayersRule ruleName="4.4 Mosis-cn" layerNames="{P-Select,P-Select}" type="SPACING" when="SU|SC" value="2.0" />
+ <LayersRule ruleName="4.4 Mosis-cn" layerNames="{N-Select,N-Select}" type="SPACING" when="SU|SC" value="2.0" />
+ <LayersRule ruleName="4.4 Mosis-cn" layerNames="{P-Select,N-Select}" type="SPACING" when="ALL" value="0.0" />
+ <LayerRule ruleName="5.1 Mosis-cn" layerName="Poly-Cut" type="MINWID" when="ALL" value="2.0" />
+ <NodeRule ruleName="5.2 Mosis-cn" type="NODSIZ" when="NAC" value="5.0" nodeName="Metal-1-Polysilicon-1-Con" />
+ <LayersRule ruleName="5.2 Mosis-cn" layerNames="{Polysilicon-1,Poly-Cut}" type="SURROUND" when="NAC" value="1.5" />
+ <NodeRule ruleName="5.2b Mosis-cn" type="NODSIZ" when="AC" value="4.0" nodeName="Metal-1-Polysilicon-1-Con" />
+ <LayersRule ruleName="5.2b Mosis-cn" layerNames="{Polysilicon-1,Poly-Cut}" type="SURROUND" when="AC" value="1.0" />
+ <LayersRule ruleName="5.2b Mosis-cn" layerNames="{Metal-1,Poly-Cut}" type="SURROUND" when="ALL" value="1.0" />
+ <LayersRule ruleName="5.3 Mosis-cn" layerNames="{Poly-Cut,Poly-Cut}" type="SPACING" when="DE" value="4.0" />
+ <LayersRule ruleName="5.3,6.3 Mosis-cn" layerNames="{Active-Cut,Poly-Cut}" type="SPACING" when="NAC|DE" value="4.0" />
+ <LayersRule ruleName="5.3 Mosis-cn" layerNames="{Poly-Cut,Poly-Cut}" type="SPACING" when="SC" value="2.0" />
+ <LayersRule ruleName="5.3,6.3 Mosis-cn" layerNames="{Active-Cut,Poly-Cut}" type="SPACING" when="NAC|SC" value="2.0" />
+ <LayersRule ruleName="5.3 Mosis-cn" layerNames="{Poly-Cut,Poly-Cut}" type="SPACING" when="SU" value="3.0" />
+ <LayersRule ruleName="5.3,6.3 Mosis-cn" layerNames="{Active-Cut,Poly-Cut}" type="SPACING" when="NAC|SU" value="3.0" />
+ <LayersRule ruleName="5.4 Mosis-cn" layerNames="{Poly-Cut,Transistor-Poly}" type="SPACING" when="ALL" value="2.0" />
+ <LayersRule ruleName="5.5b Mosis-cn" layerNames="{Poly-Cut,Polysilicon-1}" type="UCONSPA" when="AC|DE|SU" value="5.0" />
+ <LayersRule ruleName="5.5b Mosis-cn" layerNames="{Poly-Cut,Transistor-Poly}" type="UCONSPA" when="AC|DE|SU" value="5.0" />
+ <LayersRule ruleName="5.5b Mosis-cn" layerNames="{Poly-Cut,Polysilicon-1}" type="UCONSPA" when="AC|SC" value="4.0" />
+ <LayersRule ruleName="5.5b Mosis-cn" layerNames="{Poly-Cut,Transistor-Poly}" type="UCONSPA" when="AC|SC" value="4.0" />
+ <LayersRule ruleName="5.6b Mosis-cn" layerNames="{Poly-Cut,P-Active}" type="SPACING" when="AC" value="2.0" />
+ <LayersRule ruleName="5.6b Mosis-cn" layerNames="{Poly-Cut,N-Active}" type="SPACING" when="AC" value="2.0" />
+ <LayersRule ruleName="5.7b Mosis-cn" layerNames="{Poly-Cut,P-Active}" type="UCONSPA2D" when="AC" value="3.0" />
+ <LayersRule ruleName="5.7b Mosis-cn" layerNames="{Poly-Cut,N-Active}" type="UCONSPA2D" when="AC" value="3.0" />
+ <LayerRule ruleName="6.1 Mosis-cn" layerName="Active-Cut" type="MINWID" when="ALL" value="2.0" />
+ <NodeRule ruleName="6.2 Mosis-cn" type="NODSIZ" when="NAC" value="5.0" nodeName="Metal-1-P-Active-Con" />
+ <NodeRule ruleName="6.2 Mosis-cn" type="NODSIZ" when="NAC" value="5.0" nodeName="Metal-1-N-Active-Con" />
+ <NodeRule ruleName="6.2 Mosis-cn" type="NODSIZ" when="NAC" value="5.0" nodeName="Metal-1-P-Well-Con" />
+ <NodeRule ruleName="6.2 Mosis-cn" type="NODSIZ" when="NAC" value="5.0" nodeName="Metal-1-N-Well-Con" />
+ <LayerRule ruleName="7.1 Mosis-cn" layerName="Metal-1" type="MINWID" when="ALL" value="3.0" />
+ <LayersRule ruleName="7.2 Mosis" layerNames="{Metal-1,Metal-1}" type="SPACING" when="DE|SU" value="2.0" />
+ <LayersRule ruleName="7.2 Mosis" layerNames="{Metal-1,Metal-1}" type="SPACING" when="SC" value="3.0" />
+ <LayersRule ruleName="7.4 Mosis-cn" layerNames="{Metal-1,Metal-1}" type="SPACING" when="DE|SU" value="6.0" maxW="100.0" minLen="0.0" />
+ <LayersRule ruleName="7.4 Mosis-cn" layerNames="{Metal-1,Metal-1}" type="SPACING" when="SC" value="4.0" maxW="100.0" minLen="0.0" />
+ <LayerRule ruleName="8.1 Mosis-cn" layerName="Via1" type="MINWID" when="DE" value="3.0" />
+ <NodeRule ruleName="8.1 Mosis-cn" type="NODSIZ" when="DE" value="5.0" nodeName="Metal-1-Metal-2-Con" />
+ <LayerRule ruleName="8.1 Mosis-cn" layerName="Via1" type="MINWID" when="SU|SC" value="2.0" />
+ <NodeRule ruleName="8.1 Mosis-cn" type="NODSIZ" when="SU|SC" value="4.0" nodeName="Metal-1-Metal-2-Con" />
+ <LayersRule ruleName="8.2 Mosis-cn" layerNames="{Via1,Via1}" type="SPACING" when="ALL" value="3.0" />
+ <LayersRule ruleName="8.3 Mosis-cn" layerNames="{Via1,Metal-1}" type="SURROUND" when="ALL" value="1.0" />
+ <LayersRule ruleName="8.4 Mosis-cn" layerNames="{Active-Cut,Via1}" type="SPACING" when="NSV" value="2.0" />
+ <LayersRule ruleName="8.5 Mosis-cn" layerNames="{Via1,Polysilicon-1}" type="SPACINGE" when="NSV" value="2.0" />
+ <LayersRule ruleName="8.5 Mosis-cn" layerNames="{Via1,Transistor-Poly}" type="SPACINGE" when="NSV" value="2.0" />
+ <LayerRule ruleName="9.1 Mosis-cn" layerName="Metal-2" type="MINWID" when="ALL" value="3.0" />
+ <LayersRule ruleName="9.2 Mosis-cn" layerNames="{Metal-2,Metal-2}" type="SPACING" when="DE" value="4.0" />
+ <LayersRule ruleName="9.2 Mosis-cn" layerNames="{Metal-2,Metal-2}" type="SPACING" when="SU|SC" value="3.0" />
+ <LayersRule ruleName="9.3 Mosis-cn" layerNames="{Via1,Metal-2}" type="SURROUND" when="ALL" value="1.0" />
+ <LayersRule ruleName="9.4 Mosis-cn" layerNames="{Metal-2,Metal-2}" type="SPACING" when="DE" value="8.0" maxW="100.0" minLen="0.0" />
+ <LayersRule ruleName="9.4 Mosis-cn" layerNames="{Metal-2,Metal-2}" type="SPACING" when="SU|SC" value="6.0" maxW="100.0" minLen="0.0" />
+ <LayerRule ruleName="14.1 Mosis-cn" layerName="Via2" type="MINWID" when="DE" value="3.0" />
+ <NodeRule ruleName="14.1 Mosis-cn" type="NODSIZ" when="DE" value="5.0" nodeName="Metal-2-Metal-3-Con" />
+ <LayerRule ruleName="14.1 Mosis-cn" layerName="Via2" type="MINWID" when="SU|SC" value="2.0" />
+ <NodeRule ruleName="14.1 Mosis-cn" type="NODSIZ" when="M23|SU|SC" value="6.0" nodeName="Metal-2-Metal-3-Con" />
+ <LayersRule ruleName="14.2 Mosis-cn" layerNames="{Via2,Via2}" type="SPACING" when="ALL" value="3.0" />
+ <LayersRule ruleName="14.3 Mosis-cn" layerNames="{Via2,Metal-2}" type="SURROUND" when="ALL" value="1.0" />
+ <LayersRule ruleName="15.3 Mosis-cn" layerNames="{Via2,Metal-3}" type="SURROUND" when="DE" value="1.0" />
+ <LayersRule ruleName="15.3 Mosis-cn" layerNames="{Via2,Metal-3}" type="SURROUND" when="M3|SU|SC" value="2.0" />
+ <LayersRule ruleName="14.4 Mosis-cn" layerNames="{Via1,Via2}" type="SPACING" when="NSV|SU|SC" value="2.0" />
+ <LayerRule ruleName="15.1 Mosis-cn" layerName="Metal-3" type="MINWID" when="M3|SC" value="6.0" />
+ <LayerRule ruleName="15.1 Mosis-cn" layerName="Metal-3" type="MINWID" when="M3|SU" value="5.0" />
+ <LayersRule ruleName="15.2 Mosis-cn" layerNames="{Metal-3,Metal-3}" type="SPACING" when="DE" value="4.0" />
+ <LayersRule ruleName="15.2 Mosis-cn" layerNames="{Metal-3,Metal-3}" type="SPACING" when="SU" value="3.0" />
+ <LayersRule ruleName="15.2 Mosis-cn" layerNames="{Metal-3,Metal-3}" type="SPACING" when="M3|SC" value="4.0" />
+ <LayersRule ruleName="15.4 Mosis-cn" layerNames="{Metal-3,Metal-3}" type="SPACING" when="DE" value="8.0" maxW="100.0" minLen="0.0" />
+ <LayersRule ruleName="15.4 Mosis-cn" layerNames="{Metal-3,Metal-3}" type="SPACING" when="SU" value="6.0" maxW="100.0" minLen="0.0" />
+ <LayersRule ruleName="15.4 Mosis-cn" layerNames="{Metal-3,Metal-3}" type="SPACING" when="M3|SC" value="8.0" maxW="100.0" minLen="0.0" />
+ <LayersRule ruleName="16.3 Mosis-cn" layerNames="{N-Select,P-Base}" type="SURROUND" when="AN" value="2.0" />
+ <LayersRule ruleName="16.5 Mosis-cn" layerNames="{P-Select,P-Base}" type="SURROUND" when="AN" value="2.0" />
+ <LayersRule ruleName="16.7 Mosis-cn" layerNames="{P-Base,N-Well}" type="SURROUND" when="AN" value="6.0" />
+ <LayersRule ruleName="16.8 Mosis-cn" layerNames="{P-Base,P-Active}" type="SPACING" when="AN" value="4.0" />
+ <LayerRule ruleName="21.1 Mosis-cn" layerName="Via3" type="MINWID" when="DE" value="3.0" />
+ <LayerRule ruleName="21.1 Mosis-cn" layerName="Via3" type="MINWID" when="SU|SC" value="2.0" />
+ <LayersRule ruleName="21.2 Mosis-cn" layerNames="{Via3,Via3}" type="SPACING" when="ALL" value="3.0" />
+ <LayersRule ruleName="21.3 Mosis-cn" layerNames="{Via3,Metal-3}" type="SURROUND" when="ALL" value="1.0" />
+ <LayerRule ruleName="24.1 Mosis-cn" layerName="Thick-Active" type="MINWID" when="ALL" value="4.0" />
+ <LayersRule ruleName="24.2 Mosis-cn" layerNames="{Thick-Active,Thick-Active}" type="SPACING" when="ALL" value="4.0" />
+ <LayersRule ruleName="24.3 Mosis-cn" layerNames="{Thick-Active,P-Active}" type="SURROUND" when="ALL" value="4.0" />
+ <LayersRule ruleName="24.3 Mosis-cn" layerNames="{Thick-Active,N-Active}" type="SURROUND" when="ALL" value="4.0" />
+
+
+ </Foundry>
+</technology>
diff --git a/com/sun/electric/technology/technologies/mocmos.xml b/com/sun/electric/technology/technologies/mocmos.xml
index 5993757..2589fe7 100644
--- a/com/sun/electric/technology/technologies/mocmos.xml
+++ b/com/sun/electric/technology/technologies/mocmos.xml
@@ -8,7 +8,7 @@
* mocmos technology description
* Generated automatically from a library
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/technologies/mocmosParam.xml b/com/sun/electric/technology/technologies/mocmosParam.xml
index 5a82d33..ae76468 100644
--- a/com/sun/electric/technology/technologies/mocmosParam.xml
+++ b/com/sun/electric/technology/technologies/mocmosParam.xml
@@ -8,7 +8,7 @@
* mocmos technology description
* Generated automatically from a library
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/technologies/mocmosold.xml b/com/sun/electric/technology/technologies/mocmosold.xml
index 0c5cd0b..6b3d80e 100644
--- a/com/sun/electric/technology/technologies/mocmosold.xml
+++ b/com/sun/electric/technology/technologies/mocmosold.xml
@@ -8,7 +8,7 @@
* mocmosold technology description
* Generated automatically from a library
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/technologies/mocmossub.xml b/com/sun/electric/technology/technologies/mocmossub.xml
index 900753f..9afdb37 100644
--- a/com/sun/electric/technology/technologies/mocmossub.xml
+++ b/com/sun/electric/technology/technologies/mocmossub.xml
@@ -8,7 +8,7 @@
* mocmossub technology description
* Generated automatically from a library
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/technologies/nmos.xml b/com/sun/electric/technology/technologies/nmos.xml
index 99b72fa..82b0360 100644
--- a/com/sun/electric/technology/technologies/nmos.xml
+++ b/com/sun/electric/technology/technologies/nmos.xml
@@ -8,7 +8,7 @@
* nmos technology description
* Generated automatically from a library
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/technologies/pcb.xml b/com/sun/electric/technology/technologies/pcb.xml
index 2f74978..6c426c6 100644
--- a/com/sun/electric/technology/technologies/pcb.xml
+++ b/com/sun/electric/technology/technologies/pcb.xml
@@ -8,7 +8,7 @@
* Printed-Circuit Board technology description
* Generated automatically from a library
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/technologies/photonics/GratingCoupler.java b/com/sun/electric/technology/technologies/photonics/GratingCoupler.java
new file mode 100644
index 0000000..b8ab7fe
--- /dev/null
+++ b/com/sun/electric/technology/technologies/photonics/GratingCoupler.java
@@ -0,0 +1,138 @@
+/* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: GratingCoupler.java
+ *
+ * Design taken from www.opticsinfobase.org/oe/fulltext.cfm?uri=oe-21-19-21961
+ *
+ * Copyright (c) 2015, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.technology.technologies.photonics;
+
+import com.sun.electric.database.ImmutableNodeInst;
+import com.sun.electric.database.geometry.EPoint;
+import com.sun.electric.database.geometry.ERectangle;
+import com.sun.electric.database.geometry.Poly;
+import com.sun.electric.database.prototype.PortCharacteristic;
+import com.sun.electric.database.variable.Variable;
+import com.sun.electric.technology.AbstractShapeBuilder;
+import com.sun.electric.technology.ArcProto;
+import com.sun.electric.technology.EdgeH;
+import com.sun.electric.technology.EdgeV;
+import com.sun.electric.technology.Layer;
+import com.sun.electric.technology.PrimitiveNode;
+import com.sun.electric.technology.PrimitivePort;
+import com.sun.electric.technology.Technology;
+import com.sun.electric.technology.Technology.ExtraField;
+
+public class GratingCoupler extends PrimitiveNode
+{
+ /** default size of Grating Coupler */ private static final double BASESIZE = 20;
+ /** default degrees of a circle that this fills */ private static final double DEFDEGREES = 180;
+
+ /** Variable key for storing the angle of a grating coupler */
+ private static final Variable.Key COUPLER_ANGLE = Variable.newKey("SIPHOTONICS_GratingCouplerAngle");
+
+ private PrimitivePort pp;
+
+ public GratingCoupler(Photonics tech, Technology.NodeLayer[] layers)
+ {
+ super("Grating-Coupler", tech, EPoint.ORIGIN, EPoint.ORIGIN, null, BASESIZE, BASESIZE,
+ ERectangle.fromLambda(-BASESIZE/2, -BASESIZE/2, BASESIZE, BASESIZE),
+ ERectangle.fromLambda(-BASESIZE/2, -BASESIZE/2, BASESIZE, BASESIZE), layers);
+
+ // define the Grating Coupler angle parameter
+ new ExtraField(this, COUPLER_ANGLE, "Angle of Fan");
+
+ // add a port
+ pp = PrimitivePort.single(this, new ArcProto[] {Photonics.opticalArc}, "g-c", 90, 0, 0, PortCharacteristic.UNKNOWN,
+ EdgeH.c(0), EdgeV.c(0), EdgeH.c(0), EdgeV.c(0));
+ addPrimitivePorts(pp);
+ }
+
+ /**
+ * Puts into shape builders the polygons that describe node "n", given a set of
+ * NodeLayer objects to use.
+ * This method is overridden by specific Technologies.
+ * @param b shape builder where to put polygons
+ * @param n the ImmutableNodeInst that is being described.
+ */
+ @Override
+ public void genShape(AbstractShapeBuilder b, ImmutableNodeInst n)
+ {
+ assert n.protoId == getId();
+
+ // get the angle of this Grating Coupler
+ double degrees = DEFDEGREES;
+ Double userDegrees = n.getVarValue(COUPLER_ANGLE, Double.class);
+ if (userDegrees != null) degrees = userDegrees.doubleValue();
+ double halfDegrees = degrees / 2;
+
+ long radius = (n.size.getFixpY() + Photonics.lambdaToFixp(BASESIZE)) / 2;
+ double botRightAngle = (270 + halfDegrees) * Math.PI / 180;
+ double botLeftAngle = (270 - halfDegrees) * Math.PI / 180;
+
+ // the surrounding layers
+ PLayer [] ol = Photonics.getOpticalLayers(false);
+ for(int l=0; l<ol.length; l++)
+ {
+ Layer layer = ol[l].findLayer();
+ if (layer == null) continue;
+ b.setCurNode(n);
+ b.pushPoint(0, 0);
+ for(int i=0; i<=Photonics.CURVESTEPS; i++)
+ {
+ double angle = botLeftAngle + (botRightAngle - botLeftAngle) / Photonics.CURVESTEPS * i;
+ double x = radius * Math.cos(angle);
+ double y = radius * Math.sin(angle);
+ b.pushPoint(x, y);
+ }
+ b.pushPoly(Poly.Type.FILLED, layer, null, null);
+ }
+
+ // the waveguide rings
+ PLayer trench = Photonics.photonicsWaveguide;
+ Layer trenchLay = trench.findLayer();
+ double trenchWidth = trench.getWidth();
+ double ringRadius = 0;
+ long one = Photonics.lambdaToFixp(1);
+ for(;;)
+ {
+ ringRadius += trenchWidth * one;
+ double botRadius = ringRadius + trenchWidth * one;
+ if (botRadius > radius) break;
+ b.setCurNode(n);
+ for(int i=0; i<=Photonics.CURVESTEPS; i++)
+ {
+ double angle = botLeftAngle + (botRightAngle - botLeftAngle) / Photonics.CURVESTEPS * i;
+ double x = ringRadius * Math.cos(angle);
+ double y = ringRadius * Math.sin(angle);
+ b.pushPoint(x, y);
+ }
+ ringRadius = botRadius;
+ for(int i=Photonics.CURVESTEPS; i>=0; i--)
+ {
+ double angle = botLeftAngle + (botRightAngle - botLeftAngle) / Photonics.CURVESTEPS * i;
+ double x = ringRadius * Math.cos(angle);
+ double y = ringRadius * Math.sin(angle);
+ b.pushPoint(x, y);
+ }
+ b.pushPoly(Poly.Type.FILLED, trenchLay, null, null);
+ }
+ }
+
+}
diff --git a/com/sun/electric/technology/technologies/photonics/OpticalArc.java b/com/sun/electric/technology/technologies/photonics/OpticalArc.java
new file mode 100644
index 0000000..e55b405
--- /dev/null
+++ b/com/sun/electric/technology/technologies/photonics/OpticalArc.java
@@ -0,0 +1,48 @@
+/* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: OpticalArc.java
+ *
+ * Copyright (c) 2015, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.technology.technologies.photonics;
+
+import com.sun.electric.database.geometry.Poly;
+import com.sun.electric.technology.ArcProto;
+import com.sun.electric.technology.Technology;
+
+public class OpticalArc extends ArcProto
+{
+ public OpticalArc(Photonics tech)
+ {
+ super(tech, "Optical", 0, ArcProto.Function.UNKNOWN, collectArcLayers(), 5);
+ setFactoryFixedAngle(true);
+ setFactoryExtended(false);
+ setFactoryAngleIncrement(45);
+ setWipable();
+ tech.addArcProto(this);
+ }
+
+ private static Technology.ArcLayer[] collectArcLayers()
+ {
+ PLayer[] ol = Photonics.getOpticalLayers(true);
+ Technology.ArcLayer[] retArray = new Technology.ArcLayer[ol.length];
+ for(int i=0; i<ol.length; i++)
+ retArray[i] = new Technology.ArcLayer(ol[i].findLayer(), ol[i].getWidth(), Poly.Type.FILLED);
+ return retArray;
+ }
+}
diff --git a/com/sun/electric/technology/technologies/photonics/OpticalCorner.java b/com/sun/electric/technology/technologies/photonics/OpticalCorner.java
new file mode 100644
index 0000000..321e669
--- /dev/null
+++ b/com/sun/electric/technology/technologies/photonics/OpticalCorner.java
@@ -0,0 +1,179 @@
+/* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: OpticalCorner.java
+ *
+ * Copyright (c) 2015, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.technology.technologies.photonics;
+
+import com.sun.electric.database.ImmutableNodeInst;
+import com.sun.electric.database.geometry.EPoint;
+import com.sun.electric.database.geometry.ERectangle;
+import com.sun.electric.database.geometry.Poly;
+import com.sun.electric.database.prototype.PortCharacteristic;
+import com.sun.electric.technology.AbstractShapeBuilder;
+import com.sun.electric.technology.ArcProto;
+import com.sun.electric.technology.EdgeH;
+import com.sun.electric.technology.EdgeV;
+import com.sun.electric.technology.Layer;
+import com.sun.electric.technology.PrimitiveNode;
+import com.sun.electric.technology.PrimitivePort;
+import com.sun.electric.technology.Technology;
+
+public class OpticalCorner extends PrimitiveNode
+{
+ /** default size of Optical Corner */ private static final double BASESIZE = 10;
+ private int angle;
+ private PrimitivePort pp1, pp2;
+
+ public OpticalCorner(String protoName, Photonics tech, Technology.NodeLayer[] layers, int angle)
+ {
+ super(protoName, tech, EPoint.ORIGIN, EPoint.ORIGIN, null, BASESIZE, BASESIZE,
+ ERectangle.fromLambda(-BASESIZE/2, -BASESIZE/2, BASESIZE, BASESIZE),
+ ERectangle.fromLambda(-BASESIZE/2, -BASESIZE/2, BASESIZE, BASESIZE), layers);
+
+ this.angle = angle;
+ if (angle == 90)
+ {
+ // 90-degree bend
+ pp1 = PrimitivePort.newInstance(this, new ArcProto[] {Photonics.opticalArc}, "c1", 270, 0, 0, PortCharacteristic.UNKNOWN,
+ EdgeH.r(BASESIZE/2), EdgeV.b(-BASESIZE/2), EdgeH.r(BASESIZE/2), EdgeV.b(-BASESIZE/2));
+ pp2 = PrimitivePort.newInstance(this, new ArcProto[] {Photonics.opticalArc}, "c2", 180, 0, 0, PortCharacteristic.UNKNOWN,
+ EdgeH.l(-BASESIZE/2), EdgeV.t(BASESIZE/2), EdgeH.l(-BASESIZE/2), EdgeV.t(BASESIZE/2));
+ } else
+ {
+ // 45-degree bend
+ pp1 = PrimitivePort.newInstance(this, new ArcProto[] {Photonics.opticalArc}, "c1", 270, 0, 0, PortCharacteristic.UNKNOWN,
+ EdgeH.r(BASESIZE/2), EdgeV.b(-BASESIZE/2), EdgeH.r(BASESIZE/2), EdgeV.b(-BASESIZE/2));
+ pp2 = PrimitivePort.newInstance(this, new ArcProto[] {Photonics.opticalArc}, "c2", 135, 0, 0, PortCharacteristic.UNKNOWN,
+ EdgeH.r(2.07), EdgeV.t(2.07), EdgeH.r(2.07), EdgeV.t(2.07));
+ }
+ addPrimitivePorts(pp1, pp2);
+ setCurvedPin();
+ }
+
+ /**
+ * Puts into shape builders the polygons that describe node "n", given a set of
+ * NodeLayer objects to use.
+ * This method is overridden by specific Technologies.
+ * @param b shape builder where to put polygons
+ * @param n the ImmutableNodeInst that is being described.
+ */
+ @Override
+ public void genShape(AbstractShapeBuilder b, ImmutableNodeInst n)
+ {
+ assert n.protoId == getId();
+
+ long width = n.size.getFixpX() + Photonics.lambdaToFixp(BASESIZE);
+ long height = n.size.getFixpY() + Photonics.lambdaToFixp(BASESIZE);
+ PLayer trench = Photonics.photonicsWaveguide;
+ Layer otrenchLay = trench.findLayer();
+ long one = Photonics.lambdaToFixp(1);
+
+ // non-curved optical trench
+ if (width == 0 || height == 0)
+ {
+ b.setCurNode(n);
+ double extraWidth = trench.getWidth() - BASESIZE;
+ double halfWidth = (width + extraWidth*one)/2;
+ double halfHeight = (height + extraWidth*one)/2;
+ b.pushPoint(-halfWidth, -halfHeight);
+ b.pushPoint(-halfWidth, halfHeight);
+ b.pushPoint(halfWidth, halfHeight);
+ b.pushPoint(halfWidth, -halfHeight);
+ b.pushPoly(Poly.Type.CROSSED, otrenchLay, null, null);
+ return;
+ }
+
+ long halfWidth = width >> 1;
+ long halfHeight = height >> 1;
+ double trenchHalfWidth = trench.getWidth()/2;
+ double outerWid = width + trenchHalfWidth*one;
+ double outerHei = height + trenchHalfWidth*one;
+ double innerWid = width - trenchHalfWidth*one;
+ double innerHei = height - trenchHalfWidth*one;
+
+ // curved optical trench: the main light path
+ int numSteps = Photonics.CURVESTEPS * angle / 360;
+ int halfWay, numPasses;
+ if (b.isElectrical())
+ {
+ // "electrical" layers need two pieces, each connected to one side of the curve
+ numPasses = 2;
+ halfWay = numSteps/2;
+ } else
+ {
+ // regular layers draw it in one piece
+ numPasses = 1;
+ halfWay = numSteps;
+ }
+ for(int e=0; e<numPasses; e++)
+ {
+ b.setCurNode(n);
+ int startPt, endPt;
+ PrimitivePort pp;
+ if (e == 0) { startPt = 0; endPt = halfWay; pp = pp1; } else
+ { startPt = halfWay; endPt = numSteps; pp = pp2; }
+ for(int i=startPt; i<=endPt; i++)
+ {
+ double angle = Math.PI * 2 / Photonics.CURVESTEPS * i;
+ long x = (long)(Math.cos(angle) * outerWid) - halfWidth;
+ long y = (long)(Math.sin(angle) * outerHei) - halfHeight;
+ b.pushPoint(x, y);
+ }
+ for(int i=endPt; i>=startPt; i--)
+ {
+ double angle = Math.PI * 2 / Photonics.CURVESTEPS * i;
+ long x = (long)(Math.cos(angle) * innerWid) - halfWidth;
+ long y = (long)(Math.sin(angle) * innerHei) - halfHeight;
+ b.pushPoint(x, y);
+ }
+ b.pushPoly(Poly.Type.FILLED, otrenchLay, null, pp);
+ }
+
+ // Optical: the light path surround
+ PLayer[] ol = Photonics.getOpticalLayers(false);
+ for(int l=0; l<ol.length; l++)
+ {
+ Layer layer = ol[l].findLayer();
+ if (layer == null) continue;
+ double surroundHalfWidth = ol[l].getWidth() / 2;
+ outerWid = width + surroundHalfWidth*one;
+ outerHei = height + surroundHalfWidth*one;
+ innerWid = width - surroundHalfWidth*one;
+ innerHei = height - surroundHalfWidth*one;
+ b.setCurNode(n);
+ for(int i=0; i<=numSteps; i++)
+ {
+ double angle = Math.PI * 2 / Photonics.CURVESTEPS * i;
+ long x = (long)(Math.cos(angle) * outerWid) - halfWidth;
+ long y = (long)(Math.sin(angle) * outerHei) - halfHeight;
+ b.pushPoint(x, y);
+ }
+ for(int i=numSteps; i>=0; i--)
+ {
+ double angle = Math.PI * 2 / Photonics.CURVESTEPS * i;
+ long x = (long)(Math.cos(angle) * innerWid) - halfWidth;
+ long y = (long)(Math.sin(angle) * innerHei) - halfHeight;
+ b.pushPoint(x, y);
+ }
+ b.pushPoly(Poly.Type.FILLED, layer, null, null);
+ }
+ }
+}
+
diff --git a/com/sun/electric/technology/technologies/photonics/OpticalPin.java b/com/sun/electric/technology/technologies/photonics/OpticalPin.java
new file mode 100644
index 0000000..23057e2
--- /dev/null
+++ b/com/sun/electric/technology/technologies/photonics/OpticalPin.java
@@ -0,0 +1,86 @@
+/* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: OpticalPin.java
+ *
+ * Copyright (c) 2015, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.technology.technologies.photonics;
+
+import com.sun.electric.database.ImmutableNodeInst;
+import com.sun.electric.database.geometry.EPoint;
+import com.sun.electric.database.geometry.ERectangle;
+import com.sun.electric.database.geometry.Poly;
+import com.sun.electric.database.prototype.PortCharacteristic;
+import com.sun.electric.technology.AbstractShapeBuilder;
+import com.sun.electric.technology.ArcProto;
+import com.sun.electric.technology.EdgeH;
+import com.sun.electric.technology.EdgeV;
+import com.sun.electric.technology.Layer;
+import com.sun.electric.technology.PrimitiveNode;
+import com.sun.electric.technology.PrimitivePort;
+import com.sun.electric.technology.Technology;
+
+public class OpticalPin extends PrimitiveNode
+{
+ /** default size of Optical Pin */ private static final double BASESIZE = 1;
+ private PrimitivePort pp;
+
+ public OpticalPin(String protoName, Photonics tech, Technology.NodeLayer[] layers)
+ {
+ super(protoName, tech, EPoint.ORIGIN, EPoint.ORIGIN, null, BASESIZE, BASESIZE,
+ ERectangle.fromLambda(-BASESIZE/2, -BASESIZE/2, BASESIZE, BASESIZE),
+ ERectangle.fromLambda(-BASESIZE/2, -BASESIZE/2, BASESIZE, BASESIZE), layers);
+ pp = PrimitivePort.single(this, new ArcProto[] {Photonics.opticalArc}, "optical", 0, 180, 0, PortCharacteristic.UNKNOWN,
+ EdgeH.c(0), EdgeV.c(0), EdgeH.c(0), EdgeV.c(0));
+ addPrimitivePorts(pp);
+ setFunction(PrimitiveNode.Function.PIN);
+ setArcsWipe();
+ }
+
+ /**
+ * Puts into shape builders the polygons that describe node "n", given a set of
+ * NodeLayer objects to use.
+ * This method is overridden by specific Technologies.
+ * @param b shape builder where to put polygons
+ * @param n the ImmutableNodeInst that is being described.
+ */
+ @Override
+ public void genShape(AbstractShapeBuilder b, ImmutableNodeInst n)
+ {
+ assert n.protoId == getId();
+ long width = n.size.getFixpX() + Photonics.lambdaToFixp(BASESIZE);
+ long height = n.size.getFixpY() + Photonics.lambdaToFixp(BASESIZE);
+ long one = Photonics.lambdaToFixp(1);
+ PLayer[] ol = Photonics.getOpticalLayers(true);
+ for(int l=0; l<ol.length; l++)
+ {
+ Layer layer = ol[l].findLayer();
+ if (layer == null) continue;
+ double extraWidth = ol[l].getWidth() - BASESIZE;
+ double halfWidth = (width + extraWidth*one)/2;
+ double halfHeight = (height + extraWidth*one)/2;
+ b.setCurNode(n);
+ b.pushPoint(-halfWidth, -halfHeight);
+ b.pushPoint(-halfWidth, halfHeight);
+ b.pushPoint( halfWidth, halfHeight);
+ b.pushPoint( halfWidth, -halfHeight);
+ b.pushPoly(Poly.Type.CROSSED, layer, null, null);
+ }
+ }
+}
+
diff --git a/com/sun/electric/technology/technologies/photonics/PLayer.java b/com/sun/electric/technology/technologies/photonics/PLayer.java
new file mode 100644
index 0000000..5635f11
--- /dev/null
+++ b/com/sun/electric/technology/technologies/photonics/PLayer.java
@@ -0,0 +1,84 @@
+/* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: PLayer.java
+ *
+ * Copyright (c) 2015, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.technology.technologies.photonics;
+
+import com.sun.electric.technology.Layer;
+import com.sun.electric.technology.Technology;
+
+import java.io.Serializable;
+import java.util.Iterator;
+
+/**
+ * Class to define photonics layers that package an Electric Layer and a surround width.
+ */
+public class PLayer implements Serializable
+{
+ private String layerName;
+ private double width;
+ private boolean layerFound;
+ private Layer layer;
+
+ /**
+ * Constructor that defines a layer name and a surround width in an optical track.
+ * @param n the name of the Electric Layer.
+ * @param w the width of the layer when in an optical track.
+ */
+ public PLayer(String n, double w)
+ {
+ layerName = n;
+ width = w;
+ layerFound = false;
+ layer = null;
+ }
+
+ /**
+ * Method to return the width of this PLayer when run in an optical track.
+ * @return the width of this PLayer when run in an optical track.
+ */
+ public double getWidth() { return width; }
+
+ /**
+ * Method to find an Electric Layer in the Photonics technology.
+ * @return the Layer (null if not found).
+ */
+ public Layer findLayer()
+ {
+ if (layerFound) return layer;
+ Technology tech = Photonics.tech();
+ if (tech != null)
+ {
+ for(Iterator<Layer> it = tech.getLayers(); it.hasNext(); )
+ {
+ Layer lay = it.next();
+ if (lay.getName().equals(layerName))
+ {
+ layer = lay;
+ layerFound = true;
+ return lay;
+ }
+ }
+ }
+ System.out.println("ERROR: Cannot find layer " + layerName);
+ layerFound = true;
+ return layer;
+ }
+}
diff --git a/com/sun/electric/technology/technologies/photonics/PhotoDetector.java b/com/sun/electric/technology/technologies/photonics/PhotoDetector.java
new file mode 100644
index 0000000..a474472
--- /dev/null
+++ b/com/sun/electric/technology/technologies/photonics/PhotoDetector.java
@@ -0,0 +1,170 @@
+/* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: PhotoDetector.java
+ *
+ * Design taken from www.opticsinfobase.org/oe/fulltext.cfm?uri=oe-18-5-4986
+ *
+ * Copyright (c) 2015, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.technology.technologies.photonics;
+
+import com.sun.electric.database.ImmutableNodeInst;
+import com.sun.electric.database.geometry.EPoint;
+import com.sun.electric.database.geometry.ERectangle;
+import com.sun.electric.database.geometry.Poly;
+import com.sun.electric.database.prototype.PortCharacteristic;
+import com.sun.electric.technology.AbstractShapeBuilder;
+import com.sun.electric.technology.ArcProto;
+import com.sun.electric.technology.EdgeH;
+import com.sun.electric.technology.EdgeV;
+import com.sun.electric.technology.Layer;
+import com.sun.electric.technology.PrimitiveNode;
+import com.sun.electric.technology.PrimitivePort;
+import com.sun.electric.technology.Technology;
+
+public class PhotoDetector extends PrimitiveNode
+{
+ /** default width of Photo Detector */ private static final double BASEWIDTH = 10;
+ /** default height of Photo Detector */ private static final double BASEHEIGHT = 50;
+ /** default height of Photo Detector */ private static final double METALWIDTH = 5;
+ /** default height of Photo Detector */ private static final double METALGAP = 5;
+ /** length of taper at bottom */ private static final double TAPERHEIGHT = 20;
+ /** full width of Photo Detector */ private static final double FULLWIDTH = BASEWIDTH+(METALWIDTH+METALGAP)*2;
+ /** full width of Photo Detector */ private static final double FULLHEIGHT = BASEHEIGHT;
+
+ /** the primitive ports on this device */ private PrimitivePort pp1, pp2, pp3;
+
+ public PhotoDetector(Photonics tech, Technology.NodeLayer[] layers)
+ {
+ super("Photo-Detector", tech, EPoint.ORIGIN, EPoint.ORIGIN, null, FULLWIDTH, FULLHEIGHT,
+ ERectangle.fromLambda(-FULLWIDTH/2, -FULLHEIGHT/2, FULLWIDTH, FULLHEIGHT),
+ ERectangle.fromLambda(-BASEWIDTH/2, -BASEHEIGHT/2, BASEWIDTH, BASEHEIGHT), layers);
+ setMinSize(FULLWIDTH, FULLHEIGHT, "");
+
+ pp1 = PrimitivePort.newInstance(this, new ArcProto[] {Photonics.opticalArc}, "pd-bot", 270, 0, 0, PortCharacteristic.UNKNOWN,
+ EdgeH.c(0), EdgeV.b(-BASEHEIGHT/2), EdgeH.c(0), EdgeV.b(-BASEHEIGHT/2));
+ pp2 = PrimitivePort.newInstance(this, new ArcProto[] {Photonics.metal1Arc}, "pd-lft", 180, 90, 1, PortCharacteristic.UNKNOWN,
+ EdgeH.fromLeft(-FULLWIDTH/2), EdgeV.c(0), EdgeH.fromLeft(-FULLWIDTH/2), EdgeV.c(0));
+ pp3 = PrimitivePort.newInstance(this, new ArcProto[] {Photonics.metal1Arc}, "pd-rgt", 0, 90, 2, PortCharacteristic.UNKNOWN,
+ EdgeH.fromRight(-FULLWIDTH/2), EdgeV.c(0), EdgeH.fromRight(-FULLWIDTH/2), EdgeV.c(0));
+ addPrimitivePorts(pp1, pp2, pp3);
+ }
+
+ /**
+ * Puts into shape builders the polygons that describe node "n", given a set of
+ * NodeLayer objects to use.
+ * This method is overridden by specific Technologies.
+ * @param b shape builder where to put polygons
+ * @param n the ImmutableNodeInst that is being described.
+ */
+ @Override
+ public void genShape(AbstractShapeBuilder b, ImmutableNodeInst n)
+ {
+ assert n.protoId == getId();
+
+ long width = n.size.getFixpX() + Photonics.lambdaToFixp(BASEWIDTH);
+ long height = n.size.getFixpY() + Photonics.lambdaToFixp(BASEHEIGHT);
+
+ long taperHeight = Photonics.lambdaToFixp(TAPERHEIGHT);
+ long waveguideWidth = Photonics.lambdaToFixp(Photonics.photonicsWaveguide.getWidth());
+
+ PLayer[] ol = Photonics.getOpticalLayers(true);
+ for(int l=0; l<ol.length; l++)
+ {
+ Layer layer = ol[l].findLayer();
+ if (layer == null) continue;
+ long extend = Photonics.lambdaToFixp(ol[l].getWidth())-waveguideWidth;
+
+ // the main layer above the taper
+ b.setCurNode(n);
+ b.pushPoint(-width/2-extend/2, -height/2+taperHeight);
+ b.pushPoint(-width/2-extend/2, height/2);
+ b.pushPoint( width/2+extend/2, height/2);
+ b.pushPoint( width/2+extend/2, -height/2+taperHeight);
+ b.pushPoly(Poly.Type.FILLED, layer, null, null);
+
+ // the taper at the bottom
+ b.setCurNode(n);
+ b.pushPoint(-width/2-extend/2, -height/2+taperHeight);
+ b.pushPoint(-waveguideWidth/2-extend/2, -height/2);
+ b.pushPoint( waveguideWidth/2+extend/2, -height/2);
+ b.pushPoint( width/2+extend/2, -height/2+taperHeight);
+ b.pushPoly(Poly.Type.FILLED, layer, null, null);
+ }
+
+ // the row of cuts that alternate sides of metal
+ long metalGap = Photonics.lambdaToFixp(METALGAP);
+ long metalWidth = Photonics.lambdaToFixp(METALWIDTH);
+ long cutSpacing = Photonics.lambdaToFixp(5);
+ long cutSize = Photonics.lambdaToFixp(1);
+ int numCuts = (int)((height-cutSize) / cutSpacing);
+ if ((numCuts%2) == 1) numCuts--;
+ long metalLowLeft = height;
+ long metalHighLeft = -height;
+ long metalLowRight = height;
+ long metalHighRight = -height;
+ for(int i=0; i<numCuts; i++)
+ {
+ long yPos = -(numCuts-1)*cutSpacing/2 + i * cutSpacing;
+ b.setCurNode(n);
+ b.pushPoint(-cutSize/2, yPos-cutSize/2);
+ b.pushPoint(-cutSize/2, yPos+cutSize/2);
+ b.pushPoint(cutSize/2, yPos+cutSize/2);
+ b.pushPoint(cutSize/2, yPos-cutSize/2);
+ b.pushPoly(Poly.Type.FILLED, Photonics.polyCutLayer, null, null);
+
+ b.setCurNode(n);
+ if ((i%2) == 0)
+ {
+ // goes to the left
+ b.pushPoint(cutSize/2, yPos-cutSize/2);
+ b.pushPoint(cutSize/2, yPos+cutSize/2);
+ b.pushPoint(-width/2-metalGap, yPos+cutSize/2);
+ b.pushPoint(-width/2-metalGap, yPos-cutSize/2);
+ if (yPos+cutSize/2 > metalHighLeft) metalHighLeft = yPos+cutSize/2;
+ if (yPos-cutSize/2 < metalLowLeft) metalLowLeft = yPos-cutSize/2;
+ } else
+ {
+ // goes to the right
+ b.pushPoint(-cutSize/2, yPos-cutSize/2);
+ b.pushPoint(-cutSize/2, yPos+cutSize/2);
+ b.pushPoint(width/2+metalGap, yPos+cutSize/2);
+ b.pushPoint(width/2+metalGap, yPos-cutSize/2);
+ if (yPos+cutSize/2 > metalHighRight) metalHighRight = yPos+cutSize/2;
+ if (yPos-cutSize/2 < metalLowRight) metalLowRight = yPos-cutSize/2;
+ }
+ b.pushPoly(Poly.Type.FILLED, Photonics.metal1Layer, null, null);
+ }
+
+ // the metal piece on the left
+ b.setCurNode(n);
+ b.pushPoint(-width/2-metalGap, metalLowLeft);
+ b.pushPoint(-width/2-metalGap-metalWidth, metalLowLeft);
+ b.pushPoint(-width/2-metalGap-metalWidth, metalHighLeft);
+ b.pushPoint(-width/2-metalGap, metalHighLeft);
+ b.pushPoly(Poly.Type.FILLED, Photonics.metal1Layer, null, null);
+
+ // the metal piece on the right
+ b.setCurNode(n);
+ b.pushPoint(width/2+metalGap, metalLowRight);
+ b.pushPoint(width/2+metalGap+metalWidth, metalLowRight);
+ b.pushPoint(width/2+metalGap+metalWidth, metalHighRight);
+ b.pushPoint(width/2+metalGap, metalHighRight);
+ b.pushPoly(Poly.Type.FILLED, Photonics.metal1Layer, null, null);
+ }
+}
diff --git a/com/sun/electric/technology/technologies/photonics/Photonics.java b/com/sun/electric/technology/technologies/photonics/Photonics.java
new file mode 100644
index 0000000..0cac8d5
--- /dev/null
+++ b/com/sun/electric/technology/technologies/photonics/Photonics.java
@@ -0,0 +1,157 @@
+/* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: Photonics.java
+ *
+ * Copyright (c) 2015, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ *
+ * The "Photonics" technology contains generic code for abstract photonics technologies as described in various papers:
+ * www.opticsinfobase.org/oe/fulltext.cfm?uri=oe-21-19-21961
+ * www.opticsinfobase.org/oe/fulltext.cfm?uri=oe-18-5-4986
+ * spie.org/x90296.xml
+ */
+package com.sun.electric.technology.technologies.photonics;
+
+import com.sun.electric.database.geometry.Poly;
+import com.sun.electric.database.variable.Variable;
+import com.sun.electric.technology.ArcProto;
+import com.sun.electric.technology.Layer;
+import com.sun.electric.technology.TechFactory;
+import com.sun.electric.technology.Technology;
+import com.sun.electric.technology.Xml;
+import com.sun.electric.technology.technologies.Generic;
+import com.sun.electric.util.math.DBMath;
+import com.sun.electric.util.math.FixpCoord;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+public class Photonics extends Technology
+{
+ // the definition of a waveguide, with layers and surrounds
+ public static PLayer photonicsWaveguide = new PLayer("photonics-waveguide", 1);
+ public static PLayer photonicsSide = new PLayer("photonics-side", 5);
+ public static PLayer photonicsTop = new PLayer("photonics-top", 5);
+ public static PLayer photonicsBottom = new PLayer("photonics-bottom", 5);
+
+ /** number of steps in a curve */ public static final int CURVESTEPS = 128;
+ /** the metal-1 layer */ public static Layer metal1Layer = null;
+ /** the poly-cut layer */ public static Layer polyCutLayer = null;
+ /** the metal-1 arc */ public static ArcProto metal1Arc = null;
+ /** the optical layer */ public static ArcProto opticalArc = null;
+
+ private static Photonics thisTech = null;
+ public static final Variable.Key extraInfoKey = Variable.newKey("ATTR_ExtraInfo");
+
+ public Photonics(Generic generic, TechFactory techFactory, Map<TechFactory.Param,Object> techParams, Xml.Technology t)
+ {
+ super(generic, techFactory, techParams, t);
+ thisTech = this;
+ setStaticTechnology();
+
+ // build the optical arc
+ opticalArc = new OpticalArc(this);
+
+ // get layers
+ metal1Layer = findLayer("m1");
+ polyCutLayer = findLayer("poly-cut");
+ if (metal1Layer == null || polyCutLayer == null)
+ System.out.println("WARNING: Missing Layers in Photonics technology");
+
+ // get arcs
+ metal1Arc = findArcProto("metal-1");
+ if (metal1Arc == null)
+ System.out.println("WARNING: Missing Metal-1 arc in Photonics technology");
+
+ // make dummy NodeLayer to check visibility
+ Technology.NodeLayer[] nodeLayers =
+ {
+ new Technology.NodeLayer(metal1Layer, 0, Poly.Type.FILLED, Technology.NodeLayer.BOX, new Technology.TechPoint[0])
+ };
+
+ // load the simple optical primitives (pins and corners)
+ new OpticalPin("Optical-Pin", thisTech, nodeLayers);
+ new OpticalCorner("Optical-Corner-90", thisTech, nodeLayers, 90);
+ new OpticalCorner("Optical-Corner-45", thisTech, nodeLayers, 45);
+
+ // load the more advanced optical primitives
+ new GratingCoupler(thisTech, nodeLayers);
+ new PhotoDetector(thisTech, nodeLayers);
+ new Ring(thisTech, nodeLayers);
+ new Splitter(thisTech, nodeLayers);
+
+ // build component palette
+ loadFactoryMenuPalette(Photonics.class.getResource("PhotonicsMenu.xml"));
+ }
+
+ /**
+ * Method to return the Photonics Technology object.
+ */
+ public static Photonics tech() { return thisTech; }
+
+ /**
+ * This method is called from TechFactory by reflection. Don't remove.
+ * Returns a list of TechFactory.Params affecting this Technology
+ * @return list of TechFactory.Params affecting this Technology
+ */
+ public static List<TechFactory.Param> getTechParams()
+ {
+ return Arrays.asList();
+ }
+
+ /**
+ * This method is called from TechFactory by reflection. Don't remove.
+ * Returns patched XML description of this Technology for specified technology parameters
+ * @param params values of technology parameters
+ * @return patched XML description of this Technology
+ */
+ public static Xml.Technology getPatchedXml(Map<TechFactory.Param,Object> params)
+ {
+ Xml.Technology tech = Xml.parseTechnology(Photonics.class.getResource("Photonics.xml"));
+ return tech;
+ }
+
+ /**
+ * Method to convert from database units to fixed point units, used when rendering.
+ * @param l Electric units.
+ * @return fixed point units.
+ */
+ public static long lambdaToFixp(double l)
+ {
+ return (long)(l * DBMath.GRID * (1L << FixpCoord.FRACTION_BITS));
+ }
+
+ /**
+ * Method to return an array of PLayer objects used in an optical track.
+ * @param includeWaveguide true to include the waveguide layer,
+ * false to list just the surrounding layers.
+ * @return an array of PLayer objects used in an optical track.
+ */
+ public static PLayer[] getOpticalLayers(boolean includeWaveguide)
+ {
+ List<PLayer> wgb = new ArrayList<PLayer>();
+ if (includeWaveguide) wgb.add(photonicsWaveguide);
+ wgb.add(photonicsBottom);
+ wgb.add(photonicsSide);
+ wgb.add(photonicsTop);
+ PLayer[] ret = new PLayer[wgb.size()];
+ for(int i=0; i<wgb.size(); i++) ret[i] = wgb.get(i);
+ return ret;
+ }
+}
diff --git a/com/sun/electric/technology/technologies/photonics/Photonics.xml b/com/sun/electric/technology/technologies/photonics/Photonics.xml
new file mode 100644
index 0000000..20399c3
--- /dev/null
+++ b/com/sun/electric/technology/technologies/photonics/Photonics.xml
@@ -0,0 +1,1258 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: photonics.xml
+ * photonics technology description
+ *
+ * Copyright (c) 2015, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+-->
+
+<technology name="photonics"
+ xmlns="http://electric.sun.com/Technology"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://electric.sun.com/Technology ../../../technology/Technology.xsd">
+
+ <shortName>Photonics</shortName>
+ <description>Silicon Photonics 130nm</description>
+ <numMetals min="10" max="10" default="10"/>
+ <scale value="130.0" relevant="true"/>
+ <resolution value="0.1"/>
+ <defaultFoundry value="TSMC"/>
+ <minResistance value="1.0"/>
+ <minCapacitance value="0.1"/>
+
+ <!-- Transparent layers -->
+ <transparentLayer transparent="1">
+ <r>96</r>
+ <g>209</g>
+ <b>255</b>
+ </transparentLayer>
+ <transparentLayer transparent="2">
+ <r>255</r>
+ <g>100</g>
+ <b>100</b>
+ </transparentLayer>
+ <transparentLayer transparent="3">
+ <r>100</r>
+ <g>100</g>
+ <b>100</b>
+ </transparentLayer>
+ <transparentLayer transparent="4">
+ <r>224</r>
+ <g>95</g>
+ <b>255</b>
+ </transparentLayer>
+ <transparentLayer transparent="5">
+ <r>100</r>
+ <g>100</g>
+ <b>255</b>
+ </transparentLayer>
+
+ <!-- **************************************** LAYERS **************************************** -->
+ <layer name="m1" fun="METAL1">
+ <transparentColor transparent="1"/>
+ <patternedOnDisplay>false</patternedOnDisplay>
+ <patternedOnPrinter>true</patternedOnPrinter>
+ <pattern> X X X X </pattern>
+ <pattern> </pattern>
+ <pattern>X X X X </pattern>
+ <pattern> </pattern>
+ <pattern> X X X X </pattern>
+ <pattern> </pattern>
+ <pattern>X X X X </pattern>
+ <pattern> </pattern>
+ <pattern> X X X X </pattern>
+ <pattern> </pattern>
+ <pattern>X X X X </pattern>
+ <pattern> </pattern>
+ <pattern> X X X X </pattern>
+ <pattern> </pattern>
+ <pattern>X X X X </pattern>
+ <pattern> </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>0.8</opacity>
+ <foreground>true</foreground>
+ <display3D thick="8" height="17.0" mode="NONE" factor="0.2"/>
+ <pureLayerNode name="m1-Node" port="metal-1">
+ <lambda>2.4</lambda>
+ <portArc>metal-1</portArc>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="m2" fun="METAL2">
+ <transparentColor transparent="4"/>
+ <patternedOnDisplay>false</patternedOnDisplay>
+ <patternedOnPrinter>true</patternedOnPrinter>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern>X X </pattern>
+ <pattern> X X</pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern>X X </pattern>
+ <pattern> X X</pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>0.7</opacity>
+ <foreground>true</foreground>
+ <display3D thick="8.0" height="33.0" mode="NONE" factor="0.2"/>
+ <pureLayerNode name="m2-Node" port="metal-2">
+ <lambda>2.8</lambda>
+ <portArc>metal-2</portArc>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="poly" fun="POLY1">
+ <opaqueColor r="255" g="0" b="0"/>
+ <patternedOnDisplay>true</patternedOnDisplay>
+ <patternedOnPrinter>true</patternedOnPrinter>
+ <pattern>X X X X </pattern>
+ <pattern> X X X X</pattern>
+ <pattern> X X X X </pattern>
+ <pattern> X X X X </pattern>
+ <pattern>X X X X </pattern>
+ <pattern> X X X X</pattern>
+ <pattern> X X X X </pattern>
+ <pattern> X X X X </pattern>
+ <pattern>X X X X </pattern>
+ <pattern> X X X X</pattern>
+ <pattern> X X X X </pattern>
+ <pattern> X X X X </pattern>
+ <pattern>X X X X </pattern>
+ <pattern> X X X X</pattern>
+ <pattern> X X X X </pattern>
+ <pattern> X X X X </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>0.5</opacity>
+ <foreground>true</foreground>
+ <display3D thick="4.8" height="7.2" mode="SCREEN_DOOR" factor="0.5"/>
+ <pureLayerNode name="poly-Node" port="polysilicon">
+ <lambda>2.0</lambda>
+ <portArc>poly</portArc>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="p-active" fun="DIFFP">
+ <opaqueColor r="0" g="255" b="0"/>
+ <patternedOnDisplay>true</patternedOnDisplay>
+ <patternedOnPrinter>true</patternedOnPrinter>
+ <pattern> </pattern>
+ <pattern> XX XX</pattern>
+ <pattern> X X X X </pattern>
+ <pattern> XX XX</pattern>
+ <pattern> </pattern>
+ <pattern> XX XX </pattern>
+ <pattern>X X X X </pattern>
+ <pattern> XX XX </pattern>
+ <pattern> </pattern>
+ <pattern> XX XX</pattern>
+ <pattern> X X X X </pattern>
+ <pattern> XX XX</pattern>
+ <pattern> </pattern>
+ <pattern> XX XX </pattern>
+ <pattern>X X X X </pattern>
+ <pattern> XX XX </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>0.5</opacity>
+ <foreground>true</foreground>
+ <display3D thick="0.2" height="7.0" mode="SCREEN_DOOR" factor="0.5"/>
+ <pureLayerNode name="active-Node" port="active">
+ <lambda>2.2</lambda>
+ <portArc>P-Active</portArc>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="n-active" fun="DIFFN">
+ <opaqueColor r="0" g="255" b="0"/>
+ <patternedOnDisplay>true</patternedOnDisplay>
+ <patternedOnPrinter>true</patternedOnPrinter>
+ <pattern> </pattern>
+ <pattern> XX XX</pattern>
+ <pattern> X X X X </pattern>
+ <pattern> XX XX</pattern>
+ <pattern> </pattern>
+ <pattern> XX XX </pattern>
+ <pattern>X X X X </pattern>
+ <pattern> XX XX </pattern>
+ <pattern> </pattern>
+ <pattern> XX XX</pattern>
+ <pattern> X X X X </pattern>
+ <pattern> XX XX</pattern>
+ <pattern> </pattern>
+ <pattern> XX XX </pattern>
+ <pattern>X X X X </pattern>
+ <pattern> XX XX </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>0.5</opacity>
+ <foreground>true</foreground>
+ <display3D thick="0.2" height="7.0" mode="NONE" factor="0.2"/>
+ <pureLayerNode name="n-active-Node" port="active">
+ <lambda>2.2</lambda>
+ <portArc>N-Active</portArc>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="pplus" fun="IMPLANTP">
+ <opaqueColor r="170" g="170" b="0"/>
+ <patternedOnDisplay>true</patternedOnDisplay>
+ <patternedOnPrinter>true</patternedOnPrinter>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern>X X </pattern>
+ <pattern> X X</pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern>X X </pattern>
+ <pattern> X X</pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>0.2</opacity>
+ <foreground>false</foreground>
+ <display3D thick="1.0" height="6.0" mode="SCREEN_DOOR" factor="0.7"/>
+ <pureLayerNode name="pplus-Node" port="select">
+ <lambda>8.0</lambda>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="nplus" fun="IMPLANTN">
+ <opaqueColor r="255" g="255" b="0"/>
+ <patternedOnDisplay>true</patternedOnDisplay>
+ <patternedOnPrinter>true</patternedOnPrinter>
+ <pattern> X X</pattern>
+ <pattern> </pattern>
+ <pattern> X X </pattern>
+ <pattern> </pattern>
+ <pattern> X X</pattern>
+ <pattern> </pattern>
+ <pattern> X X </pattern>
+ <pattern> </pattern>
+ <pattern> X X</pattern>
+ <pattern> </pattern>
+ <pattern> X X </pattern>
+ <pattern> </pattern>
+ <pattern> X X</pattern>
+ <pattern> </pattern>
+ <pattern> X X </pattern>
+ <pattern> </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>0.2</opacity>
+ <foreground>false</foreground>
+ <display3D thick="1.0" height="6.0" mode="NONE" factor="0.2"/>
+ <pureLayerNode name="nplus-Node" port="select">
+ <lambda>8.0</lambda>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="pwell" fun="WELLP">
+ <opaqueColor r="139" g="99" b="46"/>
+ <patternedOnDisplay>true</patternedOnDisplay>
+ <patternedOnPrinter>true</patternedOnPrinter>
+ <pattern> X X </pattern>
+ <pattern> X X</pattern>
+ <pattern>X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X</pattern>
+ <pattern>X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <pattern> X X </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>0.2</opacity>
+ <foreground>false</foreground>
+ <display3D thick="1.0" height="10.0" mode="NONE" factor="0.2"/>
+ <pureLayerNode name="pwell-Node" port="well">
+ <lambda>11.0</lambda>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="nwell" fun="WELLN">
+ <opaqueColor r="139" g="99" b="46"/>
+ <patternedOnDisplay>true</patternedOnDisplay>
+ <patternedOnPrinter>true</patternedOnPrinter>
+ <pattern> X X </pattern>
+ <pattern> </pattern>
+ <pattern> X X </pattern>
+ <pattern> </pattern>
+ <pattern> X X </pattern>
+ <pattern> </pattern>
+ <pattern> X X </pattern>
+ <pattern> </pattern>
+ <pattern> X X </pattern>
+ <pattern> </pattern>
+ <pattern> X X </pattern>
+ <pattern> </pattern>
+ <pattern> X X </pattern>
+ <pattern> </pattern>
+ <pattern> X X </pattern>
+ <pattern> </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>0.2</opacity>
+ <foreground>false</foreground>
+ <display3D thick="1.0" height="10.0" mode="NONE" factor="0.2"/>
+ <pureLayerNode name="nwell-Node" port="well">
+ <lambda>11.0</lambda>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="poly-cut" fun="CONTACT1" extraFun="connects-poly">
+ <opaqueColor r="100" g="100" b="100"/>
+ <patternedOnDisplay>false</patternedOnDisplay>
+ <patternedOnPrinter>false</patternedOnPrinter>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>1.0</opacity>
+ <foreground>true</foreground>
+ <display3D thick="5.0" height="12.0" mode="NONE" factor="0.0"/>
+ <pureLayerNode name="poly-cut-Node" port="polycut">
+ <lambda>2.4</lambda>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="active-cut" fun="CONTACT1" extraFun="connects-diff">
+ <opaqueColor r="100" g="100" b="100"/>
+ <patternedOnDisplay>false</patternedOnDisplay>
+ <patternedOnPrinter>false</patternedOnPrinter>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>1.0</opacity>
+ <foreground>true</foreground>
+ <display3D thick="9.8" height="7.2" mode="NONE" factor="0.0"/>
+ <pureLayerNode name="active-cut-Node" port="activecut">
+ <lambda>2.4</lambda>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="via1" fun="CONTACT2" extraFun="connects-metal">
+ <opaqueColor r="180" g="180" b="180"/>
+ <patternedOnDisplay>false</patternedOnDisplay>
+ <patternedOnPrinter>false</patternedOnPrinter>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>1.0</opacity>
+ <foreground>true</foreground>
+ <display3D thick="8" height="25.0" mode="NONE" factor="0.2"/>
+ <pureLayerNode name="via1-Node" port="via1">
+ <lambda>2.6</lambda>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="transistor-poly" fun="GATE">
+ <opaqueColor r="255" g="0" b="0"/>
+ <patternedOnDisplay>true</patternedOnDisplay>
+ <patternedOnPrinter>true</patternedOnPrinter>
+ <pattern>X X X X </pattern>
+ <pattern> X X X X</pattern>
+ <pattern> X X X X </pattern>
+ <pattern> X X X X </pattern>
+ <pattern>X X X X </pattern>
+ <pattern> X X X X</pattern>
+ <pattern> X X X X </pattern>
+ <pattern> X X X X </pattern>
+ <pattern>X X X X </pattern>
+ <pattern> X X X X</pattern>
+ <pattern> X X X X </pattern>
+ <pattern> X X X X </pattern>
+ <pattern>X X X X </pattern>
+ <pattern> X X X X</pattern>
+ <pattern> X X X X </pattern>
+ <pattern> X X X X </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>0.5</opacity>
+ <foreground>true</foreground>
+ <display3D thick="4.0" height="15.4" mode="NONE" factor="0.2"/>
+ <pureLayerNode name="transistor-poly-Node" port="trans-poly-1">
+ <lambda>2.0</lambda>
+ <portArc>poly</portArc>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="passivation" fun="OVERGLASS">
+ <opaqueColor r="100" g="100" b="100"/>
+ <patternedOnDisplay>true</patternedOnDisplay>
+ <patternedOnPrinter>true</patternedOnPrinter>
+ <pattern> XXX XXX </pattern>
+ <pattern> XXXXX XXXXX </pattern>
+ <pattern> XX XX XX XX </pattern>
+ <pattern> XXXXX XXXXX </pattern>
+ <pattern> XXX XXX </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> XXX XXX </pattern>
+ <pattern> XXXXX XXXXX </pattern>
+ <pattern> XX XX XX XX </pattern>
+ <pattern> XXXXX XXXXX </pattern>
+ <pattern> XXX XXX </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>1.0</opacity>
+ <foreground>true</foreground>
+ <display3D thick="5.0" height="49.7" mode="NONE" factor="0.2"/>
+ <cifLayer cif="COG"/>
+ <skillLayer skill="glasscut"/>
+ <pureLayerNode name="Passivation-Node" port="passivation">
+ <lambda>8.0</lambda>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="photonics-waveguide" fun="CONTROL">
+ <opaqueColor r="200" g="200" b="0"/>
+ <patternedOnDisplay>true</patternedOnDisplay>
+ <patternedOnPrinter>true</patternedOnPrinter>
+ <pattern> X X X X</pattern>
+ <pattern>XXXXXXXXXXXXXXXX</pattern>
+ <pattern> X X X X</pattern>
+ <pattern> X X X X X X X X</pattern>
+ <pattern> X X X X</pattern>
+ <pattern>XXXXXXXXXXXXXXXX</pattern>
+ <pattern> X X X X</pattern>
+ <pattern> X X X X X X X X</pattern>
+ <pattern> X X X X</pattern>
+ <pattern>XXXXXXXXXXXXXXXX</pattern>
+ <pattern> X X X X</pattern>
+ <pattern> X X X X X X X X</pattern>
+ <pattern> X X X X</pattern>
+ <pattern>XXXXXXXXXXXXXXXX</pattern>
+ <pattern> X X X X</pattern>
+ <pattern> X X X X X X X X</pattern>
+ <outlined>NOPAT</outlined>
+ <opacity>0.5</opacity>
+ <foreground>true</foreground>
+ <display3D thick="1.0" height="6" mode="NONE" factor="0.2"/>
+ <parasitics resistance="8.5" capacitance="0.097" edgeCapacitance="0.073"/>
+ <pureLayerNode name="photonics-waveguide-Node" port="photonics-waveguide">
+ <lambda>7.2</lambda>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="photonics-side" fun="ART">
+ <transparentColor transparent="3"/>
+ <patternedOnDisplay>false</patternedOnDisplay>
+ <patternedOnPrinter>true</patternedOnPrinter>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <outlined>PAT_S</outlined>
+ <opacity>1.0</opacity>
+ <foreground>true</foreground>
+ <display3D thick="1.0" height="6.0" mode="SCREEN_DOOR" factor="0.2"/>
+ <cifLayer cif="Not set"/>
+ <skillLayer skill="photonics-side"/>
+ <pureLayerNode name="photonics-side-Node" port="Port_photonics_side">
+ <lambda>10.0</lambda>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="photonics-top" fun="ART">
+ <transparentColor transparent="2"/>
+ <patternedOnDisplay>false</patternedOnDisplay>
+ <patternedOnPrinter>true</patternedOnPrinter>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <outlined>PAT_S</outlined>
+ <opacity>1.0</opacity>
+ <foreground>true</foreground>
+ <display3D thick="5.0" height="7.0" mode="SCREEN_DOOR" factor="0.2"/>
+ <cifLayer cif="Not set"/>
+ <skillLayer skill="photonics-top"/>
+ <parasitics resistance="1.0" capacitance="0.0" edgeCapacitance="0.0"/>
+ <pureLayerNode name="photonics-top-Node" port="Port_photonics_top">
+ <lambda>10.0</lambda>
+ </pureLayerNode>
+ </layer>
+
+ <layer name="photonics-bottom" fun="ART">
+ <transparentColor transparent="5"/>
+ <patternedOnDisplay>false</patternedOnDisplay>
+ <patternedOnPrinter>true</patternedOnPrinter>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <pattern> </pattern>
+ <outlined>PAT_S</outlined>
+ <opacity>1.0</opacity>
+ <foreground>true</foreground>
+ <display3D thick="6.0" height="0.0" mode="NONE" factor="1.0"/>
+ <cifLayer cif="Not set"/>
+ <skillLayer skill="photonics-bottom"/>
+ <parasitics resistance="1.0" capacitance="0.0" edgeCapacitance="0.0"/>
+ <pureLayerNode name="photonics-bottom-Node" port="Port_photonics_bottom">
+ <lambda>10.0</lambda>
+ </pureLayerNode>
+ </layer>
+
+ <!-- ******************** ARCS ******************** -->
+ <arcProto name="metal-1" fun="METAL1">
+ <wipable/>
+ <extended>true</extended>
+ <fixedAngle>true</fixedAngle>
+ <angleIncrement>90</angleIncrement>
+ <antennaRatio>400.0</antennaRatio>
+ <diskOffset untilVersion="2" width="1.2"/>
+ <arcLayer layer="m1" style="FILLED">
+ <lambda>1.2</lambda>
+ </arcLayer>
+ </arcProto>
+
+ <arcProto name="metal-2" fun="METAL2">
+ <wipable/>
+ <extended>true</extended>
+ <fixedAngle>true</fixedAngle>
+ <angleIncrement>90</angleIncrement>
+ <antennaRatio>400.0</antennaRatio>
+ <diskOffset untilVersion="2" width="1.4"/>
+ <arcLayer layer="m2" style="FILLED">
+ <lambda>1.4</lambda>
+ </arcLayer>
+ </arcProto>
+
+ <arcProto name="poly" fun="POLY1">
+ <wipable/>
+ <extended>true</extended>
+ <fixedAngle>true</fixedAngle>
+ <angleIncrement>90</angleIncrement>
+ <antennaRatio>200.0</antennaRatio>
+ <diskOffset untilVersion="2" width="1.0"/>
+ <arcLayer layer="poly" style="FILLED">
+ <lambda>1.0</lambda>
+ </arcLayer>
+ </arcProto>
+
+ <arcProto name="P-Active" fun="DIFFP">
+ <wipable/>
+ <extended>true</extended>
+ <fixedAngle>true</fixedAngle>
+ <angleIncrement>90</angleIncrement>
+ <antennaRatio>200.0</antennaRatio>
+ <diskOffset untilVersion="1" width="5.5"/>
+ <diskOffset untilVersion="2" width="1.1"/>
+ <arcLayer layer="p-active" style="FILLED">
+ <lambda>1.1</lambda>
+ </arcLayer>
+ <arcLayer layer="nwell" style="FILLED">
+ <lambda>5.5</lambda>
+ </arcLayer>
+ <arcLayer layer="pplus" style="FILLED">
+ <lambda>3.7</lambda>
+ </arcLayer>
+ </arcProto>
+
+ <arcProto name="N-Active" fun="DIFFN">
+ <wipable/>
+ <extended>true</extended>
+ <fixedAngle>true</fixedAngle>
+ <angleIncrement>90</angleIncrement>
+ <antennaRatio>200.0</antennaRatio>
+ <diskOffset untilVersion="1" width="5.5"/>
+ <diskOffset untilVersion="2" width="1.1"/>
+ <arcLayer layer="n-active" style="FILLED">
+ <lambda>1.1</lambda>
+ </arcLayer>
+ <arcLayer layer="pwell" style="FILLED">
+ <lambda>5.5</lambda>
+ </arcLayer>
+ <arcLayer layer="nplus" style="FILLED">
+ <lambda>3.7</lambda>
+ </arcLayer>
+ </arcProto>
+
+ <!-- ******************** NODES ******************** -->
+ <primitiveNode name="m1-Pin" fun="PIN">
+ <shrinkArcs/>
+ <diskOffset untilVersion="2" x="1.2" y="1.2"/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-1.2" khx="1.2" kly="-1.2" khy="1.2"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="m1" style="CROSSED">
+ <box>
+ <lambdaBox klx="-1.2" khx="1.2" kly="-1.2" khy="1.2"/>
+ </box>
+ </nodeLayer>
+ <primitivePort name="metal-1">
+ <portAngle primary="0" range="180"/>
+ <portTopology>0</portTopology>
+ <box>
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </box>
+ <portArc>metal-1</portArc>
+ </primitivePort>
+ </primitiveNode>
+
+ <primitiveNode name="m2-Pin" fun="PIN">
+ <shrinkArcs/>
+ <diskOffset untilVersion="2" x="1.4" y="1.4"/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-1.4" khx="1.4" kly="-1.4" khy="1.4"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="m2" style="CROSSED">
+ <box>
+ <lambdaBox klx="-1.4" khx="1.4" kly="-1.4" khy="1.4"/>
+ </box>
+ </nodeLayer>
+ <primitivePort name="metal-2">
+ <portAngle primary="0" range="180"/>
+ <portTopology>0</portTopology>
+ <box>
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </box>
+ <portArc>metal-2</portArc>
+ </primitivePort>
+ </primitiveNode>
+
+ <primitiveNode name="poly-Pin" fun="PIN">
+ <shrinkArcs/>
+ <diskOffset untilVersion="2" x="1.0" y="1.0"/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-1.0" khx="1.0" kly="-1.0" khy="1.0"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="poly" style="CROSSED">
+ <box>
+ <lambdaBox klx="-1.0" khx="1.0" kly="-1.0" khy="1.0"/>
+ </box>
+ </nodeLayer>
+ <primitivePort name="polysilicon">
+ <portAngle primary="0" range="180"/>
+ <portTopology>0</portTopology>
+ <box>
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </box>
+ <portArc>poly</portArc>
+ </primitivePort>
+ </primitiveNode>
+
+ <primitiveNode name="p-active-Pin" fun="PIN">
+ <shrinkArcs/>
+ <diskOffset untilVersion="1" x="4.4" y="4.4"/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-1.1" khx="1.1" kly="-1.1" khy="1.1"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="p-active" style="CROSSED">
+ <box>
+ <lambdaBox klx="-1.1" khx="1.1" kly="-1.1" khy="1.1"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="nwell" style="CROSSED">
+ <box>
+ <lambdaBox klx="-5.5" khx="5.5" kly="-5.5" khy="5.5"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="pplus" style="CROSSED">
+ <box>
+ <lambdaBox klx="-3.7" khx="3.7" kly="-3.7" khy="3.7"/>
+ </box>
+ </nodeLayer>
+ <primitivePort name="p-active">
+ <portAngle primary="0" range="180"/>
+ <portTopology>0</portTopology>
+ <box>
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </box>
+ <portArc>P-Active</portArc>
+ </primitivePort>
+ </primitiveNode>
+
+ <primitiveNode name="n-active-Pin" fun="PIN">
+ <shrinkArcs/>
+ <diskOffset untilVersion="1" x="4.4" y="4.4"/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-1.1" khx="1.1" kly="-1.1" khy="1.1"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="n-active" style="CROSSED">
+ <box>
+ <lambdaBox klx="-1.1" khx="1.1" kly="-1.1" khy="1.1"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="pwell" style="CROSSED">
+ <box>
+ <lambdaBox klx="-5.5" khx="5.5" kly="-5.5" khy="5.5"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="nplus" style="CROSSED">
+ <box>
+ <lambdaBox klx="-3.7" khx="3.7" kly="-3.7" khy="3.7"/>
+ </box>
+ </nodeLayer>
+ <primitivePort name="n-active">
+ <portAngle primary="0" range="180"/>
+ <portTopology>0</portTopology>
+ <box>
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </box>
+ <portArc>N-Active</portArc>
+ </primitivePort>
+ </primitiveNode>
+
+ <primitiveNode name="m1-p-active-Con" fun="CONTACT">
+ <diskOffset untilVersion="1" x="7.0" y="7.0"/>
+ <diskOffset untilVersion="2" x="2.6" y="2.6"/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-2.6" khx="2.6" kly="-2.6" khy="2.6"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="m1" style="FILLED">
+ <box>
+ <lambdaBox klx="-1.7" khx="1.7" kly="-1.7" khy="1.7"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="p-active" style="FILLED">
+ <box>
+ <lambdaBox klx="-2.6" khx="2.6" kly="-2.6" khy="2.6"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="nwell" style="FILLED">
+ <box>
+ <lambdaBox klx="-7.0" khx="7.0" kly="-7.0" khy="7.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="pplus" style="FILLED">
+ <box>
+ <lambdaBox klx="-5.2" khx="5.2" kly="-5.2" khy="5.2"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="active-cut" style="FILLED">
+ <multicutbox sizex="2.4" sizey="2.4" sep1d="2.8" sep2d="3.2">
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </multicutbox>
+ </nodeLayer>
+ <primitivePort name="metal-1-p-act">
+ <portAngle primary="0" range="180"/>
+ <portTopology>0</portTopology>
+ <box>
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </box>
+ <portArc>P-Active</portArc>
+ <portArc>metal-1</portArc>
+ </primitivePort>
+ <minSizeRule width="14.0" height="14.0" rule="CO.W.1+2*CO.EN.1R+NW.EN.2"/>
+ </primitiveNode>
+
+ <primitiveNode name="m1-n-active-Con" fun="CONTACT">
+ <diskOffset untilVersion="1" x="7.0" y="7.0"/>
+ <diskOffset untilVersion="2" x="2.6" y="2.6"/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-2.6" khx="2.6" kly="-2.6" khy="2.6"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="m1" style="FILLED">
+ <box>
+ <lambdaBox klx="-1.7" khx="1.7" kly="-1.7" khy="1.7"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="n-active" style="FILLED">
+ <box>
+ <lambdaBox klx="-2.6" khx="2.6" kly="-2.6" khy="2.6"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="pwell" style="FILLED">
+ <box>
+ <lambdaBox klx="-7.0" khx="7.0" kly="-7.0" khy="7.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="nplus" style="FILLED">
+ <box>
+ <lambdaBox klx="-5.2" khx="5.2" kly="-5.2" khy="5.2"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="active-cut" style="FILLED">
+ <multicutbox sizex="2.4" sizey="2.4" sep1d="2.8" sep2d="3.2">
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </multicutbox>
+ </nodeLayer>
+ <primitivePort name="metal-1-n-act">
+ <portAngle primary="0" range="180"/>
+ <portTopology>0</portTopology>
+ <box>
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </box>
+ <portArc>N-Active</portArc>
+ <portArc>metal-1</portArc>
+ </primitivePort>
+ <minSizeRule width="14.0" height="14.0" rule="CO.W.1+2*CO.EN.1R+NW.EN.2"/>
+ </primitiveNode>
+
+ <primitiveNode name="m1-poly-Con" fun="CONTACT">
+ <diskOffset untilVersion="2" x="2.6" y="2.6"/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-2.6" khx="2.6" kly="-2.6" khy="2.6"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="m1" style="FILLED">
+ <box>
+ <lambdaBox klx="-1.7" khx="1.7" kly="-1.7" khy="1.7"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="poly" style="FILLED">
+ <box>
+ <lambdaBox klx="-2.6" khx="2.6" kly="-2.6" khy="2.6"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="poly-cut" style="FILLED">
+ <multicutbox sizex="2.4" sizey="2.4" sep1d="2.8" sep2d="3.2">
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </multicutbox>
+ </nodeLayer>
+ <primitivePort name="metal-1-polysilicon">
+ <portAngle primary="0" range="180"/>
+ <portTopology>0</portTopology>
+ <box>
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </box>
+ <portArc>poly</portArc>
+ <portArc>metal-1</portArc>
+ </primitivePort>
+ <minSizeRule width="5.2" height="5.2" rule="CO.W.1+2*CO.EN.3.R"/>
+ </primitiveNode>
+
+ <primitiveNode name="P-Transistor" fun="TRAPMOS">
+ <diskOffset untilVersion="1" x="9.4" y="9.2"/>
+ <diskOffset untilVersion="2" x="1.0" y="2.0"/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-1.0" khx="1.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="p-active" style="FILLED" portNum="1" electrical="true">
+ <box khx="-1.0">
+ <lambdaBox klx="-5.0" khx="-1.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="p-active" style="FILLED" portNum="3" electrical="true">
+ <box klx="1.0">
+ <lambdaBox klx="1.0" khx="5.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="transistor-poly" style="FILLED" electrical="true">
+ <box>
+ <lambdaBox klx="-1.0" khx="1.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="poly" style="FILLED" electrical="true">
+ <box kly="1.0">
+ <lambdaBox klx="-1.0" khx="1.0" kly="2.0" khy="5.2"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="poly" style="FILLED" electrical="true">
+ <box khy="-1.0">
+ <lambdaBox klx="-1.0" khx="1.0" kly="-5.2" khy="-2.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="p-active" style="FILLED" portNum="1" electrical="false">
+ <box>
+ <lambdaBox klx="-5.0" khx="5.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="transistor-poly" style="FILLED" electrical="false">
+ <box>
+ <lambdaBox klx="-1.0" khx="1.0" kly="-5.2" khy="5.2"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="nwell" style="FILLED" portNum="-1">
+ <box>
+ <lambdaBox klx="-9.4" khx="9.4" kly="-9.2" khy="9.2"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="pplus" style="FILLED" portNum="-1">
+ <box>
+ <lambdaBox klx="-7.6" khx="7.6" kly="-9.2" khy="9.2"/>
+ </box>
+ </nodeLayer>
+ <primitivePort name="poly-top">
+ <portAngle primary="90" range="90"/>
+ <portTopology>0</portTopology>
+ <box kly="1.0">
+ <lambdaBox klx="0.0" khx="0.0" kly="5.0" khy="5.0"/>
+ </box>
+ <portArc>poly</portArc>
+ </primitivePort>
+ <primitivePort name="diff-left">
+ <portAngle primary="180" range="90"/>
+ <portTopology>1</portTopology>
+ <box khx="-1.0">
+ <lambdaBox klx="-3.2" khx="-2.4" kly="-0.6" khy="0.6"/>
+ </box>
+ <portArc>P-Active</portArc>
+ </primitivePort>
+ <primitivePort name="poly-bottom">
+ <portAngle primary="270" range="90"/>
+ <portTopology>0</portTopology>
+ <box khy="-1.0">
+ <lambdaBox klx="0.0" khx="0.0" kly="-5.0" khy="-5.0"/>
+ </box>
+ <portArc>poly</portArc>
+ </primitivePort>
+ <primitivePort name="diff-right">
+ <portAngle primary="0" range="90"/>
+ <portTopology>2</portTopology>
+ <box klx="1.0">
+ <lambdaBox klx="2.4" khx="3.2" kly="-0.6" khy="0.6"/>
+ </box>
+ <portArc>P-Active</portArc>
+ </primitivePort>
+ <minSizeRule width="18.8" height="18.4" rule=""/>
+ </primitiveNode>
+
+ <primitiveNode name="N-Transistor" fun="TRANMOS">
+ <diskOffset untilVersion="1" x="9.4" y="9.2"/>
+ <diskOffset untilVersion="2" x="1.0" y="2.0"/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-1.0" khx="1.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="n-active" style="FILLED" portNum="1" electrical="true">
+ <box khx="-1.0">
+ <lambdaBox klx="-5.0" khx="-1.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="n-active" style="FILLED" portNum="3" electrical="true">
+ <box klx="1.0">
+ <lambdaBox klx="1.0" khx="5.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="transistor-poly" style="FILLED" electrical="true">
+ <box>
+ <lambdaBox klx="-1.0" khx="1.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="poly" style="FILLED" electrical="true">
+ <box kly="1.0">
+ <lambdaBox klx="-1.0" khx="1.0" kly="2.0" khy="5.2"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="poly" style="FILLED" electrical="true">
+ <box khy="-1.0">
+ <lambdaBox klx="-1.0" khx="1.0" kly="-5.2" khy="-2.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="n-active" style="FILLED" portNum="1" electrical="false">
+ <box>
+ <lambdaBox klx="-5.0" khx="5.0" kly="-2.0" khy="2.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="transistor-poly" style="FILLED" electrical="false">
+ <box>
+ <lambdaBox klx="-1.0" khx="1.0" kly="-5.2" khy="5.2"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="pwell" style="FILLED" portNum="-1">
+ <box>
+ <lambdaBox klx="-9.4" khx="9.4" kly="-9.2" khy="9.2"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="nplus" style="FILLED" portNum="-1">
+ <box>
+ <lambdaBox klx="-7.6" khx="7.6" kly="-9.2" khy="9.2"/>
+ </box>
+ </nodeLayer>
+ <primitivePort name="poly-top">
+ <portAngle primary="90" range="90"/>
+ <portTopology>0</portTopology>
+ <box kly="1.0">
+ <lambdaBox klx="0.0" khx="0.0" kly="5.0" khy="5.0"/>
+ </box>
+ <portArc>poly</portArc>
+ </primitivePort>
+ <primitivePort name="diff-left">
+ <portAngle primary="180" range="90"/>
+ <portTopology>1</portTopology>
+ <box khx="-1.0">
+ <lambdaBox klx="-3.2" khx="-2.4" kly="-0.6" khy="0.6"/>
+ </box>
+ <portArc>N-Active</portArc>
+ </primitivePort>
+ <primitivePort name="poly-bottom">
+ <portAngle primary="270" range="90"/>
+ <portTopology>0</portTopology>
+ <box khy="-1.0">
+ <lambdaBox klx="0.0" khx="0.0" kly="-5.0" khy="-5.0"/>
+ </box>
+ <portArc>poly</portArc>
+ </primitivePort>
+ <primitivePort name="diff-right">
+ <portAngle primary="0" range="90"/>
+ <portTopology>2</portTopology>
+ <box klx="1.0">
+ <lambdaBox klx="2.4" khx="3.2" kly="-0.6" khy="0.6"/>
+ </box>
+ <portArc>N-Active</portArc>
+ </primitivePort>
+ <minSizeRule width="18.8" height="18.4" rule=""/>
+ </primitiveNode>
+
+ <primitiveNode name="m1-m2-Con" fun="CONTACT">
+ <skipSizeInPalette/>
+ <diskOffset untilVersion="2" x="1.4" y="2.9"/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-1.4" khx="1.4" kly="-2.9" khy="2.9"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="m1" style="FILLED">
+ <box>
+ <lambdaBox klx="-1.4" khx="1.4" kly="-2.9" khy="2.9"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="m2" style="FILLED">
+ <box>
+ <lambdaBox klx="-1.4" khx="1.4" kly="-2.9" khy="2.9"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="via1" style="FILLED">
+ <multicutbox sizex="2.6" sizey="2.6" sep1d="3.0" sep2d="3.4">
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </multicutbox>
+ </nodeLayer>
+ <primitivePort name="metal-1-metal-2">
+ <portAngle primary="0" range="180"/>
+ <portTopology>0</portTopology>
+ <box>
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </box>
+ <portArc>metal-1</portArc>
+ <portArc>metal-2</portArc>
+ </primitivePort>
+ <minSizeRule width="2.8" height="5.8" rule="m1-m2-Con Asymmetric Min. Size"/>
+ </primitiveNode>
+
+ <primitiveNode name="m1-pwell-Con" fun="SUBSTRATE">
+ <diskOffset untilVersion="1" x="6.0" y="6.0"/>
+ <diskOffset untilVersion="2" x="2.6" y="2.6"/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-2.6" khx="2.6" kly="-2.6" khy="2.6"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="m1" style="FILLED">
+ <box>
+ <lambdaBox klx="-1.7" khx="1.7" kly="-1.7" khy="1.7"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="p-active" style="FILLED">
+ <box>
+ <lambdaBox klx="-2.6" khx="2.6" kly="-2.6" khy="2.6"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="pwell" style="FILLED">
+ <box>
+ <lambdaBox klx="-6.0" khx="6.0" kly="-6.0" khy="6.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="pplus" style="FILLED">
+ <box>
+ <lambdaBox klx="-3.0" khx="3.0" kly="-3.0" khy="3.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="active-cut" style="FILLED">
+ <multicutbox sizex="2.4" sizey="2.4" sep1d="2.8" sep2d="3.2">
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </multicutbox>
+ </nodeLayer>
+ <primitivePort name="metal-1-well">
+ <portAngle primary="0" range="180"/>
+ <portTopology>0</portTopology>
+ <box>
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </box>
+ <portArc>metal-1</portArc>
+ </primitivePort>
+ <minSizeRule width="12.0" height="12.0" rule="CO.W.1+2*NW.EN.1+2*CO.EN.1.R"/>
+ </primitiveNode>
+
+ <primitiveNode name="m1-nwell-Con" fun="WELL">
+ <diskOffset untilVersion="1" x="6.0" y="6.0"/>
+ <diskOffset untilVersion="2" x="2.6" y="2.6"/>
+ <nodeBase>
+ <box>
+ <lambdaBox klx="-2.6" khx="2.6" kly="-2.6" khy="2.6"/>
+ </box>
+ </nodeBase>
+ <nodeLayer layer="m1" style="FILLED">
+ <box>
+ <lambdaBox klx="-1.7" khx="1.7" kly="-1.7" khy="1.7"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="n-active" style="FILLED">
+ <box>
+ <lambdaBox klx="-2.6" khx="2.6" kly="-2.6" khy="2.6"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="nwell" style="FILLED">
+ <box>
+ <lambdaBox klx="-6.0" khx="6.0" kly="-6.0" khy="6.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="nplus" style="FILLED">
+ <box>
+ <lambdaBox klx="-3.0" khx="3.0" kly="-3.0" khy="3.0"/>
+ </box>
+ </nodeLayer>
+ <nodeLayer layer="active-cut" style="FILLED">
+ <multicutbox sizex="2.4" sizey="2.4" sep1d="2.8" sep2d="3.2">
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </multicutbox>
+ </nodeLayer>
+ <primitivePort name="metal-1-substrate">
+ <portAngle primary="0" range="180"/>
+ <portTopology>0</portTopology>
+ <box>
+ <lambdaBox klx="0.0" khx="0.0" kly="0.0" khy="0.0"/>
+ </box>
+ <portArc>metal-1</portArc>
+ </primitivePort>
+ <minSizeRule width="12.0" height="12.0" rule="CO.W.1+2*NW.EN.1+2*CO.EN.1.R"/>
+ </primitiveNode>
+
+ <Foundry name="TSMC">
+ <layerGds layer="m1" gds="8,123/7p"/>
+ <layerGds layer="m2" gds="10,123/8p"/>
+ <layerGds layer="poly" gds="5,123/63p"/>
+ <layerGds layer="pplus" gds="14"/>
+ <layerGds layer="nplus" gds="4"/>
+ <layerGds layer="nwell" gds="31"/>
+ <layerGds layer="poly-cut" gds="30"/>
+ <layerGds layer="active-cut" gds="30"/>
+ <layerGds layer="via1" gds="19"/>
+ <layerGds layer="transistor-poly" gds="17"/>
+
+ <layerGds layer="photonics-waveguide" gds="100,123/46p"/>
+ <layerGds layer="photonics-side" gds="121/33"/>
+ <layerGds layer="photonics-bottom" gds="2/1"/>
+ <layerGds layer="photonics-top" gds="102"/>
+ </Foundry>
+</technology>
diff --git a/com/sun/electric/technology/technologies/photonics/PhotonicsMenu.xml b/com/sun/electric/technology/technologies/photonics/PhotonicsMenu.xml
new file mode 100644
index 0000000..42e97db
--- /dev/null
+++ b/com/sun/electric/technology/technologies/photonics/PhotonicsMenu.xml
@@ -0,0 +1,147 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: PhotonicsMenu.xml
+ * photonics technology component menu
+ *
+ * Copyright (c) 2015, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+-->
+
+<menuPalette numColumns="3">
+
+ <menuBox>
+ <menuNodeInst protoName="Splitter" function="UNKNOWN">
+ <menuNodeText text="Splt" size="7.0"/>
+ </menuNodeInst>
+ </menuBox>
+ <menuBox>
+ <menuNodeInst protoName="P-Transistor" function="TRAPMOS">
+ <menuNodeText text="pMos" size="7.0"/>
+ </menuNodeInst>
+ </menuBox>
+ <menuBox>
+ <menuNodeInst protoName="N-Transistor" function="TRANMOS">
+ <menuNodeText text="nMos" size="7.0"/>
+ </menuNodeInst>
+ </menuBox>
+
+ <menuBox>
+ <menuNodeInst protoName="Ring" function="UNKNOWN">
+ <menuNodeText text="Ring" size="7.0"/>
+ </menuNodeInst>
+ </menuBox>
+ <menuBox>
+ <menuNodeInst protoName="m1-pwell-Con" function="SUBSTRATE">
+ <menuNodeText text="pWell" size="4.5"/>
+ </menuNodeInst>
+ </menuBox>
+ <menuBox>
+ <menuNodeInst protoName="m1-nwell-Con" function="WELL">
+ <menuNodeText text="nWell" size="4.5"/>
+ </menuNodeInst>
+ </menuBox>
+
+ <menuBox>
+ <menuNodeInst protoName="Grating-Coupler" function="UNKNOWN">
+ <menuNodeText text="G.C." size="4.5"/>
+ </menuNodeInst>
+ </menuBox>
+ <menuBox>
+ <menuNodeInst protoName="Photo-Detector" function="CONTACT">
+ <menuNodeText text="P.D." size="7.0"/>
+ </menuNodeInst>
+ </menuBox>
+ <menuBox>
+ </menuBox>
+
+ <menuBox>
+ <menuArc>Optical</menuArc>
+ </menuBox>
+ <menuBox>
+ <menuNodeInst protoName="Optical-Pin" function="PIN"/>
+ </menuBox>
+ <menuBox>
+ <menuNodeInst protoName="Optical-Corner-90" function="CONNECT"/>
+ <menuNodeInst protoName="Optical-Corner-45" function="CONNECT"/>
+ </menuBox>
+
+ <menuBox>
+ <menuArc>P-Active</menuArc>
+ </menuBox>
+ <menuBox>
+ <menuNodeInst protoName="p-active-Pin" function="PIN"/>
+ </menuBox>
+ <menuBox>
+ <menuNodeInst protoName="m1-p-active-Con" function="CONTACT">
+ <menuNodeText text="pAct" size="5.0"/>
+ </menuNodeInst>
+ </menuBox>
+
+ <menuBox>
+ <menuArc>N-Active</menuArc>
+ </menuBox>
+ <menuBox>
+ <menuNodeInst protoName="n-active-Pin" function="PIN"/>
+ </menuBox>
+ <menuBox>
+ <menuNodeInst protoName="m1-n-active-Con" function="CONTACT">
+ <menuNodeText text="nAct" size="5.0"/>
+ </menuNodeInst>
+ </menuBox>
+
+ <menuBox>
+ <menuArc>poly</menuArc>
+ </menuBox>
+ <menuBox>
+ <menuNodeInst protoName="poly-Pin" function="PIN"/>
+ </menuBox>
+ <menuBox>
+ <menuNode>m1-poly-Con</menuNode>
+ </menuBox>
+
+ <menuBox>
+ <menuArc>metal-1</menuArc>
+ </menuBox>
+ <menuBox>
+ <menuNodeInst protoName="m1-Pin" function="PIN"/>
+ </menuBox>
+ <menuBox>
+ <menuNodeInst protoName="m1-m2-Con" function="CONTACT"/>
+ </menuBox>
+
+ <menuBox>
+ <menuArc>metal-2</menuArc>
+ </menuBox>
+ <menuBox>
+ <menuNodeInst protoName="m2-Pin" function="PIN"/>
+ </menuBox>
+ <menuBox>
+ </menuBox>
+
+ <menuBox>
+ <menuText>Pure</menuText>
+ </menuBox>
+ <menuBox>
+ <menuText>Misc.</menuText>
+ </menuBox>
+ <menuBox>
+ <menuText>Cell</menuText>
+ </menuBox>
+
+</menuPalette>
diff --git a/com/sun/electric/technology/technologies/photonics/Ring.java b/com/sun/electric/technology/technologies/photonics/Ring.java
new file mode 100644
index 0000000..b396c29
--- /dev/null
+++ b/com/sun/electric/technology/technologies/photonics/Ring.java
@@ -0,0 +1,94 @@
+/* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: Ring.java
+ *
+ * Copyright (c) 2015, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.technology.technologies.photonics;
+
+import com.sun.electric.database.ImmutableNodeInst;
+import com.sun.electric.database.geometry.EPoint;
+import com.sun.electric.database.geometry.ERectangle;
+import com.sun.electric.database.geometry.Poly;
+import com.sun.electric.database.prototype.PortCharacteristic;
+import com.sun.electric.technology.AbstractShapeBuilder;
+import com.sun.electric.technology.ArcProto;
+import com.sun.electric.technology.EdgeH;
+import com.sun.electric.technology.EdgeV;
+import com.sun.electric.technology.Layer;
+import com.sun.electric.technology.PrimitiveNode;
+import com.sun.electric.technology.PrimitivePort;
+import com.sun.electric.technology.Technology;
+
+public class Ring extends PrimitiveNode
+{
+ private static final double BASESIZE = 30;
+
+ private PrimitivePort ppC;
+
+ public Ring(Photonics tech, Technology.NodeLayer[] layers)
+ {
+ super("Ring", tech, EPoint.ORIGIN, EPoint.ORIGIN, null, BASESIZE, BASESIZE,
+ ERectangle.fromLambda(-BASESIZE/2, -BASESIZE/2, BASESIZE, BASESIZE),
+ ERectangle.fromLambda(-BASESIZE/2, -BASESIZE/2, BASESIZE, BASESIZE), layers);
+ setSquare();
+ ppC = PrimitivePort.single(this, new ArcProto[] {Photonics.opticalArc}, "ring-ctr", 90, 0, 0, PortCharacteristic.UNKNOWN,
+ EdgeH.c(0), EdgeV.t(BASESIZE/2), EdgeH.c(0), EdgeV.t(BASESIZE/2));
+ addPrimitivePorts(ppC);
+ }
+
+ /**
+ * Puts into shape builders the polygons that describe node "n", given a set of
+ * NodeLayer objects to use.
+ * This method is overridden by specific Technologies.
+ * @param b shape builder where to put polygons
+ * @param n the ImmutableNodeInst that is being described.
+ */
+ @Override
+ public void genShape(AbstractShapeBuilder b, ImmutableNodeInst n)
+ {
+ assert n.protoId == getId();
+
+ long radius = (n.size.getFixpX()+Photonics.lambdaToFixp(BASESIZE)) >> 1;
+
+ PLayer[] ol = Photonics.getOpticalLayers(true);
+ for(int l=0; l<ol.length; l++)
+ {
+ Layer layer = ol[l].findLayer();
+ if (layer == null) continue;
+ long extend = Photonics.lambdaToFixp(ol[l].getWidth())/2;
+ b.setCurNode(n);
+ for(int i=0; i<=Photonics.CURVESTEPS; i++)
+ {
+ double angle = Math.PI * 2 / Photonics.CURVESTEPS * i;
+ long x = (long)(Math.cos(angle) * (radius+extend));
+ long y = (long)(Math.sin(angle) * (radius+extend));
+ b.pushPoint(x, y);
+ }
+ for(int i=Photonics.CURVESTEPS; i>=0; i--)
+ {
+ double angle = Math.PI * 2 / Photonics.CURVESTEPS * i;
+ long x = (long)(Math.cos(angle) * (radius-extend));
+ long y = (long)(Math.sin(angle) * (radius-extend));
+ b.pushPoint(x, y);
+ }
+ PrimitivePort pp = (ol[l] == Photonics.photonicsWaveguide) ? ppC : null;
+ b.pushPoly(Poly.Type.FILLED, layer, null, pp);
+ }
+ }
+}
diff --git a/com/sun/electric/technology/technologies/photonics/Splitter.java b/com/sun/electric/technology/technologies/photonics/Splitter.java
new file mode 100644
index 0000000..4404ffe
--- /dev/null
+++ b/com/sun/electric/technology/technologies/photonics/Splitter.java
@@ -0,0 +1,163 @@
+/* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: Splitter.java
+ *
+ * Design taken from spie.org/x90296.xml
+ *
+ * Copyright (c) 2015, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.technology.technologies.photonics;
+
+import com.sun.electric.database.ImmutableNodeInst;
+import com.sun.electric.database.geometry.EPoint;
+import com.sun.electric.database.geometry.ERectangle;
+import com.sun.electric.database.geometry.Poly;
+import com.sun.electric.database.prototype.PortCharacteristic;
+import com.sun.electric.technology.AbstractShapeBuilder;
+import com.sun.electric.technology.ArcProto;
+import com.sun.electric.technology.EdgeH;
+import com.sun.electric.technology.EdgeV;
+import com.sun.electric.technology.PrimitiveNode;
+import com.sun.electric.technology.PrimitivePort;
+import com.sun.electric.technology.Technology;
+
+public class Splitter extends PrimitiveNode
+{
+ /** default width of Splitter */ private static final double BASEWIDTH = 40;
+ /** default height of Splitter */ private static final double BASEHEIGHT = 20;
+ /** default angle shift */ private static final double DEFAULTANGLESHIFT = 1;
+ /** default horiz shift */ private static final double DEFAULTHORIZSHIFT = 5;
+
+ private SplitterPort pp1, pp2, pp3;
+
+ public Splitter(Photonics tech, Technology.NodeLayer[] layers)
+ {
+ super("Splitter", tech, EPoint.ORIGIN, EPoint.ORIGIN, null, BASEWIDTH, BASEHEIGHT,
+ ERectangle.fromLambda(-BASEWIDTH/2, -BASEHEIGHT/2, BASEWIDTH, BASEHEIGHT),
+ ERectangle.fromLambda(-BASEWIDTH/2, -BASEHEIGHT/2, BASEWIDTH, BASEHEIGHT), layers);
+
+ // define the four ports
+ pp1 = new SplitterPort(this, "splitter-ll", 180, 1); // port in lower-left
+ pp2 = new SplitterPort(this, "splitter-lr", 0, 2); // port in lower-right
+ pp3 = new SplitterPort(this, "splitter-ur", 0, 3); // port in upper-right
+ addPrimitivePorts(pp1, pp2, pp3);
+ }
+
+ /**
+ * Puts into shape builders the polygons that describe node "n", given a set of
+ * NodeLayer objects to use.
+ * This method is overridden by specific Technologies.
+ * @param b shape builder where to put polygons
+ * @param n the ImmutableNodeInst that is being described.
+ */
+ @Override
+ public void genShape(AbstractShapeBuilder b, ImmutableNodeInst n)
+ {
+ assert n.protoId == getId();
+
+ long width = n.size.getFixpX() + Photonics.lambdaToFixp(BASEWIDTH);
+ long height = n.size.getFixpY() + Photonics.lambdaToFixp(BASEHEIGHT);
+ PLayer[] ol = Photonics.getOpticalLayers(true);
+ double spacing = Photonics.photonicsWaveguide.getWidth() + 1;
+ double aShift = DEFAULTANGLESHIFT;
+ double hShift = DEFAULTHORIZSHIFT;
+ for(int i=0; i<ol.length; i++)
+ {
+ // the lower curve that splits off
+ long lowX = -width/2;
+ long highX = width/2;
+ long lowY = -height/2;
+ long highY = 0;
+ double lowAngle = -Math.PI/2;
+ double highAngle = Math.PI + Math.PI/2;
+ drawCurve(b, n, lowX, highX, lowY, highY, lowAngle, highAngle, ol[i]);
+
+ // the upper curve that starts here
+ lowX = -width/2 + Photonics.lambdaToFixp(hShift);
+ lowY = -height/2 + Photonics.lambdaToFixp(spacing);
+ highY = height/2;
+ lowAngle = -Math.PI/2 + aShift;
+ highAngle = Math.PI/2;
+ drawCurve(b, n, lowX, highX, lowY, highY, lowAngle, highAngle, ol[i]);
+ }
+ }
+
+ private void drawCurve(AbstractShapeBuilder b, ImmutableNodeInst n, long lowX, long highX, long lowY, long highY,
+ double lowAngle, double highAngle, PLayer pl)
+ {
+ long channelWidth = Photonics.lambdaToFixp(pl.getWidth());
+ b.setCurNode(n);
+ for(int i=0; i<=Photonics.CURVESTEPS; i++)
+ {
+ double angle = lowAngle + (highAngle-lowAngle) / Photonics.CURVESTEPS * i;
+ double sinVal = (Math.sin(angle)+1)/2;
+ double x = lowX + (highX-lowX) / Photonics.CURVESTEPS * i;
+ double y = lowY + (highY-lowY) * sinVal-channelWidth/2;
+ b.pushPoint(x, y);
+ }
+ for(int i=Photonics.CURVESTEPS; i>=0; i--)
+ {
+ double angle = lowAngle + (highAngle-lowAngle) / Photonics.CURVESTEPS * i;
+ double sinVal = (Math.sin(angle)+1)/2;
+ double x = lowX + (highX-lowX) / Photonics.CURVESTEPS * i;
+ double y = lowY + (highY-lowY) * sinVal+channelWidth/2;
+ b.pushPoint(x, y);
+ }
+ b.pushPoly(Poly.Type.FILLED, pl.findLayer(), null, null);
+ }
+
+ /**
+ * Class that defines a primitive port on the Splitter device.
+ */
+ public class SplitterPort extends PrimitivePort
+ {
+ private final int portNumber;
+
+ SplitterPort(Splitter parent, String portName, int portAngle, int portNumber)
+ {
+ super(parent, new ArcProto[] {Photonics.opticalArc},
+ portName, false, portAngle, 0, 0, PortCharacteristic.UNKNOWN, false, false,
+ new EdgeH(0, 0), new EdgeV(0, 0), new EdgeH(0, 0), new EdgeV(0, 0));
+ this.portNumber = portNumber;
+ }
+
+ @Override
+ public void genShape(AbstractShapeBuilder b, ImmutableNodeInst n)
+ {
+ assert n.protoId == getParent().getId();
+ long width = n.size.getFixpX() + Photonics.lambdaToFixp(BASEWIDTH);
+ long height = n.size.getFixpY() + Photonics.lambdaToFixp(BASEHEIGHT);
+ b.setCurNode(n);
+ double x = 0, y = 0;
+ switch (portNumber)
+ {
+ case 1: // port in lower-left
+ x = -width/2; y = -height/2; break;
+ case 2: // port in lower-right
+ x = width/2; y = -height/2; break;
+ case 3: // port in upper-right
+ x = width/2; y = height/2; break;
+ }
+ b.pushPoint(x, y);
+ b.pushPoint(x, y);
+ b.pushPoint(x, y);
+ b.pushPoint(x, y);
+ b.pushPoly(Poly.Type.FILLED, null, null, null);
+ }
+ }
+}
\ No newline at end of file
diff --git a/com/sun/electric/technology/technologies/rcmos.xml b/com/sun/electric/technology/technologies/rcmos.xml
index 34d686f..37b030e 100644
--- a/com/sun/electric/technology/technologies/rcmos.xml
+++ b/com/sun/electric/technology/technologies/rcmos.xml
@@ -9,7 +9,7 @@
* Specified by: Dick Lyon, Carver Mead, and Erwin Liu
* Generated automatically from a library
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/technologies/schematicMenu.xml b/com/sun/electric/technology/technologies/schematicMenu.xml
index 71d1ade..339b1f9 100644
--- a/com/sun/electric/technology/technologies/schematicMenu.xml
+++ b/com/sun/electric/technology/technologies/schematicMenu.xml
@@ -8,7 +8,7 @@
* schematic technology menu description
* Generated automatically from a library
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/technology/technologies/tft.xml b/com/sun/electric/technology/technologies/tft.xml
index e6bdc43..cfaab7f 100644
--- a/com/sun/electric/technology/technologies/tft.xml
+++ b/com/sun/electric/technology/technologies/tft.xml
@@ -8,7 +8,7 @@
* tft technology description
* Generated automatically from a library
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -507,7 +507,7 @@
</primitivePort>
<primitivePort name="cap-met2-left">
<portAngle primary="0" range="180"/>
- <portTopology>0</portTopology>
+ <portTopology>1</portTopology>
<box khx="-1.0" kly="0.0" khy="0.0">
<lambdaBox klx="-2.5" khx="-2.5" kly="0.0" khy="0.0"/>
</box>
@@ -515,7 +515,7 @@
</primitivePort>
<primitivePort name="cap-met2-right">
<portAngle primary="0" range="180"/>
- <portTopology>0</portTopology>
+ <portTopology>2</portTopology>
<box klx="1.0" kly="0.0" khy="0.0">
<lambdaBox klx="2.5" khx="2.5" kly="0.0" khy="0.0"/>
</box>
@@ -523,7 +523,7 @@
</primitivePort>
<primitivePort name="cap-met2-top">
<portAngle primary="0" range="180"/>
- <portTopology>0</portTopology>
+ <portTopology>3</portTopology>
<box klx="0.0" khx="0.0" kly="1.0">
<lambdaBox klx="0.0" khx="0.0" kly="2.5" khy="2.5"/>
</box>
diff --git a/com/sun/electric/tool/AbstractUserInterface.java b/com/sun/electric/tool/AbstractUserInterface.java
index 67fe3dd..2fc87bb 100644
--- a/com/sun/electric/tool/AbstractUserInterface.java
+++ b/com/sun/electric/tool/AbstractUserInterface.java
@@ -4,7 +4,7 @@
*
* File: UserInterfaceExtended.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/Client.java b/com/sun/electric/tool/Client.java
index bbd5367..1813640 100644
--- a/com/sun/electric/tool/Client.java
+++ b/com/sun/electric/tool/Client.java
@@ -4,7 +4,7 @@
*
* File: Client.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ClientJobManager.java b/com/sun/electric/tool/ClientJobManager.java
index edec155..a4e9d4f 100644
--- a/com/sun/electric/tool/ClientJobManager.java
+++ b/com/sun/electric/tool/ClientJobManager.java
@@ -4,7 +4,7 @@
*
* File: ClientJobManager.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/Consumer.java b/com/sun/electric/tool/Consumer.java
index b50a573..8df8ff2 100644
--- a/com/sun/electric/tool/Consumer.java
+++ b/com/sun/electric/tool/Consumer.java
@@ -4,7 +4,7 @@
*
* File: Consumer.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/DialogJob.java b/com/sun/electric/tool/DialogJob.java
index 77971a4..bca409e 100644
--- a/com/sun/electric/tool/DialogJob.java
+++ b/com/sun/electric/tool/DialogJob.java
@@ -4,7 +4,7 @@
*
* File: DialogJob.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/EJob.java b/com/sun/electric/tool/EJob.java
index caef588..9abe412 100644
--- a/com/sun/electric/tool/EJob.java
+++ b/com/sun/electric/tool/EJob.java
@@ -4,7 +4,7 @@
*
* File: EJob.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/EThread.java b/com/sun/electric/tool/EThread.java
index 8d3f07f..65bf0f4 100644
--- a/com/sun/electric/tool/EThread.java
+++ b/com/sun/electric/tool/EThread.java
@@ -4,7 +4,7 @@
*
* File: EThread.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/Job.java b/com/sun/electric/tool/Job.java
index 31ebbda..acc3ad5 100644
--- a/com/sun/electric/tool/Job.java
+++ b/com/sun/electric/tool/Job.java
@@ -4,7 +4,7 @@
*
* File: Job.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -511,7 +511,7 @@ public abstract class Job implements Serializable {
* retrieve abort status from another class, use checkAbort which also
* checks if job is scheduled to be aborted.
*
- * @return
+ * @return abort status.
*/
private synchronized boolean getAborted() {
return aborted;
diff --git a/com/sun/electric/tool/JobException.java b/com/sun/electric/tool/JobException.java
index f5ea915..18e7afd 100644
--- a/com/sun/electric/tool/JobException.java
+++ b/com/sun/electric/tool/JobException.java
@@ -4,7 +4,7 @@
*
* File: JobException.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/Listener.java b/com/sun/electric/tool/Listener.java
index 5284ba0..adfc275 100644
--- a/com/sun/electric/tool/Listener.java
+++ b/com/sun/electric/tool/Listener.java
@@ -4,7 +4,7 @@
*
* File: Listener.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/MultiTaskJob.java b/com/sun/electric/tool/MultiTaskJob.java
index ed18e18..bdee9c4 100644
--- a/com/sun/electric/tool/MultiTaskJob.java
+++ b/com/sun/electric/tool/MultiTaskJob.java
@@ -4,7 +4,7 @@
*
* File: MultiTaskJob.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/Regression.java b/com/sun/electric/tool/Regression.java
index 41a2ea6..02d29cf 100644
--- a/com/sun/electric/tool/Regression.java
+++ b/com/sun/electric/tool/Regression.java
@@ -4,7 +4,7 @@
*
* File: Regression.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ServerJobManager.java b/com/sun/electric/tool/ServerJobManager.java
index 027d26c..3cab45a 100644
--- a/com/sun/electric/tool/ServerJobManager.java
+++ b/com/sun/electric/tool/ServerJobManager.java
@@ -4,7 +4,7 @@
*
* File: ServerJobManager.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/StandAlone.java b/com/sun/electric/tool/StandAlone.java
index 5674da1..4140774 100644
--- a/com/sun/electric/tool/StandAlone.java
+++ b/com/sun/electric/tool/StandAlone.java
@@ -4,7 +4,7 @@
*
* File: StandAlone.java
*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/StreamClient.java b/com/sun/electric/tool/StreamClient.java
index fdff1e7..9e3d20e 100644
--- a/com/sun/electric/tool/StreamClient.java
+++ b/com/sun/electric/tool/StreamClient.java
@@ -4,7 +4,7 @@
*
* File: StreamClient.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/SwingExamineTask.java b/com/sun/electric/tool/SwingExamineTask.java
index 565b53f..fd0dabe 100644
--- a/com/sun/electric/tool/SwingExamineTask.java
+++ b/com/sun/electric/tool/SwingExamineTask.java
@@ -4,7 +4,7 @@
*
* File: SwingExamineTask.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/Tool.java b/com/sun/electric/tool/Tool.java
index 33d28bf..486ba8b 100644
--- a/com/sun/electric/tool/Tool.java
+++ b/com/sun/electric/tool/Tool.java
@@ -4,7 +4,7 @@
*
* File: Tool.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ToolSettings.java b/com/sun/electric/tool/ToolSettings.java
index 2ad1c89..700094b 100644
--- a/com/sun/electric/tool/ToolSettings.java
+++ b/com/sun/electric/tool/ToolSettings.java
@@ -4,7 +4,7 @@
*
* File: ToolSettings.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -169,8 +169,18 @@ public class ToolSettings extends AbstractToolSettings {
*/
public static Setting getGDSInputScaleSetting() { return t.cacheGDSInputScale; }
/**
- * Method to set the scale to be applied when writing GDS.
- * @return the scale to be applied when writing GDS.
+ * Returns the scale to be applied when reading GDS.
+ * @return the scale to be applied when reading GDS.
+ */
+ public static Setting getGDSOutputPrecisionSetting() { return t.cacheGDSOutputPrecision; }
+ /**
+ * Returns the precision to use when writing GDS.
+ * @return the precision to use when writing GDS.
+ */
+ public static Setting getGDSOutputUnitsPerMeterSetting() { return t.cacheGDSOutputUnitsPerMeter; }
+ /**
+ * Returns the number of units per meter to use when writing GDS.
+ * @return the number of units per meter to use when writing GDS.
*/
public static Setting getGDSOutputScaleSetting() { return t.cacheGDSOutputScale; }
/**
@@ -300,7 +310,9 @@ public class ToolSettings extends AbstractToolSettings {
private final Setting cacheGDSOutputConvertsBracketsInExports = makeBooleanSetting("GDSOutputConvertsBracketsInExports", "GDS tab", "GDS output converts brackets in exports", true);
private final Setting cacheGDSCellNameLenMax = makeIntSetting("GDSCellNameLenMax", "GDS tab", "GDS name length limit", 32);
private final Setting cacheGDSInputScale = makeDoubleSetting("GDSInputScale", "GDS tab", "GDS input scale", 1.0);
- private final Setting cacheGDSOutputScale = makeDoubleSetting("GDSOutputScale", "GDS tab", "GDS output scale", 1.0);
+ private final Setting cacheGDSOutputPrecision = makeDoubleSetting("GDSOutputPrecision", "GDS tab", "GDS output precision", 1000.0);
+ private final Setting cacheGDSOutputUnitsPerMeter = makeDoubleSetting("GDSOutputUnitsPerMeter", "GDS tab", "GDS output units per meter", 1000000000.0);
+ private final Setting cacheGDSOutputScale = makeDoubleSetting("GDSOutputScale", "GDS tab", "GDS output scale", 1.0);
private final Setting cacheDXFScale = makeIntSetting("DXFScale", "DXF tab", "DXF scale factor", 2);
{ tool("logeffortTool", "tool/logicaleffort"); }
diff --git a/com/sun/electric/tool/UniversalJob.java b/com/sun/electric/tool/UniversalJob.java
index 056472f..ff824e4 100644
--- a/com/sun/electric/tool/UniversalJob.java
+++ b/com/sun/electric/tool/UniversalJob.java
@@ -4,7 +4,7 @@
*
* File: UniversalJob.java
*
- * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/UserInterfaceExec.java b/com/sun/electric/tool/UserInterfaceExec.java
index 97c8719..ffe6296 100644
--- a/com/sun/electric/tool/UserInterfaceExec.java
+++ b/com/sun/electric/tool/UserInterfaceExec.java
@@ -4,7 +4,7 @@
*
* File: UserInterfaceExec.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/UserInterfaceInitial.java b/com/sun/electric/tool/UserInterfaceInitial.java
index 12a377e..baaa894 100644
--- a/com/sun/electric/tool/UserInterfaceInitial.java
+++ b/com/sun/electric/tool/UserInterfaceInitial.java
@@ -4,7 +4,7 @@
*
* File: UserInterfaceInitial.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/WorkingThread.java b/com/sun/electric/tool/WorkingThread.java
index 17d63fb..c29ce2b 100644
--- a/com/sun/electric/tool/WorkingThread.java
+++ b/com/sun/electric/tool/WorkingThread.java
@@ -4,7 +4,7 @@
*
* File: WorkingThread.java
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/compaction/Compaction.java b/com/sun/electric/tool/compaction/Compaction.java
index 054b0de..9b9a859 100644
--- a/com/sun/electric/tool/compaction/Compaction.java
+++ b/com/sun/electric/tool/compaction/Compaction.java
@@ -4,9 +4,9 @@
*
* File: Compaction.java
* Originally written by: Nora Ryan, Schlumberger Palo Alto Research
- * Rewritten and translated by: Steven M. Rubin, Sun Microsystems.
+ * Rewritten and translated by: Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -84,11 +84,11 @@ public class Compaction extends Tool
*/
public void init() {}
- /**
- * Method to retrieve the singleton associated with the Compaction tool.
- * @return the Compaction tool.
- */
- public static Compaction getCompactionTool() { return tool; }
+ /**
+ * Method to retrieve the singleton associated with the Compaction tool.
+ * @return the Compaction tool.
+ */
+ public static Compaction getCompactionTool() { return tool; }
/****************************** COMPACTION CONTROL ******************************/
@@ -97,20 +97,20 @@ public class Compaction extends Tool
*/
public static void compactNow(Cell cell, boolean allowSpreading)
{
- compactNow(cell, allowSpreading, null);
+ compactNow(cell, allowSpreading, null);
}
/**
* Method to compact the requested cell.
- * @param cell cell to compact
- * @param allowSpreading true to spread layout
- * @param finalJob this Job will be started after compaction is complete
+ * @param cell cell to compact
+ * @param allowSpreading true to spread layout
+ * @param finalJob this Job will be started after compaction is complete
*/
public static void compactNow(Cell cell, boolean allowSpreading, Job finalJob)
{
// do the compaction in a job
CompactCellJob job = new CompactCellJob(cell, true, CompactCell.Axis.HORIZONTAL, allowSpreading, finalJob);
- job.startJobOnMyResult(); // start on my result. Otherwise regressions fail
+ job.startJobOnMyResult(); // start on my result. Otherwise regressions fail
}
private static int limitLoops = 10;
@@ -122,8 +122,8 @@ private static int limitLoops = 10;
private Cell cell;
private final boolean lastTime;
private CompactCell.Axis curAxis;
- private final boolean allowSpreading;
- private transient Job finalJob;
+ private final boolean allowSpreading;
+ private transient Job finalJob;
private CompactCellJob(Cell cell, boolean lastTime, CompactCell.Axis curAxis, boolean allowSpreading, Job finalJob)
{
@@ -131,8 +131,8 @@ private static int limitLoops = 10;
this.cell = cell;
this.lastTime = lastTime;
this.curAxis = curAxis;
- this.allowSpreading = allowSpreading;
- this.finalJob = finalJob;
+ this.allowSpreading = allowSpreading;
+ this.finalJob = finalJob;
}
public boolean doIt() throws JobException
@@ -147,26 +147,28 @@ if (--limitLoops <= 0) change = false;
{
curAxis = (curAxis == CompactCell.Axis.HORIZONTAL) ? CompactCell.Axis.VERTICAL : CompactCell.Axis.HORIZONTAL;
CompactCellJob job = new CompactCellJob(cell, change, curAxis, allowSpreading, finalJob);
- job.startJobOnMyResult();
+ job.startJobOnMyResult();
} else
{
System.out.println("Compaction complete");
- if (finalJob != null)
- finalJob.startJobOnMyResult();
+ if (finalJob != null)
+ finalJob.startJobOnMyResult();
}
return true;
}
}
- public static void compactHorizontally(Cell cell) {
- CompactCell cc = new CompactCell(cell, false);
- cc.compactOneDirection(CompactCell.Axis.HORIZONTAL);
- }
+ public static void compactHorizontally(Cell cell)
+ {
+ CompactCell cc = new CompactCell(cell, false);
+ cc.compactOneDirection(CompactCell.Axis.HORIZONTAL);
+ }
- public static void compactVertically(Cell cell) {
- CompactCell cc = new CompactCell(cell, false);
- cc.compactOneDirection(CompactCell.Axis.VERTICAL);
- }
+ public static void compactVertically(Cell cell)
+ {
+ CompactCell cc = new CompactCell(cell, false);
+ cc.compactOneDirection(CompactCell.Axis.VERTICAL);
+ }
/****************************** OPTIONS ******************************/
@@ -230,12 +232,12 @@ if (--limitLoops <= 0) change = false;
/** counter for unique network numbers */ private int flatIndex;
/** current axis of compaction */ private Axis curAxis;
/** cell being compacted */ private Cell cell;
- /** true if spreading is allowed */ private boolean spread;
+ /** true if spreading is allowed */ private boolean spread;
private CompactCell(Cell cell, boolean spread)
{
this.cell = cell;
- this.spread = spread;
+ this.spread = spread;
}
/**
@@ -350,21 +352,6 @@ if (--limitLoops <= 0) change = false;
private boolean compactLine(Line line, Line lineStretch, boolean change, Cell cell)
{
-// System.out.println("Compacting line:");
-// for (Line curLine = line; curLine != null; curLine = curLine.nextLine) {
-// System.out.print("\t");
-// for (GeomObj obj = curLine.firstObject; obj != null; obj = obj.nextObject)
-// System.out.print(" " + obj.inst);
-// System.out.println();
-// }
-// System.out.println("Stretch line:");
-// for (Line curLine = lineStretch; curLine != null; curLine = curLine.nextLine) {
-// System.out.print("\t");
-// for (GeomObj obj = curLine.firstObject; obj != null; obj = obj.nextObject)
-// System.out.print(" " + obj.inst);
-// System.out.println();
-// }
-
// loop through all lines that may compact
for(Line curLine = line.nextLine; curLine != null; curLine = curLine.nextLine)
{
@@ -448,16 +435,16 @@ if (--limitLoops <= 0) change = false;
int nIndex = nPolys.networkNum;
// see how far around the box it is necessary to search
- MutableDouble mutableDist = new MutableDouble(0);
- boolean found = DRC.getMaxSurround(nLayer, Double.MAX_VALUE, mutableDist);
+ MutableDouble mutableDist = new MutableDouble(0);
+ boolean found = DRC.getMaxSurround(nLayer, Double.MAX_VALUE, mutableDist);
// if there is no separation, allow them to sit on top of each other
if (!found) return DEFAULT_VAL;
// can only handle orthogonal rectangles for now
Rectangle2D nbox = nPoly.getBox();
- double bound = mutableDist.doubleValue();
- if (nbox == null) return bound;
+ double bound = mutableDist.doubleValue();
+ if (nbox == null) return bound;
double bestMotion = DEFAULT_VAL;
double geomLow = object.lowy;
@@ -980,18 +967,7 @@ if (--limitLoops <= 0) change = false;
newObject.highy = newObject.outerHighy;
} else
{
- Rectangle2D bound = ni.getBaseShape().getBounds2D();
-// double cX = ni.getTrueCenterX();
-// double cY = ni.getTrueCenterY();
-// double sX = ni.getXSize();
-// double sY = ni.getYSize();
-// SizeOffset so = ni.getSizeOffset();
-// double lX = cX - sX/2 + so.getLowXOffset();
-// double hX = cX + sX/2 - so.getHighXOffset();
-// double lY = cY - sY/2 + so.getLowYOffset();
-// double hY = cY + sY/2 - so.getHighYOffset();
-// Rectangle2D bound = new Rectangle2D.Double(lX, lY, hX-lX, hY-lY);
-// GenMath.transformRect(bound, ni.rotateOut());
+ Rectangle2D bound = ni.getBaseShape().getBounds2D();
newObject.lowx = bound.getMinX();
newObject.highx = bound.getMaxX();
newObject.lowy = bound.getMinY();
@@ -1161,7 +1137,7 @@ if (--limitLoops <= 0) change = false;
newObject.inst = ai;
newObject.nextObject = null;
newObject.firstPolyList = null;
- Poly poly = ai.makeLambdaPoly(ai.getGridBaseWidth(), Poly.Type.CLOSED);
+ Poly poly = ai.makeLambdaPoly(ai.getGridBaseWidth(), Poly.Type.CLOSED);
Rectangle2D bounds = poly.getBounds2D();
newObject.lowx = bounds.getMinX();
newObject.highx = bounds.getMaxX();
diff --git a/com/sun/electric/tool/cvspm/AddRemove.java b/com/sun/electric/tool/cvspm/AddRemove.java
index fd45fcc..a5e4667 100644
--- a/com/sun/electric/tool/cvspm/AddRemove.java
+++ b/com/sun/electric/tool/cvspm/AddRemove.java
@@ -4,7 +4,7 @@
*
* File: AddRemove.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -354,10 +354,11 @@ public class AddRemove {
CVSLibrary.setState(cell, State.NONE);
}
}
+
/**
* Return true if succeeded, false otherwise
* @param FD
- * @return
+ * @return true if succeeded, false otherwise
*/
private boolean undo(File FD) {
if (FD.isDirectory()) return false;
diff --git a/com/sun/electric/tool/cvspm/CVS.java b/com/sun/electric/tool/cvspm/CVS.java
index 54e3b08..df429d9 100644
--- a/com/sun/electric/tool/cvspm/CVS.java
+++ b/com/sun/electric/tool/cvspm/CVS.java
@@ -4,7 +4,7 @@
*
* File: CVSMenu.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -469,7 +469,7 @@ public class CVS extends Listener {
* the first library found.
* @param libs
* @param cells
- * @return
+ * @return user directory.
*/
static String getUseDir(List<Library> libs, List<Cell> cells) {
if (libs != null) {
@@ -499,7 +499,7 @@ public class CVS extends Listener {
* 'files' argument to a CVS command. Any files in 'useDir' will
* be relative names, otherwise they will be absolute file names.
* @param libs
- * @return
+ * @return file names.
*/
static StringBuffer getLibraryFiles(List<Library> libs, String useDir) {
StringBuffer libsBuf = new StringBuffer();
@@ -522,7 +522,7 @@ public class CVS extends Listener {
* @param libs
* @param cells
* @param useDir
- * @return
+ * @return header files
*/
static StringBuffer getHeaderFilesForCommit(List<Library> libs, List<Cell> cells, String useDir) {
if (libs == null) libs = new ArrayList<Library>();
@@ -547,7 +547,7 @@ public class CVS extends Listener {
* 'files' argument to a CVS command. Any files in 'useDir' will
* be relative names, otherwise they will be absolute file names.
* @param cells
- * @return
+ * @return file names
*/
static StringBuffer getCellFiles(List<Cell> cells, String useDir) {
StringBuffer cellsBuf = new StringBuffer();
@@ -568,7 +568,7 @@ public class CVS extends Listener {
* not of the correct format, if the library cannot be found, or
* if the cell cannot be found.
* @param path
- * @return
+ * @return named Cell.
*/
static Cell getCellFromPath(String path) {
int delibExt = path.toLowerCase().indexOf(".delib"+File.separator);
@@ -605,7 +605,7 @@ public class CVS extends Listener {
* Returns null if not of the correct format,
* or if the library cannot be found.
* @param headerPath
- * @return
+ * @return Library object.
*/
static Library getLibraryFromHeader(String headerPath) {
int delibExt = headerPath.toLowerCase().indexOf(".delib"+File.separator);
@@ -677,7 +677,7 @@ public class CVS extends Listener {
/**
* Get the repository. In the future, there may be some
* dialog to let the user choose between multiple respositories.
- * @return
+ * @return repository path.
*/
static String getRepository() {
return getCVSRepository();
diff --git a/com/sun/electric/tool/cvspm/CVSLibrary.java b/com/sun/electric/tool/cvspm/CVSLibrary.java
index 27f9224..a44d427 100644
--- a/com/sun/electric/tool/cvspm/CVSLibrary.java
+++ b/com/sun/electric/tool/cvspm/CVSLibrary.java
@@ -4,7 +4,7 @@
*
* File: CVSLibrary.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/cvspm/Commit.java b/com/sun/electric/tool/cvspm/Commit.java
index 4af34d8..90a3109 100644
--- a/com/sun/electric/tool/cvspm/Commit.java
+++ b/com/sun/electric/tool/cvspm/Commit.java
@@ -4,7 +4,7 @@
*
* File: Commit.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/cvspm/Edit.java b/com/sun/electric/tool/cvspm/Edit.java
index bc848cd..7796ac4 100644
--- a/com/sun/electric/tool/cvspm/Edit.java
+++ b/com/sun/electric/tool/cvspm/Edit.java
@@ -4,7 +4,7 @@
*
* File: Edit.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -564,7 +564,7 @@ public class Edit {
* See if the specified Editor is referring to me on this host,
* returns true if so, false otherwise.
* @param editor
- * @return
+ * @return true if so.
*/
static boolean isMe(Editor editor) {
if (editor.getUser().equals(getUserName()) && editor.getHostname().equals(getHostName()))
diff --git a/com/sun/electric/tool/cvspm/Log.java b/com/sun/electric/tool/cvspm/Log.java
index 5c6d119..85742b8 100644
--- a/com/sun/electric/tool/cvspm/Log.java
+++ b/com/sun/electric/tool/cvspm/Log.java
@@ -4,7 +4,7 @@
*
* File: Log.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/cvspm/ModalCommandDialog.java b/com/sun/electric/tool/cvspm/ModalCommandDialog.java
index b6fb4eb..5a25c93 100644
--- a/com/sun/electric/tool/cvspm/ModalCommandDialog.java
+++ b/com/sun/electric/tool/cvspm/ModalCommandDialog.java
@@ -4,7 +4,7 @@
*
* File: ModalCommandDialog.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/cvspm/State.java b/com/sun/electric/tool/cvspm/State.java
index cb75bd7..738f588 100644
--- a/com/sun/electric/tool/cvspm/State.java
+++ b/com/sun/electric/tool/cvspm/State.java
@@ -4,7 +4,7 @@
*
* File: State.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/cvspm/Update.java b/com/sun/electric/tool/cvspm/Update.java
index 2dbb7fd..cbdfae1 100644
--- a/com/sun/electric/tool/cvspm/Update.java
+++ b/com/sun/electric/tool/cvspm/Update.java
@@ -4,7 +4,7 @@
*
* File: Update.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -416,7 +416,7 @@ public class Update {
* checks the status of the given files.
* Returns true if all files are up-to-date, false otherwise
* @param reader
- * @return
+ * @return true if files are up-to-date
*/
private static StatusResult parseOutput(LineNumberReader reader, int exitVal) {
StatusResult result = new StatusResult(exitVal);
diff --git a/com/sun/electric/tool/drc/AssuraDrcErrors.java b/com/sun/electric/tool/drc/AssuraDrcErrors.java
index f50eeff..2683f95 100644
--- a/com/sun/electric/tool/drc/AssuraDrcErrors.java
+++ b/com/sun/electric/tool/drc/AssuraDrcErrors.java
@@ -4,7 +4,7 @@
*
* File: AssuraDrcErrors.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/drc/CalibreDrcErrors.java b/com/sun/electric/tool/drc/CalibreDrcErrors.java
index 12cd1fb..6c52f26 100644
--- a/com/sun/electric/tool/drc/CalibreDrcErrors.java
+++ b/com/sun/electric/tool/drc/CalibreDrcErrors.java
@@ -4,7 +4,7 @@
*
* File: CalibreDrcErrors.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/drc/DRC.java b/com/sun/electric/tool/drc/DRC.java
index 28342f8..976cda8 100644
--- a/com/sun/electric/tool/drc/DRC.java
+++ b/com/sun/electric/tool/drc/DRC.java
@@ -4,7 +4,7 @@
*
* File: DRC.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -784,7 +784,7 @@ public class DRC extends Listener
* @param tech
* @param reportInfo
* @param ni
- * @return
+ * @return Polys for the NodeInst.
*/
static Poly [] getShapeOfNodeBasedOnRules(Technology tech, ReportInfo reportInfo, NodeInst ni)
{
@@ -799,7 +799,7 @@ public class DRC extends Listener
* Method to retrieve only Polyss from an ArcInst associated with layers with rules.
* @param tech
* @param ai
- * @return
+ * @return Polys for the ArcInst.
*/
static Poly[] getShapeOfArcBasedOnRules(Technology tech, ArcInst ai)
{
diff --git a/com/sun/electric/tool/drc/MTDRCAreaTool.java b/com/sun/electric/tool/drc/MTDRCAreaTool.java
index 2f6b5b2..b1d0f8b 100644
--- a/com/sun/electric/tool/drc/MTDRCAreaTool.java
+++ b/com/sun/electric/tool/drc/MTDRCAreaTool.java
@@ -4,7 +4,7 @@
*
* File: Quick.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/drc/MTDRCLayoutTool.java b/com/sun/electric/tool/drc/MTDRCLayoutTool.java
index 34cfc48..32ba665 100644
--- a/com/sun/electric/tool/drc/MTDRCLayoutTool.java
+++ b/com/sun/electric/tool/drc/MTDRCLayoutTool.java
@@ -4,7 +4,7 @@
*
* File: Quick.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/drc/MTDRCTool.java b/com/sun/electric/tool/drc/MTDRCTool.java
index f456bb3..e329bf7 100644
--- a/com/sun/electric/tool/drc/MTDRCTool.java
+++ b/com/sun/electric/tool/drc/MTDRCTool.java
@@ -4,7 +4,7 @@
*
* File: Quick.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/drc/MinArea.java b/com/sun/electric/tool/drc/MinArea.java
index fa4e885..feef3bf 100644
--- a/com/sun/electric/tool/drc/MinArea.java
+++ b/com/sun/electric/tool/drc/MinArea.java
@@ -4,7 +4,7 @@
*
* File: MinArea.java
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/drc/Quick.java b/com/sun/electric/tool/drc/Quick.java
index 47626bb..5782609 100644
--- a/com/sun/electric/tool/drc/Quick.java
+++ b/com/sun/electric/tool/drc/Quick.java
@@ -4,7 +4,7 @@
*
* File: Quick.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -3040,7 +3040,7 @@ public class Quick
* Method to find intersection in ref from p1 by using a perpendicular line.
* Point must be contained in the line
* x = (b2-b1)*a/(a^2 -1)
- * @return
+ * @return intersection point.
*/
Point2D getIntersectionToPolygon(Point2D p3, Poly ref)
{
diff --git a/com/sun/electric/tool/drc/Schematic.java b/com/sun/electric/tool/drc/Schematic.java
index 9f6f0c6..5ecc345 100644
--- a/com/sun/electric/tool/drc/Schematic.java
+++ b/com/sun/electric/tool/drc/Schematic.java
@@ -4,7 +4,7 @@
*
* File: Schematic.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/erc/ERC.java b/com/sun/electric/tool/erc/ERC.java
index 1719e48..6abb9d7 100644
--- a/com/sun/electric/tool/erc/ERC.java
+++ b/com/sun/electric/tool/erc/ERC.java
@@ -4,7 +4,7 @@
*
* File: ERC.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/erc/ERCAntenna.java b/com/sun/electric/tool/erc/ERCAntenna.java
index cbdf9b4..af3abce 100644
--- a/com/sun/electric/tool/erc/ERCAntenna.java
+++ b/com/sun/electric/tool/erc/ERCAntenna.java
@@ -4,7 +4,7 @@
*
* File: ERCAntenna.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -83,6 +83,7 @@ public class ERCAntenna
private transient final TechPool techPool;
public Map<ArcProtoId,Double> antennaRatio = new HashMap<ArcProtoId,Double>();
+ public boolean disablePopups = false;
public AntennaPreferences(boolean factory, TechPool techPool)
{
@@ -291,6 +292,7 @@ public class ERCAntenna
{
System.out.println("FOUND " + errorCount + " ANTENNA ERRORS (took " + timer + ")");
}
+ if (antennaPrefs.disablePopups) errorLogger.disablePopups();
errorLogger.termLogging(true);
return errorCount;
}
@@ -462,7 +464,6 @@ public class ERCAntenna
private int followNode(NodeInst ni, PortProto pp, Layer lay, FixpTransform trans, Job job)
{
// presume that nothing was found
- int ret = ERCANTPATHNULL;
firstSpreadAntennaObj = new ArrayList<AntennaObject>();
NodeInst [] antstack = new NodeInst[200];
int depth = 0;
@@ -493,7 +494,7 @@ public class ERCAntenna
{
TransistorSize dim = thisni.getTransistorSize(VarContext.globalContext);
totalGateArea += dim.getDoubleLength() * dim.getDoubleWidth();
- ret = ERCANTPATHGATE;
+ return ERCANTPATHGATE;
}
// diffusion or bias port: stop tracing
@@ -539,7 +540,7 @@ public class ERCAntenna
for(int i=0; i<depth; i++)
antstack[i] = ao.hierstack[i];
}
- return ret;
+ return ERCANTPATHNULL;
}
/**
diff --git a/com/sun/electric/tool/erc/ERCWellCheck.java b/com/sun/electric/tool/erc/ERCWellCheck.java
index 32accd0..6ec60e4 100644
--- a/com/sun/electric/tool/erc/ERCWellCheck.java
+++ b/com/sun/electric/tool/erc/ERCWellCheck.java
@@ -4,7 +4,7 @@
*
* File: ERCWellCheck.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -22,6 +22,7 @@
package com.sun.electric.tool.erc;
import com.sun.electric.database.geometry.EPoint;
+import com.sun.electric.database.geometry.ERectangle;
import com.sun.electric.database.geometry.Poly;
import com.sun.electric.database.hierarchy.Cell;
import com.sun.electric.database.hierarchy.Export;
@@ -70,7 +71,7 @@ import com.sun.electric.tool.util.concurrent.patterns.PTask;
import com.sun.electric.tool.util.concurrent.runtime.Scheduler.UnknownSchedulerException;
import com.sun.electric.tool.util.concurrent.runtime.taskParallel.IThreadPool;
import com.sun.electric.tool.util.concurrent.runtime.taskParallel.ThreadPool;
-import com.sun.electric.tool.util.concurrent.runtime.taskParallel.ThreadPoolScalaForkJoin;
+import com.sun.electric.tool.util.concurrent.runtime.taskParallel.ThreadPoolJdkForkJoin;
import com.sun.electric.tool.util.concurrent.utils.BlockedRange1D;
import com.sun.electric.util.CollectionFactory;
import com.sun.electric.util.ElapseTimer;
@@ -215,6 +216,9 @@ public class ERCWellCheck {
@BooleanPref(node = PREF_NODE, key = "FindWorstCaseWell", factory = false)
public boolean findWorstCaseWell;
+ /** true to prevent popups at the end of a run */
+ public boolean disablePopups = false;
+
public WellCheckPreferences(boolean factory) {
super(factory);
}
@@ -240,23 +244,6 @@ public class ERCWellCheck {
}
}
-// /**
-// * Method to analyze the current Cell for well errors.
-// */
-// @Deprecated
-// public static void analyzeCurCell(GeometryHandler.GHMode newAlgorithm) {
-// UserInterface ui = Job.getUserInterface();
-// Cell curCell = ui.needCurrentCell();
-// if (curCell == null) return;
-//
-// View view = curCell.getView();
-// if (view.isTextView() || view == View.SCHEMATIC || view == View.ICON) {
-// System.out.println("Sorry, Well checking runs only on layout cells");
-// return;
-// }
-// new WellCheckJob(curCell, newAlgorithm, new WellCheckPreferences(false));
-// }
-
public static void analyzeCurCell() {
UserInterface ui = Job.getUserInterface();
Cell curCell = ui.needCurrentCell();
@@ -271,32 +258,11 @@ public class ERCWellCheck {
new WellCheckJob(curCell, new WellCheckPreferences(false));
}
-// /**
-// * Method used by the regressions.
-// * @param cell the Cell to well-check.
-// * @param newAlgorithm the geometry algorithm to use.
-// * @return the success of running well-check.
-// */
-// @Deprecated
-// public static int checkERCWell(Cell cell, GeometryHandler.GHMode newAlgorithm, WellCheckPreferences wellPrefs) {
-// ERCWellCheck check = new ERCWellCheck(cell, null, newAlgorithm, wellPrefs);
-// return check.runNow();
-// }
-
public static int checkERCWell(Cell cell, WellCheckPreferences wellPrefs) {
ERCWellCheck check = new ERCWellCheck(cell, null, wellPrefs);
return check.runNow();
}
-// @Deprecated
-// private ERCWellCheck(Cell cell, WellCheckJob job, GeometryHandler.GHMode newAlgorithm,
-// WellCheckPreferences wellPrefs) {
-// this.job = job;
-// this.cell = cell;
-// this.wellPrefs = wellPrefs;
-// this.transistors = new HashMap<Integer, List<Transistor>>();
-// }
-
private ERCWellCheck(Cell cell, WellCheckJob job, WellCheckPreferences wellPrefs) {
this.job = job;
this.cell = cell;
@@ -311,14 +277,6 @@ public class ERCWellCheck {
private EPoint worstNWellCon, worstNWellEdge;
private WellCheckPreferences wellPrefs;
-// @Deprecated
-// private WellCheckJob(Cell cell, GeometryHandler.GHMode newAlgorithm, WellCheckPreferences wellPrefs) {
-// super("ERC Well Check on " + cell, ERC.tool, Job.Type.SERVER_EXAMINE, null, null, Job.Priority.USER);
-// this.cell = cell;
-// this.wellPrefs = wellPrefs;
-// startJob();
-// }
-
private WellCheckJob(Cell cell, WellCheckPreferences wellPrefs) {
super("ERC Well Check on " + cell, ERC.tool, Job.Type.SERVER_EXAMINE, null, null,
Job.Priority.USER);
@@ -408,7 +366,6 @@ public class ERCWellCheck {
}
}
}
- // int errorCount = doOldWay();
int errorCount = doNewWay();
showStatistics();
@@ -417,8 +374,8 @@ public class ERCWellCheck {
if (errorCount == 0) {
System.out.println("No Well errors found (took " + timer + ")");
} else {
- if (Job.getDebug())
- this.errorLogger.exportErrorLogger(cell.getName()+"logger.xml");
+// if (Job.getDebug())
+// this.errorLogger.exportErrorLogger(cell.getName()+"logger.xml");
System.out.println("FOUND " + errorCount + " WELL ERRORS (took " + timer + ")");
}
@@ -455,13 +412,12 @@ public class ERCWellCheck {
for (WellCon wc: wellCons) {
assert wc.getWellNum() != null;
RTNode<WellBound> topSearch = Utils.canBeSubstrateTap(wc.getFun()) ? pWellRoot: nWellRoot;
- Rectangle2D searchArea = new Rectangle2D.Double(wc.getCtr().getX(), wc.getCtr().getY(), 0, 0);
+ Rectangle2D searchArea = new Rectangle2D.Double(wc.getBound().getCenterX(), wc.getBound().getCenterY(), 0, 0);
for (Iterator<WellBound> it = new RTNode.Search<WellBound>(searchArea, topSearch, true); it.hasNext(); ) {
WellBound wb = it.next();
cons++;
if (wc.getWellNum().getIndex() != wb.netID.getIndex()) {
badCons++;
-// System.out.println("??????? checkSpreadResults wc=" + wc.getCtr() + " " + wc.getWellNum().getIndex() + " wb=" + wb.bound + " " + wb.netID.getIndex());
}
}
}
@@ -483,7 +439,6 @@ public class ERCWellCheck {
pairs++;
if (wb.netID.getIndex() != wb2.netID.getIndex()) {
badPairs++;
-// System.out.println("??????? checkSpreadResults wb=" + wb.bound + " " + wb.netID.getIndex() + " wb2=" + wb2.bound + " " + wb2.netID.getIndex());
}
}
}
@@ -499,7 +454,7 @@ public class ERCWellCheck {
break;
// see if this contact is a marked well
- Rectangle2D searchArea = new Rectangle2D.Double(wc.getCtr().getX(), wc.getCtr().getY(), 0, 0);
+ Rectangle2D searchArea = new Rectangle2D.Double(wc.getBound().getCenterX(), wc.getBound().getCenterY(), 0, 0);
RTNode<WellBound> topSearch = nWellRoot;
if (Utils.canBeSubstrateTap(wc.getFun()))
topSearch = pWellRoot;
@@ -523,12 +478,12 @@ public class ERCWellCheck {
String errorMsg = "N-Well contact is floating";
if (Utils.canBeSubstrateTap(wc.getFun()))
errorMsg = "P-Well contact is floating";
- errorLogger.logError(errorMsg, EPoint.fromLambda(wc.getCtr().getX(), wc.getCtr().getY()), cell, 0);
+ errorLogger.logError(errorMsg, EPoint.fromLambda(wc.getBound().getCenterX(), wc.getBound().getCenterY()), cell, 0);
continue;
}
// spread out through the well area
- Utils.spreadWellSeed(wc.getCtr().getX(), wc.getCtr().getY(), wc.getWellNum(), topSearch,
+ Utils.spreadWellSeed(wc.getBound().getCenterX(), wc.getBound().getCenterY(), wc.getWellNum(), topSearch,
threadIndex);
}
}
@@ -682,11 +637,10 @@ public class ERCWellCheck {
{
IThreadPool.NUM_THREADS = Integer.valueOf(numberOfThreads);
try {
- threadPool = SCALA_FORKJOIN ? ThreadPoolScalaForkJoin.initialize(numberOfThreads) : ThreadPool.initialize();
+ threadPool = SCALA_FORKJOIN ? ThreadPoolJdkForkJoin.initialize(numberOfThreads) : ThreadPool.initialize();
} catch (PoolExistsException e) {
} catch (UnknownSchedulerException e) {
}
- // threadPool = Configuration.lookup(IThreadPool.class);
timer.start();
@@ -747,7 +701,6 @@ public class ERCWellCheck {
// create analysis steps
List<WellCheckAnalysisStrategy> analysisParts = CollectionFactory.createArrayList();
analysisParts.add(new ShortCircuitCheck(parameter));
- // TODO: this analysis can get into an infinite loop in OnRailCheck.createTransistorRec()
analysisParts.add(new OnRailCheck(parameter, networkExportAvailable, transistors));
analysisParts.add(new ConnectionCheck(parameter, hasPCon, hasNCon, pWellRoot, nWellRoot, connectedNetValues));
analysisParts.add(new DRCCheck(parameter, pWellLayer, nWellLayer, pWellRoot, nWellRoot));
@@ -762,6 +715,7 @@ public class ERCWellCheck {
timer.end();
System.out.println(" Additional analysis took " + timer);
+ if (wellPrefs.disablePopups) errorLogger.disablePopups();
errorLogger.termLogging(true);
int errorCount = errorLogger.getNumErrors();
@@ -792,7 +746,7 @@ public class ERCWellCheck {
if (ind++ % numTasks != taskIndex) continue;
assert wc.getWellNum() == null;
RTNode<WellBound> topSearch = Utils.canBeSubstrateTap(wc.getFun()) ? pWellRoot: nWellRoot;
- Rectangle2D searchArea = new Rectangle2D.Double(wc.getCtr().getX(), wc.getCtr().getY(), 0, 0);
+ Rectangle2D searchArea = new Rectangle2D.Double(wc.getBound().getCenterX(), wc.getBound().getCenterY(), 0, 0);
for (Iterator<WellBound> it = new RTNode.Search<WellBound>(searchArea, topSearch, true); it.hasNext(); ) {
WellBound wb = it.next();
result.conBound.put(wc, wb);
@@ -801,7 +755,7 @@ public class ERCWellCheck {
String errorMsg = "N-Well contact is floating";
if (Utils.canBeSubstrateTap(wc.getFun()))
errorMsg = "P-Well contact is floating";
- errorLogger.logError(errorMsg, EPoint.fromLambda(wc.getCtr().getX(), wc.getCtr().getY()), cell, 0);
+ errorLogger.logError(errorMsg, EPoint.fromLambda(wc.getBound().getCenterX(), wc.getBound().getCenterY()), cell, 0);
wc.setWellNum(new NetValues());
}
assert ind == wellCons.size();
@@ -833,8 +787,8 @@ public class ERCWellCheck {
}
/**
- * Init equivalence map.
- * @param size numeber of elements in equivalence map
+ * Initialize equivalence map.
+ * @param size number of elements in equivalence map
* @return integer array representing equivalence map consisting of disjoint elements.
*/
static int[] initMap(int size) {
@@ -917,15 +871,11 @@ public class ERCWellCheck {
return cell;
}
- // public ErrorLogger getErrorLogger() {
- // return errorLogger;
- // }
-
// Apply translation to place the bounding box of the well contact
// in the correct location on the top cell.
private Rectangle2D placedWellCon(WellCon wc) {
Rectangle2D orig = wc.getNi().getBounds();
- return new Rectangle2D.Double(wc.getCtr().getX() - orig.getWidth() / 2, wc.getCtr().getY()
+ return new Rectangle2D.Double(wc.getBound().getCenterX() - orig.getWidth() / 2, wc.getBound().getCenterY()
- orig.getHeight() / 2, orig.getWidth(), orig.getHeight());
}
@@ -939,9 +889,9 @@ public class ERCWellCheck {
if (w instanceof WellBound) {
list.add(((WellBound) w).getBounds());
} else if (w instanceof WellCon) {
- // calculate the correct location of WellCon bound with respect to
- // the top cell
- list.add(placedWellCon(((WellCon) w)));
+ // calculate the correct location of WellCon bound with respect to the top cell
+ WellCon wc = (WellCon)w;
+ list.add(wc.getBound());
}
}
errorLogger.logMessage(message, list, cell, 0, true);
@@ -972,14 +922,14 @@ public class ERCWellCheck {
for (WellCon wc : wellCons) {
double dist = 0;
if (i == 0)
- dist += wc.getCtr().distance(ctr);
+ dist += wc.getCenter().distance(ctr);
else {
for (int j = 0; j < i; j++)
- dist += wc.getCtr().distance(farPoints[j]);
+ dist += wc.getCenter().distance(farPoints[j]);
}
if (dist > farthest) {
farthest = dist;
- farPoints[i].setLocation(wc.getCtr());
+ farPoints[i].setLocation(wc.getCenter());
}
}
}
@@ -989,7 +939,7 @@ public class ERCWellCheck {
double minDist = Double.MAX_VALUE;
int threadNum = 0;
for (int j = 0; j < numberOfThreads; j++) {
- double dist = wc.getCtr().distance(farPoints[j]);
+ double dist = wc.getCenter().distance(farPoints[j]);
if (dist < minDist) {
minDist = dist;
threadNum = j;
@@ -1032,13 +982,6 @@ public class ERCWellCheck {
this.dim = dim;
}
- /*
- * (non-Javadoc)
- *
- * @see
- * com.sun.electric.tool.util.concurrent.patterns.PForJob.PForTask#execute
- * (com.sun.electric.tool.util.concurrent.patterns.PForJob.BlockedRange)
- */
@Override
public void execute() {
for (int i = range.start(); i < range.end(); i++) {
@@ -1054,8 +997,8 @@ public class ERCWellCheck {
private GridDim calculateBucket(WellCon con, double sizeX, double sizeY) {
GridDim result = new GridDim();
- result.xDim = (int) ((con.getCtr().getX() - cell.getBounds().getMinX()) / sizeX);
- result.yDim = (int) ((con.getCtr().getY() - cell.getBounds().getMinY()) / sizeY);
+ result.xDim = (int) ((con.getBound().getCenterX() - cell.getBounds().getMinX()) / sizeX);
+ result.yDim = (int) ((con.getBound().getCenterY() - cell.getBounds().getMinY()) / sizeY);
return result;
}
@@ -1304,10 +1247,10 @@ public class ERCWellCheck {
else
tmpNetNum = info.getNetID(net);
- WellCon wc = new WellCon(ni.getTrueCenter(), tmpNetNum, null, false, false, fun, ni);
- FixpTransform trans = ni.rotateOut();
- trans.transform(wc.getCtr(), wc.getCtr());
- info.getTransformToRoot().transform(wc.getCtr(), wc.getCtr());
+ ERectangle er = ni.getBounds();
+ Rectangle2D bounds = new Rectangle2D.Double(er.getMinX(), er.getMinY(), er.getWidth(), er.getHeight());
+ info.getTransformToRoot().transform(bounds, bounds);
+ WellCon wc = new WellCon(bounds, tmpNetNum, null, false, false, fun, ni);
if (net != null) {
// PWell: must be on ground or NWell: must be on power
diff --git a/com/sun/electric/tool/erc/wellcheck/ConnectionCheck.java b/com/sun/electric/tool/erc/wellcheck/ConnectionCheck.java
index ff3d864..bec192b 100644
--- a/com/sun/electric/tool/erc/wellcheck/ConnectionCheck.java
+++ b/com/sun/electric/tool/erc/wellcheck/ConnectionCheck.java
@@ -3,8 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ConnectionCheck.java
+ * Author: Felix Schmidt
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -25,12 +26,9 @@ import com.sun.electric.database.topology.RTNode;
import com.sun.electric.tool.erc.ERCWellCheck.StrategyParameter;
import com.sun.electric.tool.erc.ERCWellCheck.WellBound;
import com.sun.electric.tool.erc.ERCWellCheck.WellType;
+
import java.util.BitSet;
-/**
- * @author Felix Schmidt
- *
- */
public class ConnectionCheck implements WellCheckAnalysisStrategy {
private StrategyParameter parameter;
@@ -40,13 +38,6 @@ public class ConnectionCheck implements WellCheckAnalysisStrategy {
private RTNode<WellBound> nWellRoot;
private BitSet connectedNetValues;
- /**
- * @param parameter
- * @param hasPCon
- * @param hasNCon
- * @param pWellRoot
- * @param nWellRoot
- */
public ConnectionCheck(StrategyParameter parameter, boolean hasPCon, boolean hasNCon, RTNode<WellBound> pWellRoot,
RTNode<WellBound> nWellRoot, BitSet connectedNetValues) {
super();
@@ -58,12 +49,6 @@ public class ConnectionCheck implements WellCheckAnalysisStrategy {
this.connectedNetValues = connectedNetValues;
}
- /*
- * (non-Javadoc)
- *
- * @see
- * com.sun.electric.tool.erc.wellcheck.WellCheckAnalysisStrategy#execute()
- */
@Override
public void execute() {
if (parameter.getWellPrefs().pWellCheck != 2)
diff --git a/com/sun/electric/tool/erc/wellcheck/DRCCheck.java b/com/sun/electric/tool/erc/wellcheck/DRCCheck.java
index 983aa84..bce84e8 100644
--- a/com/sun/electric/tool/erc/wellcheck/DRCCheck.java
+++ b/com/sun/electric/tool/erc/wellcheck/DRCCheck.java
@@ -3,8 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: DRCCheck.java
+ * Author: Felix Schmidt
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -21,8 +22,6 @@
*/
package com.sun.electric.tool.erc.wellcheck;
-import java.awt.geom.Rectangle2D;
-
import com.sun.electric.database.geometry.PolyBase;
import com.sun.electric.database.text.TextUtils;
import com.sun.electric.database.topology.RTNode;
@@ -33,12 +32,9 @@ import com.sun.electric.tool.erc.ERCWellCheck.StrategyParameter;
import com.sun.electric.tool.erc.ERCWellCheck.WellBound;
import com.sun.electric.util.ElapseTimer;
+import java.awt.geom.Rectangle2D;
import java.util.Iterator;
-/**
- * @author Felix Schmidt
- *
- */
public class DRCCheck implements WellCheckAnalysisStrategy {
private Layer pWellLayer;
@@ -47,13 +43,6 @@ public class DRCCheck implements WellCheckAnalysisStrategy {
private RTNode<WellBound> nWellRoot;
private StrategyParameter parameters;
- /**
- * @param parameters
- * @param pWellLayer
- * @param nWellLayer
- * @param pWellRoot
- * @param nWellRoot
- */
public DRCCheck(StrategyParameter parameters, Layer pWellLayer, Layer nWellLayer, RTNode<WellBound> pWellRoot,
RTNode<WellBound> nWellRoot) {
super();
@@ -64,12 +53,6 @@ public class DRCCheck implements WellCheckAnalysisStrategy {
this.nWellRoot = nWellRoot;
}
- /*
- * (non-Javadoc)
- *
- * @see
- * com.sun.electric.tool.erc.wellcheck.WellCheckAnalysisStrategy#execute()
- */
public void execute() {
if (parameters.getWellPrefs().drcCheck) {
ElapseTimer timer = ElapseTimer.createInstance();
diff --git a/com/sun/electric/tool/erc/wellcheck/DistanceCheck.java b/com/sun/electric/tool/erc/wellcheck/DistanceCheck.java
index a391eb5..0d10e86 100644
--- a/com/sun/electric/tool/erc/wellcheck/DistanceCheck.java
+++ b/com/sun/electric/tool/erc/wellcheck/DistanceCheck.java
@@ -3,8 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: DistanceCheck.java
+ * Author: Felix Schmidt
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -21,21 +22,17 @@
*/
package com.sun.electric.tool.erc.wellcheck;
-import java.awt.geom.Point2D;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
-
import com.sun.electric.database.topology.RTNode;
import com.sun.electric.tool.erc.ERCWellCheck.StrategyParameter;
import com.sun.electric.tool.erc.ERCWellCheck.WellBound;
import com.sun.electric.tool.erc.ERCWellCheck.WellNet;
import com.sun.electric.util.ElapseTimer;
-/**
- * @author Felix Schmidt
- *
- */
+import java.awt.geom.Point2D;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
public class DistanceCheck implements WellCheckAnalysisStrategy {
private StrategyParameter parameter;
@@ -56,17 +53,6 @@ public class DistanceCheck implements WellCheckAnalysisStrategy {
private RTNode<WellBound> pWellRoot;
private RTNode<WellBound> nWellRoot;
- /**
- * @param parameter
- * @param worstPWellDist
- * @param worstPWellCon
- * @param worstPWellEdge
- * @param worstNWellDist
- * @param worstNWellCon
- * @param worstNWellEdge
- * @param pWellRoot
- * @param nWellRoot
- */
public DistanceCheck(StrategyParameter parameter, double worstPWellDist, Point2D worstPWellCon,
Point2D worstPWellEdge, double worstNWellDist, Point2D worstNWellCon, Point2D worstNWellEdge,
RTNode<WellBound> pWellRoot, RTNode<WellBound> nWellRoot) {
@@ -82,12 +68,6 @@ public class DistanceCheck implements WellCheckAnalysisStrategy {
this.nWellRoot = nWellRoot;
}
- /*
- * (non-Javadoc)
- *
- * @see
- * com.sun.electric.tool.erc.wellcheck.WellCheckAnalysisStrategy#execute()
- */
public void execute() {
if (parameter.getWellPrefs().findWorstCaseWell) {
ElapseTimer timer = ElapseTimer.createInstance().start();
@@ -121,10 +101,10 @@ public class DistanceCheck implements WellCheckAnalysisStrategy {
double closestDist = Double.MAX_VALUE;
Point2D closestCon = null;
for (WellCon wc : wn.getContactsOnNet()) {
- double dist = wc.getCtr().distance(pt);
+ double dist = wc.getCenter().distance(pt);
if (dist < closestDist) {
closestDist = dist;
- closestCon = wc.getCtr();
+ closestCon = wc.getCenter();
}
}
@@ -147,8 +127,7 @@ public class DistanceCheck implements WellCheckAnalysisStrategy {
}
}
timer.end();
- System.out.println(" Worst-case distance analysis took "
- + timer);
+ System.out.println(" Worst-case distance analysis took " + timer);
}
}
diff --git a/com/sun/electric/tool/erc/wellcheck/NetValues.java b/com/sun/electric/tool/erc/wellcheck/NetValues.java
index 26ec212..13dfb5c 100644
--- a/com/sun/electric/tool/erc/wellcheck/NetValues.java
+++ b/com/sun/electric/tool/erc/wellcheck/NetValues.java
@@ -3,8 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: NetValues.java
+ * Author: Felix Schmidt
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -21,10 +22,6 @@
*/
package com.sun.electric.tool.erc.wellcheck;
-/**
- * @author Felix Schmidt
- *
- */
public class NetValues {
private int index;
diff --git a/com/sun/electric/tool/erc/wellcheck/OnRailCheck.java b/com/sun/electric/tool/erc/wellcheck/OnRailCheck.java
index 2f672cf..0ef2f65 100644
--- a/com/sun/electric/tool/erc/wellcheck/OnRailCheck.java
+++ b/com/sun/electric/tool/erc/wellcheck/OnRailCheck.java
@@ -3,8 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: OnRailCheck.java
+ * Author: Felix Schmidt
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -21,33 +22,25 @@
*/
package com.sun.electric.tool.erc.wellcheck;
+import com.sun.electric.tool.Job;
+import com.sun.electric.tool.erc.ERCWellCheck.StrategyParameter;
+import com.sun.electric.tool.erc.ERCWellCheck.Transistor;
+import com.sun.electric.util.CollectionFactory;
+
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
-import com.sun.electric.tool.erc.ERCWellCheck.StrategyParameter;
-import com.sun.electric.tool.erc.ERCWellCheck.Transistor;
-import com.sun.electric.util.CollectionFactory;
-
-/**
- * @author Felix Schmidt
- *
- */
public class OnRailCheck implements WellCheckAnalysisStrategy {
private Set<Integer> networkExportAvailable;
private Set<Integer> networkWithExportCache;
private Map<Integer, List<Transistor>> transistors;
- private List<Transistor> alreadyHit;
+ private Set<Transistor> alreadyHit;
private StrategyParameter parameter;
- /**
- * @param parameter
- * @param networkExportAvailable
- * @param transistors
- */
public OnRailCheck(StrategyParameter parameter, Set<Integer> networkExportAvailable,
Map<Integer, List<Transistor>> transistors) {
super();
@@ -57,23 +50,16 @@ public class OnRailCheck implements WellCheckAnalysisStrategy {
this.parameter = parameter;
}
- /*
- * (non-Javadoc)
- *
- * @see
- * com.sun.electric.tool.erc.wellcheck.WellCheckAnalysisStrategy#execute()
- */
public void execute() {
- int cacheHits = 0;
- // System.out.println(wellCons.size());
+ int total = parameter.getWellCons().size();
+ int count = 0;
+ Job.getUserInterface().startProgressDialog("Checking rails on " + total + " well contacts", null);
for (WellCon wc : parameter.getWellCons()) {
-
if (!wc.isOnRail()) {
if (networkExportAvailable.contains(wc.getNetNum()))
wc.setOnRail(true);
else if (networkWithExportCache.contains(wc.getNetNum())) {
wc.setOnRail(true);
- cacheHits++;
} else {
Set<Integer> startPath = new HashSet<Integer>();
List<Transistor> startTrans = transistors.get(wc.getNetNum());
@@ -97,11 +83,14 @@ public class OnRailCheck implements WellCheckAnalysisStrategy {
}
}
}
+ count++;
+ if ((count%10) == 0) Job.getUserInterface().setProgressValue(count * 100 / total);
}
+ Job.getUserInterface().stopProgressDialog();
}
private boolean createTransistorChain(Set<Integer> path, Transistor node, boolean result) {
- alreadyHit = new LinkedList<Transistor>();
+ alreadyHit = new HashSet<Transistor>();
result |= createTransistorRec(path, node, result, node.getDrainNet().get());
if (!result)
@@ -112,7 +101,6 @@ public class OnRailCheck implements WellCheckAnalysisStrategy {
}
private boolean createTransistorRec(Set<Integer> path, Transistor node, boolean result, int num) {
-
List<Transistor> transis = new LinkedList<Transistor>();
transis.add(node);
alreadyHit.add(node);
diff --git a/com/sun/electric/tool/erc/wellcheck/ShortCircuitCheck.java b/com/sun/electric/tool/erc/wellcheck/ShortCircuitCheck.java
index e6614d9..78dedd7 100644
--- a/com/sun/electric/tool/erc/wellcheck/ShortCircuitCheck.java
+++ b/com/sun/electric/tool/erc/wellcheck/ShortCircuitCheck.java
@@ -3,8 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ShortCircuitCheck.java
+ * Written by: Felix Schmidt
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -21,47 +22,28 @@
*/
package com.sun.electric.tool.erc.wellcheck;
-import java.util.ArrayList;
+import com.sun.electric.tool.erc.ERCWellCheck.StrategyParameter;
+
import java.util.HashMap;
import java.util.HashSet;
-import java.util.List;
import java.util.Map;
import java.util.Set;
-import java.awt.geom.Rectangle2D;
-
-import com.sun.electric.database.geometry.EPoint;
-import com.sun.electric.database.geometry.ERectangle;
-import com.sun.electric.database.geometry.PolyBase;
-import com.sun.electric.tool.erc.ERCWellCheck.StrategyParameter;
-/**
- * @author Felix Schmidt
- *
- */
public class ShortCircuitCheck implements WellCheckAnalysisStrategy {
private StrategyParameter parameter;
- /**
- * @param parameter
- */
public ShortCircuitCheck(StrategyParameter parameter) {
super();
this.parameter = parameter;
}
- /*
- * (non-Javadoc)
- *
- * @see
- * com.sun.electric.tool.erc.wellcheck.WellCheckAnalysisStrategy#execute()
- */
public void execute() {
Map<Integer, WellCon> wellContacts = new HashMap<Integer, WellCon>();
Map<Integer, Set<Integer>> wellShorts = new HashMap<Integer, Set<Integer>>();
-
- System.out.println("Number of well contacts: " + parameter.getWellCons().size());
-
+
+ System.out.println("Checking short circuits in " + parameter.getWellCons().size() + " well contacts");
+
for (WellCon wc : parameter.getWellCons()) {
Integer wellIndex = new Integer(wc.getWellNum().getIndex());
WellCon other = wellContacts.get(wellIndex);
@@ -85,19 +67,13 @@ public class ShortCircuitCheck implements WellCheckAnalysisStrategy {
// give error if not seen before
if (!shortsInWC.contains(otherNetNum)) {
-// List<Object> list = new ArrayList<Object>();
-// list.add(new EPoint(wc.getCtr().getX(), wc.getCtr().getY()));
-// list.add(new EPoint(other.getCtr().getX(), other.getCtr().getY()));
parameter.logError("Short circuit between well contacts", wc, other);
-// parameter.getErrorLogger().logMessage("Short circuit between well contacts",
-// list, parameter.getCell(), 0, true);
shortsInWC.add(otherNetNum);
shortsInOther.add(wcNetNum);
}
}
}
}
-
}
}
diff --git a/com/sun/electric/tool/erc/wellcheck/Utils.java b/com/sun/electric/tool/erc/wellcheck/Utils.java
index de6b428..961a3d8 100644
--- a/com/sun/electric/tool/erc/wellcheck/Utils.java
+++ b/com/sun/electric/tool/erc/wellcheck/Utils.java
@@ -4,7 +4,7 @@
*
* File: Utils.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/erc/wellcheck/WellCheckAnalysisStrategy.java b/com/sun/electric/tool/erc/wellcheck/WellCheckAnalysisStrategy.java
index da74275..561a19c 100644
--- a/com/sun/electric/tool/erc/wellcheck/WellCheckAnalysisStrategy.java
+++ b/com/sun/electric/tool/erc/wellcheck/WellCheckAnalysisStrategy.java
@@ -3,8 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: WellCheckAnalysisStrategy.java
+ * Author: Felix Schmidt
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -21,10 +22,6 @@
*/
package com.sun.electric.tool.erc.wellcheck;
-/**
- * @author Felix Schmidt
- *
- */
public interface WellCheckAnalysisStrategy {
public void execute();
diff --git a/com/sun/electric/tool/erc/wellcheck/WellCon.java b/com/sun/electric/tool/erc/wellcheck/WellCon.java
index a0955a1..b9bc430 100644
--- a/com/sun/electric/tool/erc/wellcheck/WellCon.java
+++ b/com/sun/electric/tool/erc/wellcheck/WellCon.java
@@ -3,8 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: WellCon.java
+ * Author: Felix Schmidt
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -21,21 +22,19 @@
*/
package com.sun.electric.tool.erc.wellcheck;
-import java.awt.geom.Point2D;
-import java.util.Comparator;
-import java.util.concurrent.atomic.AtomicBoolean;
-
import com.sun.electric.database.topology.NodeInst;
import com.sun.electric.technology.PrimitiveNode;
import com.sun.electric.technology.PrimitiveNode.Function;
-/**
- * @author Felix Schmidt
- *
- */
+import java.awt.geom.Point2D;
+import java.awt.geom.Rectangle2D;
+import java.util.Comparator;
+import java.util.concurrent.atomic.AtomicBoolean;
+
public class WellCon {
- private Point2D ctr;
+ private Rectangle2D bound;
+ private Point2D center;
private int netNum;
private NetValues wellNum = null;
private boolean onProperRail;
@@ -44,19 +43,11 @@ public class WellCon {
private NodeInst ni;
private AtomicBoolean marked = new AtomicBoolean(false);
- /**
- * @param ctr
- * @param netNum
- * @param wellNum
- * @param onProperRail
- * @param onRail
- * @param fun
- * @param ni
- */
- public WellCon(Point2D ctr, int netNum, NetValues wellNum, boolean onProperRail, boolean onRail,
+ public WellCon(Rectangle2D bound, int netNum, NetValues wellNum, boolean onProperRail, boolean onRail,
Function fun, NodeInst ni) {
super();
- this.ctr = ctr;
+ this.bound = bound;
+ this.center = new Point2D.Double(bound.getCenterX(), bound.getCenterY());
this.netNum = netNum;
this.wellNum = wellNum;
this.onProperRail = onProperRail;
@@ -65,69 +56,29 @@ public class WellCon {
this.ni = ni;
}
- public Point2D getCtr() {
- return ctr;
- }
-
- public void setCtr(Point2D ctr) {
- this.ctr = ctr;
- }
-
- public int getNetNum() {
- return netNum;
- }
-
- public void setNetNum(int netNum) {
- this.netNum = netNum;
- }
-
- public NetValues getWellNum() {
- return wellNum;
- }
+ public Rectangle2D getBound() { return bound; }
- public void setWellNum(NetValues wellNum) {
- this.wellNum = wellNum;
- }
+ public Point2D getCenter() { return center; }
- public boolean isOnProperRail() {
- return onProperRail;
- }
+ public int getNetNum() { return netNum; }
- public void setOnProperRail(boolean onProperRail) {
- this.onProperRail = onProperRail;
- }
+ public NetValues getWellNum() { return wellNum; }
- public boolean isOnRail() {
- return onRail;
- }
+ public void setWellNum(NetValues wn) { wellNum = wn; }
- public void setOnRail(boolean onRail) {
- this.onRail = onRail;
- }
+ public boolean isOnProperRail() { return onProperRail; }
- public PrimitiveNode.Function getFun() {
- return fun;
- }
+ public void setOnProperRail(boolean opr) { onProperRail = opr; }
- public void setFun(PrimitiveNode.Function fun) {
- this.fun = fun;
- }
+ public boolean isOnRail() { return onRail; }
- public NodeInst getNi() {
- return ni;
- }
+ public void setOnRail(boolean or) { onRail = or; }
- public void setNi(NodeInst ni) {
- this.ni = ni;
- }
+ public PrimitiveNode.Function getFun() { return fun; }
- public void setMarked(AtomicBoolean marked) {
- this.marked = marked;
- }
+ public NodeInst getNi() { return ni; }
- public AtomicBoolean getMarked() {
- return marked;
- }
+ public AtomicBoolean getMarked() { return marked; }
public static class WellConComparator implements Comparator<WellCon> {
@@ -137,16 +88,9 @@ public class WellCon {
this.base = base;
}
- /*
- * (non-Javadoc)
- *
- * @see java.util.Comparator#compare(java.lang.Object,
- * java.lang.Object)
- */
public int compare(WellCon o1, WellCon o2) {
- Double o1Dist = o1.getCtr().distance(base.getCtr());
- Double o2Dist = o2.getCtr().distance(base.getCtr());
-
+ Double o1Dist = new Double(o1.getCenter().distance(base.getCenter()));
+ Double o2Dist = new Double(o2.getCenter().distance(base.getCenter()));
return Double.compare(o1Dist, o2Dist);
}
diff --git a/com/sun/electric/tool/extract/Connectivity.java b/com/sun/electric/tool/extract/Connectivity.java
index 668d70c..ea1e4be 100644
--- a/com/sun/electric/tool/extract/Connectivity.java
+++ b/com/sun/electric/tool/extract/Connectivity.java
@@ -4,9 +4,9 @@
*
* File: Connectivity.java
* Module to do node extraction (extract connectivity from a pure-layout cell)
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/extract/Extract.java b/com/sun/electric/tool/extract/Extract.java
index 0d48e19..c5c960d 100644
--- a/com/sun/electric/tool/extract/Extract.java
+++ b/com/sun/electric/tool/extract/Extract.java
@@ -4,7 +4,7 @@
*
* File: Extract.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/extract/ExtractedPBucket.java b/com/sun/electric/tool/extract/ExtractedPBucket.java
index 56f09a2..163e565 100644
--- a/com/sun/electric/tool/extract/ExtractedPBucket.java
+++ b/com/sun/electric/tool/extract/ExtractedPBucket.java
@@ -4,7 +4,7 @@
*
* File: ExtractedPBucket.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/extract/GeometryConnection.java b/com/sun/electric/tool/extract/GeometryConnection.java
index c53dd59..def99ba 100644
--- a/com/sun/electric/tool/extract/GeometryConnection.java
+++ b/com/sun/electric/tool/extract/GeometryConnection.java
@@ -4,7 +4,7 @@
*
* File: GeometryConnection.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/extract/GeometrySearch.java b/com/sun/electric/tool/extract/GeometrySearch.java
index a1147fb..b6994e3 100644
--- a/com/sun/electric/tool/extract/GeometrySearch.java
+++ b/com/sun/electric/tool/extract/GeometrySearch.java
@@ -4,7 +4,7 @@
*
* File: GeometrySearch.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/extract/LayerCoverageTool.java b/com/sun/electric/tool/extract/LayerCoverageTool.java
index 0a6ecdb..56c426f 100644
--- a/com/sun/electric/tool/extract/LayerCoverageTool.java
+++ b/com/sun/electric/tool/extract/LayerCoverageTool.java
@@ -4,7 +4,7 @@
*
* File: LayerCoverageTool.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/extract/NetPBucket.java b/com/sun/electric/tool/extract/NetPBucket.java
index b4295c2..2ab23eb 100644
--- a/com/sun/electric/tool/extract/NetPBucket.java
+++ b/com/sun/electric/tool/extract/NetPBucket.java
@@ -4,7 +4,7 @@
*
* File: NetPBucket.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/extract/ParasiticGenerator.java b/com/sun/electric/tool/extract/ParasiticGenerator.java
index 5af4511..1d124c3 100644
--- a/com/sun/electric/tool/extract/ParasiticGenerator.java
+++ b/com/sun/electric/tool/extract/ParasiticGenerator.java
@@ -4,7 +4,7 @@
*
* File: ParasiticGenerator.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/extract/ParasiticTool.java b/com/sun/electric/tool/extract/ParasiticTool.java
index b058088..c8a20b2 100644
--- a/com/sun/electric/tool/extract/ParasiticTool.java
+++ b/com/sun/electric/tool/extract/ParasiticTool.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ParasiticTool.java
- * Written by: Gilda Garreton, Sun Microsystems.
+ * Written by: Gilda Garreton.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/extract/RCPBucket.java b/com/sun/electric/tool/extract/RCPBucket.java
index abca9e1..0cc1cd2 100644
--- a/com/sun/electric/tool/extract/RCPBucket.java
+++ b/com/sun/electric/tool/extract/RCPBucket.java
@@ -4,7 +4,7 @@
*
* File: RCPBucket.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/extract/TransistorPBucket.java b/com/sun/electric/tool/extract/TransistorPBucket.java
index 7cf6f79..9561931 100644
--- a/com/sun/electric/tool/extract/TransistorPBucket.java
+++ b/com/sun/electric/tool/extract/TransistorPBucket.java
@@ -4,7 +4,7 @@
*
* File: TransistorPBucket.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/extract/TransistorSearch.java b/com/sun/electric/tool/extract/TransistorSearch.java
index 03ee30a..4e75009 100644
--- a/com/sun/electric/tool/extract/TransistorSearch.java
+++ b/com/sun/electric/tool/extract/TransistorSearch.java
@@ -4,7 +4,7 @@
*
* File: TransistorSearch.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/AcuteAngleFill.java b/com/sun/electric/tool/generator/AcuteAngleFill.java
index 6be3452..c6ed249 100644
--- a/com/sun/electric/tool/generator/AcuteAngleFill.java
+++ b/com/sun/electric/tool/generator/AcuteAngleFill.java
@@ -4,7 +4,7 @@
*
* File: AcuteAngleFill.java
*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/PadGenerator.java b/com/sun/electric/tool/generator/PadGenerator.java
index 877add0..756c3ed 100644
--- a/com/sun/electric/tool/generator/PadGenerator.java
+++ b/com/sun/electric/tool/generator/PadGenerator.java
@@ -4,7 +4,7 @@
*
* File: PadGenerator.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/ROMGenerator.java b/com/sun/electric/tool/generator/ROMGenerator.java
index 1347087..c7ec64f 100644
--- a/com/sun/electric/tool/generator/ROMGenerator.java
+++ b/com/sun/electric/tool/generator/ROMGenerator.java
@@ -6,7 +6,7 @@
* Written by: David Harris (David_Harris at hmc.edu)
* Based on code developed by Frank Lee <chlee at hmc.edu> and Jason Imada <jimada at hmc.edu>
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/cmosPLA/Decode.java b/com/sun/electric/tool/generator/cmosPLA/Decode.java
index 3aa4a4a..4c46e71 100644
--- a/com/sun/electric/tool/generator/cmosPLA/Decode.java
+++ b/com/sun/electric/tool/generator/cmosPLA/Decode.java
@@ -5,9 +5,9 @@
* File: Decode.java
* MOSIS CMOS PLA Generator.
* Originally written by Wallace Kroeker at the University of Calgary
- * Translated to Java by Steven Rubin, Sun Microsystems.
+ * Translated to Java by Steven Rubin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/cmosPLA/IO.java b/com/sun/electric/tool/generator/cmosPLA/IO.java
index f371340..3eeaddb 100644
--- a/com/sun/electric/tool/generator/cmosPLA/IO.java
+++ b/com/sun/electric/tool/generator/cmosPLA/IO.java
@@ -5,9 +5,9 @@
* File: IO.java
* MOSIS CMOS PLA Generator.
* Originally written by Wallace Kroeker at the University of Calgary
- * Translated to Java by Steven Rubin, Sun Microsystems.
+ * Translated to Java by Steven Rubin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/cmosPLA/NGrid.java b/com/sun/electric/tool/generator/cmosPLA/NGrid.java
index 0d06b07..1062c66 100644
--- a/com/sun/electric/tool/generator/cmosPLA/NGrid.java
+++ b/com/sun/electric/tool/generator/cmosPLA/NGrid.java
@@ -5,9 +5,9 @@
* File: NGrid.java
* MOSIS CMOS PLA Generator.
* Originally written by Wallace Kroeker at the University of Calgary
- * Translated to Java by Steven Rubin, Sun Microsystems.
+ * Translated to Java by Steven Rubin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/cmosPLA/PGrid.java b/com/sun/electric/tool/generator/cmosPLA/PGrid.java
index dfcb497..bbdef79 100644
--- a/com/sun/electric/tool/generator/cmosPLA/PGrid.java
+++ b/com/sun/electric/tool/generator/cmosPLA/PGrid.java
@@ -5,9 +5,9 @@
* File: PGrid.java
* MOSIS CMOS PLA Generator.
* Originally written by Wallace Kroeker at the University of Calgary
- * Translated to Java by Steven Rubin, Sun Microsystems.
+ * Translated to Java by Steven Rubin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/cmosPLA/PLA.java b/com/sun/electric/tool/generator/cmosPLA/PLA.java
index b46f817..80f8a9c 100644
--- a/com/sun/electric/tool/generator/cmosPLA/PLA.java
+++ b/com/sun/electric/tool/generator/cmosPLA/PLA.java
@@ -5,9 +5,9 @@
* File: PLA.java
* MOSIS CMOS PLA Generator.
* Originally written by Wallace Kroeker at the University of Calgary
- * Translated to Java by Steven Rubin, Sun Microsystems.
+ * Translated to Java by Steven Rubin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/AddFlagAnnotationJob.java b/com/sun/electric/tool/generator/flag/AddFlagAnnotationJob.java
index 4614273..25d4b15 100644
--- a/com/sun/electric/tool/generator/flag/AddFlagAnnotationJob.java
+++ b/com/sun/electric/tool/generator/flag/AddFlagAnnotationJob.java
@@ -4,7 +4,7 @@
*
* File: AddFlagAnnotationJob.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/ExportNamer.java b/com/sun/electric/tool/generator/flag/ExportNamer.java
index 390215e..3b06e91 100644
--- a/com/sun/electric/tool/generator/flag/ExportNamer.java
+++ b/com/sun/electric/tool/generator/flag/ExportNamer.java
@@ -4,7 +4,7 @@
*
* File: ExportNames.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/Flag.java b/com/sun/electric/tool/generator/flag/Flag.java
index f94eb8b..5cf4e0d 100644
--- a/com/sun/electric/tool/generator/flag/Flag.java
+++ b/com/sun/electric/tool/generator/flag/Flag.java
@@ -4,7 +4,7 @@
*
* File: Flag.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/FlagAnnotations.java b/com/sun/electric/tool/generator/flag/FlagAnnotations.java
index 2e59768..94affb5 100644
--- a/com/sun/electric/tool/generator/flag/FlagAnnotations.java
+++ b/com/sun/electric/tool/generator/flag/FlagAnnotations.java
@@ -4,7 +4,7 @@
*
* File: FlagAnnotations.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/FlagConfig.java b/com/sun/electric/tool/generator/flag/FlagConfig.java
index ebeca4c..b585d66 100644
--- a/com/sun/electric/tool/generator/flag/FlagConfig.java
+++ b/com/sun/electric/tool/generator/flag/FlagConfig.java
@@ -4,7 +4,7 @@
*
* File: FlagConfig.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/FlagConstructorData.java b/com/sun/electric/tool/generator/flag/FlagConstructorData.java
index 3b54100..13a446c 100644
--- a/com/sun/electric/tool/generator/flag/FlagConstructorData.java
+++ b/com/sun/electric/tool/generator/flag/FlagConstructorData.java
@@ -4,7 +4,7 @@
*
* File: FlagConstructorData.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/FlagDesign.java b/com/sun/electric/tool/generator/flag/FlagDesign.java
index 4694528..0acc0d0 100644
--- a/com/sun/electric/tool/generator/flag/FlagDesign.java
+++ b/com/sun/electric/tool/generator/flag/FlagDesign.java
@@ -4,7 +4,7 @@
*
* File: FlagDesign.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/FlagJob.java b/com/sun/electric/tool/generator/flag/FlagJob.java
index 00c34f6..e4f7bba 100644
--- a/com/sun/electric/tool/generator/flag/FlagJob.java
+++ b/com/sun/electric/tool/generator/flag/FlagJob.java
@@ -4,7 +4,7 @@
*
* File: FlagJob.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/FlagLibraryCheckerJob.java b/com/sun/electric/tool/generator/flag/FlagLibraryCheckerJob.java
index c9629a5..b17c1b3 100644
--- a/com/sun/electric/tool/generator/flag/FlagLibraryCheckerJob.java
+++ b/com/sun/electric/tool/generator/flag/FlagLibraryCheckerJob.java
@@ -4,7 +4,7 @@
*
* File: FlagLibraryGenerator.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/LayoutNetlist.java b/com/sun/electric/tool/generator/flag/LayoutNetlist.java
index 9728bfe..d46b081 100644
--- a/com/sun/electric/tool/generator/flag/LayoutNetlist.java
+++ b/com/sun/electric/tool/generator/flag/LayoutNetlist.java
@@ -4,7 +4,7 @@
*
* File: LayoutNetlist.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/LibraryChecker.java b/com/sun/electric/tool/generator/flag/LibraryChecker.java
index d206507..e44618e 100644
--- a/com/sun/electric/tool/generator/flag/LibraryChecker.java
+++ b/com/sun/electric/tool/generator/flag/LibraryChecker.java
@@ -4,7 +4,7 @@
*
* File: LibraryChecker.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/SchematicPosition.java b/com/sun/electric/tool/generator/flag/SchematicPosition.java
index 0b66c71..43e426c 100644
--- a/com/sun/electric/tool/generator/flag/SchematicPosition.java
+++ b/com/sun/electric/tool/generator/flag/SchematicPosition.java
@@ -4,7 +4,7 @@
*
* File: SchematicPosition.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/SchematicVisitor.java b/com/sun/electric/tool/generator/flag/SchematicVisitor.java
index 6b2f813..10b3eb9 100644
--- a/com/sun/electric/tool/generator/flag/SchematicVisitor.java
+++ b/com/sun/electric/tool/generator/flag/SchematicVisitor.java
@@ -4,7 +4,7 @@
*
* File: SchematicVisitor.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/TaskPrinter.java b/com/sun/electric/tool/generator/flag/TaskPrinter.java
index a9ebc8f..d264919 100644
--- a/com/sun/electric/tool/generator/flag/TaskPrinter.java
+++ b/com/sun/electric/tool/generator/flag/TaskPrinter.java
@@ -4,7 +4,7 @@
*
* File: TaskPrinter.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/Utils.java b/com/sun/electric/tool/generator/flag/Utils.java
index 2dbc1bc..5a222c7 100644
--- a/com/sun/electric/tool/generator/flag/Utils.java
+++ b/com/sun/electric/tool/generator/flag/Utils.java
@@ -4,7 +4,7 @@
*
* File: Utils.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/designs/Infinity2/Crosser.java b/com/sun/electric/tool/generator/flag/designs/Infinity2/Crosser.java
index ad7f2e0..1f38959 100644
--- a/com/sun/electric/tool/generator/flag/designs/Infinity2/Crosser.java
+++ b/com/sun/electric/tool/generator/flag/designs/Infinity2/Crosser.java
@@ -4,7 +4,7 @@
*
* File: Crosser.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/designs/Infinity2/Infinity2Config.java b/com/sun/electric/tool/generator/flag/designs/Infinity2/Infinity2Config.java
index b23eedc..010b989 100644
--- a/com/sun/electric/tool/generator/flag/designs/Infinity2/Infinity2Config.java
+++ b/com/sun/electric/tool/generator/flag/designs/Infinity2/Infinity2Config.java
@@ -4,7 +4,7 @@
*
* File: Infinity2Config.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/designs/Infinity2/InfinityA.java b/com/sun/electric/tool/generator/flag/designs/Infinity2/InfinityA.java
index 67f70f8..d2f9317 100644
--- a/com/sun/electric/tool/generator/flag/designs/Infinity2/InfinityA.java
+++ b/com/sun/electric/tool/generator/flag/designs/Infinity2/InfinityA.java
@@ -4,7 +4,7 @@
*
* File: InfinityA.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/designs/Infinity2/InfinityB.java b/com/sun/electric/tool/generator/flag/designs/Infinity2/InfinityB.java
index aa04b85..987968e 100644
--- a/com/sun/electric/tool/generator/flag/designs/Infinity2/InfinityB.java
+++ b/com/sun/electric/tool/generator/flag/designs/Infinity2/InfinityB.java
@@ -4,7 +4,7 @@
*
* File: InfinityB.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/designs/Infinity2/InfinityC.java b/com/sun/electric/tool/generator/flag/designs/Infinity2/InfinityC.java
index ca871ee..e75864b 100644
--- a/com/sun/electric/tool/generator/flag/designs/Infinity2/InfinityC.java
+++ b/com/sun/electric/tool/generator/flag/designs/Infinity2/InfinityC.java
@@ -4,7 +4,7 @@
*
* File: InfinityC.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/designs/Infinity2/InstFifoAll.java b/com/sun/electric/tool/generator/flag/designs/Infinity2/InstFifoAll.java
index e4842b1..0d1f463 100644
--- a/com/sun/electric/tool/generator/flag/designs/Infinity2/InstFifoAll.java
+++ b/com/sun/electric/tool/generator/flag/designs/Infinity2/InstFifoAll.java
@@ -4,7 +4,7 @@
*
* File: InstFifoAll.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/designs/Infinity2/Ring.java b/com/sun/electric/tool/generator/flag/designs/Infinity2/Ring.java
index f151d86..536c79e 100644
--- a/com/sun/electric/tool/generator/flag/designs/Infinity2/Ring.java
+++ b/com/sun/electric/tool/generator/flag/designs/Infinity2/Ring.java
@@ -4,7 +4,7 @@
*
* File: Ring.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/designs/Infinity2/Ring2.java b/com/sun/electric/tool/generator/flag/designs/Infinity2/Ring2.java
index cadef45..e43bda8 100644
--- a/com/sun/electric/tool/generator/flag/designs/Infinity2/Ring2.java
+++ b/com/sun/electric/tool/generator/flag/designs/Infinity2/Ring2.java
@@ -4,7 +4,7 @@
*
* File: Ring2.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/designs/Infinity2/RingH.java b/com/sun/electric/tool/generator/flag/designs/Infinity2/RingH.java
index c8da1aa..ea9643f 100644
--- a/com/sun/electric/tool/generator/flag/designs/Infinity2/RingH.java
+++ b/com/sun/electric/tool/generator/flag/designs/Infinity2/RingH.java
@@ -4,7 +4,7 @@
*
* File: RingH.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/designs/Infinity2/VddGndM3.java b/com/sun/electric/tool/generator/flag/designs/Infinity2/VddGndM3.java
index a28477f..1a9f1ff 100644
--- a/com/sun/electric/tool/generator/flag/designs/Infinity2/VddGndM3.java
+++ b/com/sun/electric/tool/generator/flag/designs/Infinity2/VddGndM3.java
@@ -4,7 +4,7 @@
*
* File: VddGndM3.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/hornFunnel2/BinaryTree.java b/com/sun/electric/tool/generator/flag/hornFunnel2/BinaryTree.java
index 1eae374..d1eb849 100644
--- a/com/sun/electric/tool/generator/flag/hornFunnel2/BinaryTree.java
+++ b/com/sun/electric/tool/generator/flag/hornFunnel2/BinaryTree.java
@@ -4,7 +4,7 @@
*
* File: BinaryTree.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/hornFunnel2/Node.java b/com/sun/electric/tool/generator/flag/hornFunnel2/Node.java
index 7e448a6..8cea8a4 100644
--- a/com/sun/electric/tool/generator/flag/hornFunnel2/Node.java
+++ b/com/sun/electric/tool/generator/flag/hornFunnel2/Node.java
@@ -4,7 +4,7 @@
*
* File: Node.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/hornFunnel2/SkewTree.java b/com/sun/electric/tool/generator/flag/hornFunnel2/SkewTree.java
index ba9270f..b00fe47 100644
--- a/com/sun/electric/tool/generator/flag/hornFunnel2/SkewTree.java
+++ b/com/sun/electric/tool/generator/flag/hornFunnel2/SkewTree.java
@@ -4,7 +4,7 @@
*
* File: SkeyTree.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/hornFunnel2/SkewTreeJob.java b/com/sun/electric/tool/generator/flag/hornFunnel2/SkewTreeJob.java
index abd129c..09fa91e 100644
--- a/com/sun/electric/tool/generator/flag/hornFunnel2/SkewTreeJob.java
+++ b/com/sun/electric/tool/generator/flag/hornFunnel2/SkewTreeJob.java
@@ -4,7 +4,7 @@
*
* File: SkeyTreeJob.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/router/BdRoute.java b/com/sun/electric/tool/generator/flag/router/BdRoute.java
index 7f86992..099eb86 100644
--- a/com/sun/electric/tool/generator/flag/router/BdRoute.java
+++ b/com/sun/electric/tool/generator/flag/router/BdRoute.java
@@ -4,7 +4,7 @@
*
* File: BdRouter.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/router/Blockage1D.java b/com/sun/electric/tool/generator/flag/router/Blockage1D.java
index a25c1c9..09120d5 100644
--- a/com/sun/electric/tool/generator/flag/router/Blockage1D.java
+++ b/com/sun/electric/tool/generator/flag/router/Blockage1D.java
@@ -4,7 +4,7 @@
*
* File: Blockage1D.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/router/Channel.java b/com/sun/electric/tool/generator/flag/router/Channel.java
index d5ba336..96fa74d 100644
--- a/com/sun/electric/tool/generator/flag/router/Channel.java
+++ b/com/sun/electric/tool/generator/flag/router/Channel.java
@@ -4,7 +4,7 @@
*
* File: Channel.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/router/ConnectedSegments.java b/com/sun/electric/tool/generator/flag/router/ConnectedSegments.java
index f3762f7..047db4b 100644
--- a/com/sun/electric/tool/generator/flag/router/ConnectedSegments.java
+++ b/com/sun/electric/tool/generator/flag/router/ConnectedSegments.java
@@ -4,7 +4,7 @@
*
* File: ConnectedSegments.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/router/ConnectionCache.java b/com/sun/electric/tool/generator/flag/router/ConnectionCache.java
index 5a50655..65f0a51 100644
--- a/com/sun/electric/tool/generator/flag/router/ConnectionCache.java
+++ b/com/sun/electric/tool/generator/flag/router/ConnectionCache.java
@@ -4,7 +4,7 @@
*
* File: ConnectionCache.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/router/Interval.java b/com/sun/electric/tool/generator/flag/router/Interval.java
index 19d6477..2f92a37 100644
--- a/com/sun/electric/tool/generator/flag/router/Interval.java
+++ b/com/sun/electric/tool/generator/flag/router/Interval.java
@@ -4,7 +4,7 @@
*
* File: Interval.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/router/LayerChannels.java b/com/sun/electric/tool/generator/flag/router/LayerChannels.java
index a6357d0..8aa2cbb 100644
--- a/com/sun/electric/tool/generator/flag/router/LayerChannels.java
+++ b/com/sun/electric/tool/generator/flag/router/LayerChannels.java
@@ -4,7 +4,7 @@
*
* File: LayerChannels.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/router/Router.java b/com/sun/electric/tool/generator/flag/router/Router.java
index f2217fe..7ff09be 100644
--- a/com/sun/electric/tool/generator/flag/router/Router.java
+++ b/com/sun/electric/tool/generator/flag/router/Router.java
@@ -4,7 +4,7 @@
*
* File: Router.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/router/Segment.java b/com/sun/electric/tool/generator/flag/router/Segment.java
index e9fe7d7..00cdd63 100644
--- a/com/sun/electric/tool/generator/flag/router/Segment.java
+++ b/com/sun/electric/tool/generator/flag/router/Segment.java
@@ -4,7 +4,7 @@
*
* File: Segment.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/router/SogRouterAdapter.java b/com/sun/electric/tool/generator/flag/router/SogRouterAdapter.java
index a83ab10..20fd55f 100644
--- a/com/sun/electric/tool/generator/flag/router/SogRouterAdapter.java
+++ b/com/sun/electric/tool/generator/flag/router/SogRouterAdapter.java
@@ -4,7 +4,7 @@
*
* File: SogRouterAdapter.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/router/ToConnect.java b/com/sun/electric/tool/generator/flag/router/ToConnect.java
index f7ffd11..f1574df 100644
--- a/com/sun/electric/tool/generator/flag/router/ToConnect.java
+++ b/com/sun/electric/tool/generator/flag/router/ToConnect.java
@@ -4,7 +4,7 @@
*
* File: ToConnect.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/router/Track.java b/com/sun/electric/tool/generator/flag/router/Track.java
index 24abddf..405b41d 100644
--- a/com/sun/electric/tool/generator/flag/router/Track.java
+++ b/com/sun/electric/tool/generator/flag/router/Track.java
@@ -4,7 +4,7 @@
*
* File: Track.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/scan/Scan.java b/com/sun/electric/tool/generator/flag/scan/Scan.java
index ccf4401..06394b8 100644
--- a/com/sun/electric/tool/generator/flag/scan/Scan.java
+++ b/com/sun/electric/tool/generator/flag/scan/Scan.java
@@ -4,7 +4,7 @@
*
* File: Scan.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/flag/scan/ScanChain.java b/com/sun/electric/tool/generator/flag/scan/ScanChain.java
index d3b6f37..8cddee8 100644
--- a/com/sun/electric/tool/generator/flag/scan/ScanChain.java
+++ b/com/sun/electric/tool/generator/flag/scan/ScanChain.java
@@ -4,7 +4,7 @@
*
* File: ScanChain.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/DrcRings.java b/com/sun/electric/tool/generator/layout/DrcRings.java
index 79b43ca..ee1bc31 100644
--- a/com/sun/electric/tool/generator/layout/DrcRings.java
+++ b/com/sun/electric/tool/generator/layout/DrcRings.java
@@ -4,7 +4,7 @@
*
* File: DrcRings.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/FoldedMos.java b/com/sun/electric/tool/generator/layout/FoldedMos.java
index 04ef1ca..cbd5aeb 100644
--- a/com/sun/electric/tool/generator/layout/FoldedMos.java
+++ b/com/sun/electric/tool/generator/layout/FoldedMos.java
@@ -4,7 +4,7 @@
*
* File: FoldedMos.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/FoldedNmos.java b/com/sun/electric/tool/generator/layout/FoldedNmos.java
index 2ffaa57..0128065 100644
--- a/com/sun/electric/tool/generator/layout/FoldedNmos.java
+++ b/com/sun/electric/tool/generator/layout/FoldedNmos.java
@@ -4,7 +4,7 @@
*
* File: FoldedNmos.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/FoldedPmos.java b/com/sun/electric/tool/generator/layout/FoldedPmos.java
index c215a41..974034f 100644
--- a/com/sun/electric/tool/generator/layout/FoldedPmos.java
+++ b/com/sun/electric/tool/generator/layout/FoldedPmos.java
@@ -4,7 +4,7 @@
*
* File: FoldedPmos.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/FoldsAndWidth.java b/com/sun/electric/tool/generator/layout/FoldsAndWidth.java
index 9823044..f75c895 100644
--- a/com/sun/electric/tool/generator/layout/FoldsAndWidth.java
+++ b/com/sun/electric/tool/generator/layout/FoldsAndWidth.java
@@ -4,7 +4,7 @@
*
* File: FoldsAndWidth.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/Gallery.java b/com/sun/electric/tool/generator/layout/Gallery.java
index 1870372..daaed6d 100644
--- a/com/sun/electric/tool/generator/layout/Gallery.java
+++ b/com/sun/electric/tool/generator/layout/Gallery.java
@@ -4,7 +4,7 @@
*
* File: Gallery.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/GateLayoutGenerator.java b/com/sun/electric/tool/generator/layout/GateLayoutGenerator.java
index 01e7c91..c1a3b58 100644
--- a/com/sun/electric/tool/generator/layout/GateLayoutGenerator.java
+++ b/com/sun/electric/tool/generator/layout/GateLayoutGenerator.java
@@ -4,7 +4,7 @@
*
* File: Gates.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/GateRegression.java b/com/sun/electric/tool/generator/layout/GateRegression.java
index 22f32c5..8b59d59 100644
--- a/com/sun/electric/tool/generator/layout/GateRegression.java
+++ b/com/sun/electric/tool/generator/layout/GateRegression.java
@@ -4,7 +4,7 @@
*
* File: GateRegression.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/KeeperHigh.java b/com/sun/electric/tool/generator/layout/KeeperHigh.java
index e83434e..1fccb10 100644
--- a/com/sun/electric/tool/generator/layout/KeeperHigh.java
+++ b/com/sun/electric/tool/generator/layout/KeeperHigh.java
@@ -4,7 +4,7 @@
*
* File: KeeperHigh.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/KeeperLow.java b/com/sun/electric/tool/generator/layout/KeeperLow.java
index e459b3a..6eb0814 100644
--- a/com/sun/electric/tool/generator/layout/KeeperLow.java
+++ b/com/sun/electric/tool/generator/layout/KeeperLow.java
@@ -4,7 +4,7 @@
*
* File: KeeperLow.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/LayoutLib.java b/com/sun/electric/tool/generator/layout/LayoutLib.java
index c180058..ed7383c 100644
--- a/com/sun/electric/tool/generator/layout/LayoutLib.java
+++ b/com/sun/electric/tool/generator/layout/LayoutLib.java
@@ -4,7 +4,7 @@
*
* File: LayoutLib.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -82,13 +82,13 @@ public class LayoutLib {
* @param ep EditingPreferences with default sizes and text descriptors
* @return the open Library or null if it can't be found
*/
- public static Library openLibForRead(String libFileName, EditingPreferences ep) {
+ public static Library openLibForRead(String libFileName, EditingPreferences ep, boolean quick) {
URL libFileURL = TextUtils.makeURLToFile(libFileName);
String libName = TextUtils.getFileNameWithoutExtension(libFileURL);
Library lib = Library.findLibrary(libName);
FileType type = OpenFile.getOpenFileType(libFileName, FileType.DEFAULTLIB);
if (lib==null) {
- lib = LibraryFiles.readLibrary(ep, libFileURL, null, type, false);
+ lib = LibraryFiles.readLibrary(ep, libFileURL, null, type, quick);
}
Job.error(lib==null, "can't open Library for reading: "+libFileName);
return lib;
diff --git a/com/sun/electric/tool/generator/layout/NodaNets.java b/com/sun/electric/tool/generator/layout/NodaNets.java
index 82fba69..930edcc 100644
--- a/com/sun/electric/tool/generator/layout/NodaNets.java
+++ b/com/sun/electric/tool/generator/layout/NodaNets.java
@@ -4,7 +4,7 @@
*
* File: NodaNets.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/Placer.java b/com/sun/electric/tool/generator/layout/Placer.java
index a69779b..3f9c6f8 100644
--- a/com/sun/electric/tool/generator/layout/Placer.java
+++ b/com/sun/electric/tool/generator/layout/Placer.java
@@ -4,7 +4,7 @@
*
* File: Placer.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/PortFilter.java b/com/sun/electric/tool/generator/layout/PortFilter.java
index cc522ce..2094cdf 100644
--- a/com/sun/electric/tool/generator/layout/PortFilter.java
+++ b/com/sun/electric/tool/generator/layout/PortFilter.java
@@ -4,7 +4,7 @@
*
* File: PortFilter.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/ProjSettings.java b/com/sun/electric/tool/generator/layout/ProjSettings.java
index 3684258..26daf98 100644
--- a/com/sun/electric/tool/generator/layout/ProjSettings.java
+++ b/com/sun/electric/tool/generator/layout/ProjSettings.java
@@ -4,7 +4,7 @@
*
* File: ProjSettings.java
*
-* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+* Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/SchemToLay.java b/com/sun/electric/tool/generator/layout/SchemToLay.java
index 60a389c..b26a0d9 100644
--- a/com/sun/electric/tool/generator/layout/SchemToLay.java
+++ b/com/sun/electric/tool/generator/layout/SchemToLay.java
@@ -4,7 +4,7 @@
*
* File: SchemToLay.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/StdCellParams.java b/com/sun/electric/tool/generator/layout/StdCellParams.java
index e1959b6..c629604 100644
--- a/com/sun/electric/tool/generator/layout/StdCellParams.java
+++ b/com/sun/electric/tool/generator/layout/StdCellParams.java
@@ -4,7 +4,7 @@
*
* File: StdCellParams.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/StdCellParams350.java b/com/sun/electric/tool/generator/layout/StdCellParams350.java
index d76fe60..0f797e0 100644
--- a/com/sun/electric/tool/generator/layout/StdCellParams350.java
+++ b/com/sun/electric/tool/generator/layout/StdCellParams350.java
@@ -4,7 +4,7 @@
*
* File: StdCellParams350.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/TechTypeWizard.java b/com/sun/electric/tool/generator/layout/TechTypeWizard.java
index 4b975ea..c08cfdf 100644
--- a/com/sun/electric/tool/generator/layout/TechTypeWizard.java
+++ b/com/sun/electric/tool/generator/layout/TechTypeWizard.java
@@ -4,7 +4,7 @@
*
* File: TechTypeWizard.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/TrackRouter.java b/com/sun/electric/tool/generator/layout/TrackRouter.java
index cd3646d..c5873ec 100644
--- a/com/sun/electric/tool/generator/layout/TrackRouter.java
+++ b/com/sun/electric/tool/generator/layout/TrackRouter.java
@@ -4,7 +4,7 @@
*
* File: TrackRouter.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/TrackRouterH.java b/com/sun/electric/tool/generator/layout/TrackRouterH.java
index 38317e1..125db9d 100644
--- a/com/sun/electric/tool/generator/layout/TrackRouterH.java
+++ b/com/sun/electric/tool/generator/layout/TrackRouterH.java
@@ -4,7 +4,7 @@
*
* File: TrackRouterH.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/TrackRouterV.java b/com/sun/electric/tool/generator/layout/TrackRouterV.java
index 32fb881..73c5005 100644
--- a/com/sun/electric/tool/generator/layout/TrackRouterV.java
+++ b/com/sun/electric/tool/generator/layout/TrackRouterV.java
@@ -4,7 +4,7 @@
*
* File: TrackRouterV.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/ViaStack.java b/com/sun/electric/tool/generator/layout/ViaStack.java
index 1fb43a3..c3bc3b7 100644
--- a/com/sun/electric/tool/generator/layout/ViaStack.java
+++ b/com/sun/electric/tool/generator/layout/ViaStack.java
@@ -4,7 +4,7 @@
*
* File: ViaStack.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/fill/CapCell.java b/com/sun/electric/tool/generator/layout/fill/CapCell.java
index fc4c871..644401c 100644
--- a/com/sun/electric/tool/generator/layout/fill/CapCell.java
+++ b/com/sun/electric/tool/generator/layout/fill/CapCell.java
@@ -4,7 +4,7 @@
*
* File: CapCell.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/fill/CapFloorplan.java b/com/sun/electric/tool/generator/layout/fill/CapFloorplan.java
index a5d6449..f7f6219 100644
--- a/com/sun/electric/tool/generator/layout/fill/CapFloorplan.java
+++ b/com/sun/electric/tool/generator/layout/fill/CapFloorplan.java
@@ -4,7 +4,7 @@
*
* File: CapFloorplan.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/fill/ExportConfig.java b/com/sun/electric/tool/generator/layout/fill/ExportConfig.java
index 94ad403..aa12236 100644
--- a/com/sun/electric/tool/generator/layout/fill/ExportConfig.java
+++ b/com/sun/electric/tool/generator/layout/fill/ExportConfig.java
@@ -4,7 +4,7 @@
*
* File: ExportConfig.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/fill/FillCell.java b/com/sun/electric/tool/generator/layout/fill/FillCell.java
index 1af1f6a..fa2ba91 100644
--- a/com/sun/electric/tool/generator/layout/fill/FillCell.java
+++ b/com/sun/electric/tool/generator/layout/fill/FillCell.java
@@ -4,7 +4,7 @@
*
* File: FillCell.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/fill/FillGen.java b/com/sun/electric/tool/generator/layout/fill/FillGen.java
index 6f10dd8..896cf43 100644
--- a/com/sun/electric/tool/generator/layout/fill/FillGen.java
+++ b/com/sun/electric/tool/generator/layout/fill/FillGen.java
@@ -4,7 +4,7 @@
*
* File: FillGen.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/fill/FillGenConfig.java b/com/sun/electric/tool/generator/layout/fill/FillGenConfig.java
index 03bfb70..9901900 100644
--- a/com/sun/electric/tool/generator/layout/fill/FillGenConfig.java
+++ b/com/sun/electric/tool/generator/layout/fill/FillGenConfig.java
@@ -4,7 +4,7 @@
*
* File: FillGenConfig.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/fill/FillGenJob.java b/com/sun/electric/tool/generator/layout/fill/FillGenJob.java
index 9709d6d..372bd79 100644
--- a/com/sun/electric/tool/generator/layout/fill/FillGenJob.java
+++ b/com/sun/electric/tool/generator/layout/fill/FillGenJob.java
@@ -4,7 +4,7 @@
*
* File: FillGenJob.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/fill/FillGeneratorTool.java b/com/sun/electric/tool/generator/layout/fill/FillGeneratorTool.java
index c4afc4e..42b6b42 100644
--- a/com/sun/electric/tool/generator/layout/fill/FillGeneratorTool.java
+++ b/com/sun/electric/tool/generator/layout/fill/FillGeneratorTool.java
@@ -4,7 +4,7 @@
*
* File: FillGeneratorTool.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -35,6 +35,7 @@ import com.sun.electric.technology.Technology;
import com.sun.electric.tool.Job;
import com.sun.electric.tool.JobException;
import com.sun.electric.tool.Tool;
+import com.sun.electric.tool.generator.layout.fillCell.FillCellTool;
import com.sun.electric.tool.generator.layout.Gallery;
import com.sun.electric.tool.generator.layout.LayoutLib;
import com.sun.electric.tool.generator.layout.TechType;
@@ -565,7 +566,7 @@ public class FillGeneratorTool extends Tool {
FillGeneratorTool tool;
try
{
- Class<?> extraClass = Class.forName("com.sun.electric.plugins.generator.FillCellTool");
+ Class<?> extraClass = Class.forName("com.sun.electric.tool.generator.layout.fillCell.FillCellTool");
Constructor<?> instance = extraClass.getDeclaredConstructor(); // varags
Object obj = instance.newInstance(); // varargs;
tool = (FillGeneratorTool)obj;
diff --git a/com/sun/electric/tool/generator/layout/fill/G.java b/com/sun/electric/tool/generator/layout/fill/G.java
index d0bcdc4..66826ff 100644
--- a/com/sun/electric/tool/generator/layout/fill/G.java
+++ b/com/sun/electric/tool/generator/layout/fill/G.java
@@ -4,7 +4,7 @@
*
* File: G.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/fill/StitchFillJob.java b/com/sun/electric/tool/generator/layout/fill/StitchFillJob.java
index a13ffc3..57d9077 100644
--- a/com/sun/electric/tool/generator/layout/fill/StitchFillJob.java
+++ b/com/sun/electric/tool/generator/layout/fill/StitchFillJob.java
@@ -4,7 +4,7 @@
*
* File: StitchFillJob.java
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -1058,28 +1058,28 @@ public class StitchFillJob extends Job
}
}
- /**
- * Method to collect arcs found in a given area. It doesn't check if the arc is horizontal or top level
- * @param resultBnd Search area
- * @param at List with arcs to search from
- * @return
- */
- private static ArcInst getArcInstOverlappingWithArea(Rectangle2D resultBnd, List<ArcInst> at)
+ /**
+ * Method to collect arcs found in a given area. It doesn't check if the arc is horizontal or top level
+ * @param resultBnd Search area
+ * @param at List with arcs to search from
+ * @return ArcInst in the area.
+ */
+ private static ArcInst getArcInstOverlappingWithArea(Rectangle2D resultBnd, List<ArcInst> at)
+ {
+ Area topArea = new Area(resultBnd);
+ for (ArcInst ai : at)
{
- Area topArea = new Area(resultBnd);
- for (ArcInst ai : at)
- {
- Rectangle2D r = ai.getBounds();
+ Rectangle2D r = ai.getBounds();
- // test if the current ai inserts with the given area
- // and it is fully contained along the axis the arc is aligned
- if (r.intersects(resultBnd))
- {
- return ai;
- }
+ // test if the current ai inserts with the given area
+ // and it is fully contained along the axis the arc is aligned
+ if (r.intersects(resultBnd))
+ {
+ return ai;
}
- return null;
}
+ return null;
+ }
/**
* Method to collect arcs found in a given area
@@ -1087,7 +1087,7 @@ public class StitchFillJob extends Job
* @param at List with arcs to search from
* @param horizontal
* @param topLayer
- * @return
+ * @return ArcInst in the area.
*/
private static ArcInst getArcInstOverlappingWithArea(Rectangle2D resultBnd, List<ArcInst> at, boolean horizontal, boolean topLayer)
{
diff --git a/com/sun/electric/tool/generator/layout/fill/TiledCell.java b/com/sun/electric/tool/generator/layout/fill/TiledCell.java
index a7f8447..25dfb4a 100644
--- a/com/sun/electric/tool/generator/layout/fill/TiledCell.java
+++ b/com/sun/electric/tool/generator/layout/fill/TiledCell.java
@@ -4,7 +4,7 @@
*
* File: TiledCell.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/fill/VddGndStraps.java b/com/sun/electric/tool/generator/layout/fill/VddGndStraps.java
index e2e8505..d0bc1f5 100644
--- a/com/sun/electric/tool/generator/layout/fill/VddGndStraps.java
+++ b/com/sun/electric/tool/generator/layout/fill/VddGndStraps.java
@@ -4,7 +4,7 @@
*
* File: VddGndStraps.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/fillCell/FillCellGenJob.java b/com/sun/electric/tool/generator/layout/fillCell/FillCellGenJob.java
new file mode 100644
index 0000000..6b2b418
--- /dev/null
+++ b/com/sun/electric/tool/generator/layout/fillCell/FillCellGenJob.java
@@ -0,0 +1,2051 @@
+/* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: FillCellGenJob.java
+ *
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.generator.layout.fillCell;
+
+import java.awt.geom.Area;
+import java.awt.geom.Point2D;
+import java.awt.geom.Rectangle2D;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import com.sun.electric.database.EditingPreferences;
+import com.sun.electric.database.geometry.EPoint;
+import com.sun.electric.database.geometry.GeometryHandler;
+import com.sun.electric.database.geometry.Poly;
+import com.sun.electric.database.geometry.PolyBase;
+import com.sun.electric.database.hierarchy.Cell;
+import com.sun.electric.database.hierarchy.Export;
+import com.sun.electric.database.hierarchy.HierarchyEnumerator;
+import com.sun.electric.database.hierarchy.Library;
+import com.sun.electric.database.hierarchy.Nodable;
+import com.sun.electric.database.network.Netlist;
+import com.sun.electric.database.network.Network;
+import com.sun.electric.database.prototype.NodeProto;
+import com.sun.electric.database.prototype.PortCharacteristic;
+import com.sun.electric.database.prototype.PortProto;
+import com.sun.electric.database.topology.ArcInst;
+import com.sun.electric.database.topology.Connection;
+import com.sun.electric.database.topology.Geometric;
+import com.sun.electric.database.topology.NodeInst;
+import com.sun.electric.database.topology.PortInst;
+import com.sun.electric.database.variable.VarContext;
+import com.sun.electric.technology.ArcProto;
+import com.sun.electric.technology.Layer;
+import com.sun.electric.technology.PrimitiveNode;
+import com.sun.electric.technology.PrimitivePort;
+import com.sun.electric.technology.Technology;
+import com.sun.electric.technology.technologies.Generic;
+import com.sun.electric.tool.extract.LayerCoverageTool;
+import com.sun.electric.tool.generator.layout.LayoutLib;
+import com.sun.electric.tool.generator.layout.TechType;
+import com.sun.electric.tool.generator.layout.fill.FillGenConfig;
+import com.sun.electric.tool.generator.layout.fill.FillGenJob;
+import com.sun.electric.tool.generator.layout.fill.FillGeneratorTool;
+import com.sun.electric.tool.generator.layout.fill.G;
+import com.sun.electric.tool.generator.layout.fill.VddGndStraps;
+import com.sun.electric.tool.routing.InteractiveRouter;
+import com.sun.electric.tool.routing.Route;
+import com.sun.electric.tool.routing.Router;
+import com.sun.electric.tool.routing.Routing.SoGContactsStrategy;
+import com.sun.electric.tool.routing.SimpleWirer;
+import com.sun.electric.tool.routing.seaOfGates.SeaOfGatesEngine;
+import com.sun.electric.tool.routing.seaOfGates.SeaOfGatesEngineFactory;
+import com.sun.electric.tool.routing.seaOfGates.SeaOfGatesHandlers;
+import com.sun.electric.util.math.DBMath;
+import com.sun.electric.util.math.FixpTransform;
+import com.sun.electric.util.math.GenMath;
+
+/****************************** JOB ******************************/
+
+public class FillCellGenJob extends FillGenJob {
+ public FillCellGenJob(Cell cell, FillGenConfig gen, boolean doItNow,
+ LayerCoverageTool.LayerCoveragePreferences lcp) {
+ super(cell, gen, doItNow, lcp);
+ }
+
+ /**
+ * Method to obtain the PrimitiveNode layer holding this export. It travels
+ * along hierarchy until reaches the PrimitiveNode leaf containing the
+ * export. Only metal layers are selected.
+ *
+ * @param ex
+ * @return Non pseudo layer for the given export
+ */
+ public static Layer getMetalLayerFromExport(PortProto ex) {
+ PortProto po = ex;
+
+ if (ex instanceof Export) {
+ PortInst pi = ((Export) ex).getOriginalPort();
+ po = pi.getPortProto();
+ }
+ if (po instanceof Export)
+ return getMetalLayerFromExport(po);
+ if (po instanceof PrimitivePort) {
+ PrimitivePort pp = (PrimitivePort) po;
+ PrimitiveNode node = pp.getParent();
+ // Search for at least m2
+ for (Iterator<Layer> it = node.getLayerIterator(); it.hasNext();) {
+ Layer layer = it.next();
+ Layer.Function func = layer.getFunction();
+ // Exclude metal1
+ if (func.isMetal() && func != Layer.Function.METAL1)
+ return layer;
+ }
+ }
+ return null;
+ }
+
+ private List<PortConfig> searchPortList() {
+ // Searching common power/gnd connections and skip the ones are in the
+ // same network
+ // Don't change List by Set otherwise the sequence given by Set is not
+ // deterministic and hard to debug
+ List<PortInst> portList = new ArrayList<PortInst>();
+ Netlist topCellNetlist = topCell.getNetlist();
+ List<Export> exportList = new ArrayList<Export>();
+
+ for (Iterator<NodeInst> it = topCell.getNodes(); it.hasNext();) {
+ NodeInst ni = it.next();
+
+ if (!ni.isCellInstance()) {
+ // for (Iterator<PortInst> itP = ni.getPortInsts();
+ // itP.hasNext(); )
+ // {
+ // PortInst p = itP.next();
+ //
+ // if (!p.getPortProto().isGround() &&
+ // !p.getPortProto().isPower())
+ // continue;
+ // // Simple case
+ // portList.add(p);
+ // }
+ for (Iterator<Export> itE = ni.getExports(); itE.hasNext();) {
+ Export e = itE.next();
+ if (!e.isGround() && !e.isPower())
+ continue;
+ portList.add(e.getOriginalPort());
+ exportList.add(e);
+ }
+ } else {
+ Cell cell = (Cell) ni.getProto();
+ Netlist netlist = cell.getNetlist();
+ List<PortInst> list = new ArrayList<PortInst>();
+ List<Network> nets = new ArrayList<Network>();
+ List<Export> eList = new ArrayList<Export>();
+ boolean foundVdd = false;
+ boolean foundGnd = false;
+
+ for (Iterator<PortInst> itP = ni.getPortInsts(); itP.hasNext() && (!foundVdd || !foundGnd);) {
+ PortInst p = itP.next();
+
+ if (!p.getPortProto().isGround() && !p.getPortProto().isPower())
+ continue;
+ if ((foundVdd && p.getPortProto().isPower()) || (foundGnd && p.getPortProto().isGround())) {
+ System.out.println("Skipping export " + p + " in " + ni);
+ continue;
+ }
+
+ // If subcell has two exports on the same network, it
+ // assumes they are connected inside
+ // and therefore only one of them is checked
+ assert (p.getPortProto() instanceof Export);
+ Export ex = (Export) p.getPortProto();
+ Network net = netlist.getNetwork(ex.getOriginalPort());
+ Network topNet = topCellNetlist.getNetwork(p);
+ Cell fillCell = null;
+
+ // search for possible existing fill already defined
+ // for (Iterator<Nodable> itN =
+ // topNet.getNetlist().getNodables(); itN.hasNext(); )
+ // {
+ // Nodable no = itN.next();
+ // if (ni == no) continue; // skip itself
+ // if (!no.isCellInstance()) continue; // skip any flat
+ // PrimitiveNode?
+ // Cell c = (Cell)no.getProto();
+ // if (c == p.getNodeInst().getProto()) // skip port parent
+ // continue;
+ // if (c.getName().indexOf("fill") == -1) continue; // not a
+ // fill cell
+ // fillCell = c;
+ // break;
+ // }
+ // if fillCell is not null -> cover by a fill cell
+ if (fillCell == null && !nets.contains(net)) {
+ list.add(p);
+ nets.add(net);
+ nets.add(net);
+ eList.add(ex);
+ if (p.getPortProto().isPower())
+ foundVdd = true;
+ else if (p.getPortProto().isGround())
+ foundGnd = true;
+ } else System.out.println("Skipping export " + p + " in " + ni);
+ }
+ portList.addAll(list);
+ exportList.addAll(eList);
+ }
+ }
+
+ // searching for exclusion regions. If port is inside these regions,
+ // then it will be removed.
+ // Search them in a chunk of ports. It should be faster
+ // ObjectQTree tree = new ObjectQTree(topCell.getBounds());
+ // List<Rectangle2D> searchBoxes = new ArrayList<Rectangle2D>(); // list
+ // of AFG boxes to use.
+ //
+ // for (Iterator<NodeInst> it = topCell.getNodes(); it.hasNext(); )
+ // {
+ // NodeInst ni = it.next();
+ // NodeProto np = ni.getProto();
+ // if (np == Generic.tech.afgNode)
+ // searchBoxes.add(ni.getBounds());
+ // }
+ // if (searchBoxes.size() > 0)
+ // {
+ // for (PortInst p : portList)
+ // {
+ // tree.add(p, p.getBounds());
+ // }
+ // for (Rectangle2D rect : searchBoxes)
+ // {
+ // Set set = tree.find(rect);
+ // portList.removeAll(set);
+ // }
+ // }
+ List<PortConfig> plList = new ArrayList<PortConfig>();
+
+ assert (portList.size() == exportList.size());
+
+ for (int i = 0; i < exportList.size(); i++) {
+ PortInst p = portList.get(i);
+
+ Layer l = getMetalLayerFromExport(p.getPortProto());
+ // Checking that pin is on metal port
+ if (l != null)
+ plList.add(new PortConfig(p, exportList.get(i), l));
+ }
+ // for (PortInst p : portList)
+ // {
+ // plList.add(new PortConfig(p,
+ // getMetalLayerFromExport(p.getPortProto())));
+ // }
+ return plList;
+ }
+
+ private List<Cell> searchPossibleMaster() {
+ Cell masterCell = null;
+ List<Cell> secondMasterCell = new ArrayList<Cell>();
+ List<Cell> list = null;
+
+ for (Iterator<Library> it = Library.getLibraries(); it.hasNext();) {
+ Library lib = it.next();
+ for (Iterator<Cell> itC = lib.getCells(); itC.hasNext();) {
+ Cell c = itC.next();
+ if (c.getVar("FILL_MASTER") != null)
+ masterCell = c;
+ else if (c.getVar("FILL_MASTER_ALTERNATIVE") != null)
+ secondMasterCell.add(c);
+ }
+ }
+
+ if (masterCell != null) {
+ list = new ArrayList<Cell>();
+ list.add(masterCell);
+ list.addAll(secondMasterCell);
+ } else System.out.println("No master found for Fill Generator");
+ return list;
+ }
+
+ @Override
+ public boolean doIt() {
+ EditingPreferences ep = getEditingPreferences();
+ FillCellTool fillGen = (FillCellTool) setUpJob();
+
+ boolean result = (fillGenConfig.fillType == FillGeneratorTool.FillTypeEnum.TEMPLATE) ? doTemplateFill(fillGen, ep)
+ : doFillOnCell(fillGen);
+ return result;
+ }
+
+ protected static Cell detectOverlappingBars(Cell cell, Cell master, Cell empty,
+ FixpTransform fillTransUp, HashSet<NodeInst> nodesToRemove, HashSet<ArcInst> arcsToRemove,
+ Cell topCell, NodeInst[] ignore, double drcSpacing, int level) {
+ List<Layer.Function> tmp = new ArrayList<Layer.Function>();
+
+ // Check if any metalXY must be removed
+ for (Iterator<NodeInst> itNode = cell.getNodes(); itNode.hasNext();) {
+ NodeInst ni = itNode.next();
+
+ if (NodeInst.isSpecialNode(ni))
+ continue;
+
+ tmp.clear();
+ NodeProto np = ni.getProto();
+
+ // Only one level of hierarchy otherwise it gets too complicated
+ if (ni.isCellInstance()) {
+ Cell c = (Cell) ni.getProto();
+ FixpTransform subTransUp = ni.transformOut(fillTransUp);
+ HashSet<NodeInst> nodesToRemoveSub = new HashSet<NodeInst>();
+ HashSet<ArcInst> arcsToRemoveSub = new HashSet<ArcInst>();
+
+ Cell tmpCell = detectOverlappingBars(c, master, empty, subTransUp, nodesToRemoveSub,
+ arcsToRemoveSub, topCell, ignore, drcSpacing, ++level);
+ if (tmpCell == empty || tmpCell == null) {
+ // return true. Better to not include this master due to
+ // complexity of the subcells.
+ // not sure what to delete
+ nodesToRemoveSub.clear();
+ arcsToRemoveSub.clear();
+ return empty;
+ }
+ continue;
+ }
+ PrimitiveNode pn = (PrimitiveNode) np;
+ if (pn.getFunction().isPin())
+ continue; // pins have pseudo layers
+
+ for (Technology.NodeLayer tlayer : pn.getNodeLayers()) {
+ tmp.add(tlayer.getLayer().getFunction());
+ }
+ Rectangle2D rect = getSearchRectangle(ni.getBounds(), fillTransUp, drcSpacing);
+ assert (ignore.length == 0);
+ if (searchCollision(topCell, rect, new Layer.Function.Set(tmp), null, new Object[] { cell, ni },
+ master, null)) {
+ // Just for testing
+ if (LOCALDEBUGFLAG) {
+ rect = getSearchRectangle(ni.getBounds(), fillTransUp, drcSpacing);
+ searchCollision(topCell, rect, new Layer.Function.Set(tmp), null,
+ new Object[] { cell, ni }, master, null);
+ }
+ // Direct on last top fill cell
+ nodesToRemove.add(ni);
+ for (Iterator<Connection> itC = ni.getConnections(); itC.hasNext();) {
+ Connection c = itC.next();
+ arcsToRemove.add(c.getArc());
+ }
+ }
+ }
+
+ // Checking if any arc in FillCell collides with rest of the cells
+ Netlist netlist = cell.getNetlist();
+ for (Iterator<ArcInst> itArc = cell.getArcs(); itArc.hasNext();) {
+ ArcInst ai = itArc.next();
+ Layer.Function.Set thisLayer = new Layer.Function.Set(ai.getProto().getLayer(0)
+ .getFunction());
+ // Searching box must reflect DRC constrains
+ Rectangle2D rect = getSearchRectangle(ai.getBounds(), fillTransUp, drcSpacing);
+ assert (ignore.length == 0);
+ Network net = netlist.getNetwork(ai, 0);
+ if (searchCollision(topCell, rect, thisLayer, null, new Object[] { cell, ai }, master, net)) {
+ // For testing
+ if (LOCALDEBUGFLAG) {
+ rect = getSearchRectangle(ai.getBounds(), fillTransUp, drcSpacing);
+ searchCollision(topCell, rect, thisLayer, null, new Object[] { cell, ai }, master, net);
+ }
+ arcsToRemove.add(ai);
+ // Remove exports and pins as well
+ // nodesToRemove.add(ai.getTail().getPortInst().getNodeInst());
+ // nodesToRemove.add(ai.getHead().getPortInst().getNodeInst());
+ }
+ }
+
+ if (level == 0) {
+ Set<ArcProto> names = new HashSet<ArcProto>();
+ // Check if there are not contacts or ping that don't have at least
+ // one or zero arc per metal
+ // If they don't have, then they are floating
+ for (Iterator<NodeInst> itNode = cell.getNodes(); itNode.hasNext();) {
+ NodeInst ni = itNode.next();
+
+ if (Generic.isSpecialGenericNode(ni))
+ continue; // Can't skip pins
+
+ // For removal
+ if (nodesToRemove.contains(ni))
+ continue;
+
+ int minNum = (ni.getProto().getFunction().isPin() || ni.isCellInstance()) ? 0 : 1;
+ // At least should have connections to both layers
+ names.clear();
+ boolean found = false;
+ for (Iterator<Connection> itC = ni.getConnections(); itC.hasNext();) {
+ Connection c = itC.next();
+ ArcInst ai = c.getArc();
+ if (arcsToRemove.contains(ai))
+ continue; // marked for deletion
+ names.add(ai.getProto());
+ if (names.size() > minNum) // found at least two different
+ // arcs
+ {
+ found = true;
+ break;
+ }
+ }
+ if (!found) // element could be deleted
+ nodesToRemove.add(ni);
+ }
+ }
+
+ return (nodesToRemove.size() > 0 || arcsToRemove.size() > 0) ? null : master;
+ }
+
+ /**
+ * Method to determine if new contact will overlap with other metals in the
+ * configuration
+ *
+ * @param parent
+ * @param nodeBounds
+ * @param p
+ * @param ignores
+ * NodeInst instances to ignore
+ * @param master
+ * @param theNet
+ * @return true if a collision was found
+ */
+ protected static boolean searchCollision(Cell parent, Rectangle2D nodeBounds,
+ Layer.Function.Set theseLayers, PortConfig p, Object[] ignores, Cell master, Network theNet) {
+ // Not checking if they belong to the same net!. If yes, ignore the
+ // collision
+ Rectangle2D subBound = new Rectangle2D.Double();
+ Netlist netlist = parent.getNetlist();
+
+ for (int i = 0; i < ignores.length; i++) {
+ if (parent == ignores[i]) {
+ return false;
+ }
+ }
+ if (master != null && searchSubCellInMasterCell(master, parent))
+ return false;
+
+ for (Iterator<Geometric> it = parent.searchIterator(nodeBounds, false); it.hasNext();) {
+ Geometric geom = it.next();
+
+ if (p != null && geom == p.p.getNodeInst())
+ continue; // port belongs to this node
+
+ boolean ignoreThis = false;
+ for (int i = 0; i < ignores.length; i++) {
+ if (geom == ignores[i]) {
+ ignoreThis = true;
+ break;
+ }
+ }
+ if (ignoreThis)
+ continue; // ignore the cell. E.g. fillNi, connectionNi
+
+ if (geom instanceof NodeInst) {
+ NodeInst ni = (NodeInst) geom;
+
+ if (NodeInst.isSpecialNode(ni))
+ continue;
+
+ // ignore nodes that are not primitive
+ if (ni.isCellInstance()) {
+ // instance found: look inside it for offending geometry
+ FixpTransform extra = ni.transformIn();
+ subBound.setRect(nodeBounds);
+ DBMath.transformRect(subBound, extra);
+
+ if (searchCollision((Cell) ni.getProto(), subBound, theseLayers, p, ignores, master,
+ theNet))
+ return true;
+ } else {
+ if (p != null) {
+ boolean found = false;
+ for (Iterator<PortInst> itP = ni.getPortInsts(); itP.hasNext();) {
+ PortInst port = itP.next();
+ Network net = netlist.getNetwork(port);
+ // They export the same, power or gnd so no worries
+ // about overlapping
+ if (net.findExportWithSameCharacteristic(p.e) != null) {
+ found = true;
+ break;
+ }
+ }
+ if (found)
+ continue; // no match in network type
+ }
+
+ Poly[] subPolyList = parent.getTechnology().getShapeOfNode(ni, true, true, theseLayers);
+ // Overlap found
+ if (subPolyList.length > 0)
+ return true;
+ }
+ } else {
+ ArcInst ai = (ArcInst) geom;
+ Network net = netlist.getNetwork(ai, 0);
+
+ // They export the same, power or gnd so no worries about
+ // overlapping
+ if (p != null && net.findExportWithSameCharacteristic(p.e) != null)
+ continue; // no match in network type
+
+ if (theNet != null && net.getName().startsWith(theNet.getName())) // net.doTheyHaveSameCharacteristic(theNet))
+ continue; // they belong to the same network
+
+ Poly[] subPolyList = parent.getTechnology().getShapeOfArc(ai, theseLayers);
+
+ // Something overlaps
+ if (subPolyList.length > 0)
+ return true;
+ }
+ }
+ return false;
+ }
+
+ public static Rectangle2D getSearchRectangle(Rectangle2D bnd, FixpTransform fillTransUp,
+ double drcSpacing) {
+ Rectangle2D rect = new Rectangle2D.Double(bnd.getX() - drcSpacing, bnd.getY() - drcSpacing, bnd
+ .getWidth()
+ + 2 * drcSpacing, bnd.getHeight() + 2 * drcSpacing);
+ if (fillTransUp != null)
+ DBMath.transformRect(rect, fillTransUp);
+ return rect;
+ }
+
+ /**
+ * Method to check if a subCell used in another cell is also part of the
+ * master cell. This avoids conflicts while detecting collisions.
+ *
+ * @param master
+ * @param cell
+ * @return true if cell is used in master cell
+ */
+ private static boolean searchSubCellInMasterCell(Cell master, Cell cell) {
+ // checking if parent is already part of the fill master
+ for (Iterator<NodeInst> itNi = master.getNodes(); itNi.hasNext();) {
+ NodeInst ni = itNi.next();
+ if (ni.isCellInstance()) {
+ Cell thisCell = (Cell) ni.getProto();
+ if (thisCell == cell)
+ return true; // found in master
+ }
+ }
+ return false;
+ }
+
+ // Collect exclusion area for fill generator
+ private class Visitor extends HierarchyEnumerator.Visitor {
+ private Area exclusionArea = new Area();
+ private int level = -1;
+ private int maxLevel = 0; // 3 for island_top, 3 or 2 for bridge_core
+
+ public Visitor(int l) {
+ this.maxLevel = l;
+ }
+
+ @Override
+ public boolean enterCell(HierarchyEnumerator.CellInfo info) {
+ if (level > (maxLevel + 1))
+ return false; // only the first 2 levels
+ level++;
+ return true;
+ }
+
+ @Override
+ public void exitCell(HierarchyEnumerator.CellInfo info) {
+ level--;
+ }
+
+ @Override
+ public boolean visitNodeInst(Nodable no, HierarchyEnumerator.CellInfo info) {
+ NodeProto np = no.getProto();
+ if (!(np == Generic.tech().afgNode || fillGenConfig.onlyAround && no.isCellInstance()))
+ return false; // nothing to do
+ if (level > maxLevel) // picking only in this level
+ return false;
+ if (level == maxLevel) // 3 for island_top
+ {
+ FixpTransform extra = info.getTransformToRoot();
+ NodeInst ni = (NodeInst) no;
+ Rectangle2D rect = (Rectangle2D) ni.getBounds().clone();
+ DBMath.transformRect(rect, extra);
+ exclusionArea.add(new Area(rect));
+ }
+ return true;
+ }
+ }
+
+ // private void addExclusionAreas(Cell cell, Area exclusionArea,
+ // AffineTransform toTop, int level)
+ // {
+ // if (level > 1) return; // stop here
+ //
+ // for (Iterator<NodeInst> it = cell.getNodes(); it.hasNext(); )
+ // {
+ // NodeInst ni = it.next();
+ // NodeProto np = ni.getProto();
+ // // Creates fill only arounds the top cells
+ // if (np == Generic.tech().afgNode || fillGenConfig.onlyAround &&
+ // ni.isCellInstance())
+ // {
+ // AffineTransform extra = ni.transformOut(toTop);
+ // if (level == 0)
+ // addExclusionAreas((Cell)ni.getProto(), exclusionArea, extra, level+1);
+ // else
+ // {
+ // Rectangle2D rect = (Rectangle2D)ni.getBounds().clone();
+ // DBMath.transformRect(rect, extra);
+ // exclusionArea.add(new Area(rect));
+ // // exclusionArea.add(new Area(ni.getBounds()));
+ // }
+ // }
+ // }
+ // }
+
+ /**
+ * Method to search for the closest export to a given PortInst in the
+ * topCell. A hash map is kept to avoid calculation of the center point
+ * every time the export is in consideration.
+ *
+ * @return closest Export.
+ */
+ private Export searchForClosestPort(PortInst pi, List<Export> list, Map<Export, Point2D> centerMap,
+ FixpTransform conTransOut) {
+ double closest = Double.MAX_VALUE;
+ EPoint piCenter = pi.getCenter();
+ Export found = null;
+
+ for (Export ex : list) {
+ Point2D point = centerMap.get(ex);
+ if (point == null) // first time checking this export
+ {
+ point = ex.getOriginalPort().getCenter();
+ Point2D newPoint = new Point2D.Double(0, 0);
+ conTransOut.transform(point, newPoint); // location of export in
+ // top cell
+ point = newPoint;
+ centerMap.put(ex, newPoint);
+ }
+ double dist = point.distance(piCenter);
+ if (dist < closest) {
+ found = ex;
+ closest = dist;
+ }
+ }
+ return found;
+ }
+
+ public boolean doFillOnCell(FillCellTool fillGen) {
+ EditingPreferences ep = getEditingPreferences();
+ // Searching for possible master
+ List<Cell> masters = null;
+
+ if (fillGen.config.useMaster) {
+ masters = searchPossibleMaster();
+ if (masters == null) {
+ System.out.println("No master found. Either mark one or select create in pulldown menu");
+ return false;
+ }
+ }
+
+ // Creating fills only for layers found in exports
+ List<PortConfig> portList = searchPortList();
+
+ // otherwise pins at edges increase cell sizes and
+ // FillRouter.connectCoincident(portInsts)
+ // does work
+ // G.DEF_SIZE = 0;
+ List<Rectangle2D> topBoxList = new ArrayList<Rectangle2D>();
+ topBoxList.add(topCell.getBounds()); // topBox might change if
+ // predefined pitch is included
+ // in master cell
+
+ Visitor areaVisitor = new Visitor(fillGenConfig.level);
+ HierarchyEnumerator.enumerateCell(topCell, VarContext.globalContext, areaVisitor);
+ TechType techType = fillGenConfig.getTechType();
+
+ Cell fillCell = (fillGenConfig.hierarchy) ? fillGen.treeMakeFillCell(fillGenConfig, ep, topCell, masters,
+ topBoxList, areaVisitor.exclusionArea) : fillGen.standardMakeFillCell(
+ fillGenConfig.firstLayer, fillGenConfig.lastLayer, techType, ep, fillGenConfig.perim,
+ fillGenConfig.cellTiles, true);
+ fillCell.setTechnology(topCell.getTechnology());
+
+ if (topCell == null) /* || portList == null || portList.size() == 0) */
+ return false; // not sure if false is correct
+
+ Cell connectionCell = Cell.newInstance(topCell.getLibrary(), topCell.getName() + "fill{lay}");
+ connectionCell.setTechnology(topCell.getTechnology());
+
+ Rectangle2D fillBnd = fillCell.getBounds();
+ double essentialX = fillBnd.getWidth() / 2;
+ double essentialY = fillBnd.getHeight() / 2;
+ LayoutLib.newNodeInst(techType.essentialBounds(), ep, -essentialX, -essentialY, G.DEF_SIZE, G.DEF_SIZE,
+ 180, connectionCell);
+ LayoutLib.newNodeInst(techType.essentialBounds(), ep, essentialX, essentialY, G.DEF_SIZE, G.DEF_SIZE, 0,
+ connectionCell);
+
+ // Adding the connection cell into topCell
+ assert (topBoxList.size() == 1);
+ Rectangle2D bnd = topBoxList.get(0);
+ NodeInst conNi = LayoutLib.newNodeInst(connectionCell, ep, bnd.getCenterX(), bnd.getCenterY(), fillBnd
+ .getWidth(), fillBnd.getHeight(), 0, topCell);
+
+ // Adding the fill cell into connectionCell
+ Rectangle2D conBnd = connectionCell.getBounds();
+ NodeInst fillNi = LayoutLib.newNodeInst(fillCell, ep, conBnd.getCenterX() - fillBnd.getWidth() / 2
+ - fillBnd.getX(), conBnd.getCenterY() - fillBnd.getHeight() / 2 - fillBnd.getY(), fillBnd
+ .getWidth(), fillBnd.getHeight(), 0, connectionCell);
+
+ FixpTransform conTransOut = conNi.transformOut();
+ FixpTransform fillTransOutToCon = fillNi.transformOut(); // Don't want
+ // to
+ // calculate
+ // transformation
+ // to top
+ FixpTransform fillTransIn = fillNi.transformIn(conNi.transformIn());
+
+ InteractiveRouter router = new SimpleWirer(ep);
+ router.setTool(FillGeneratorTool.getTool());
+ boolean rotated = (fillGen.masters.get(0) != null && fillGen.masters.get(0).getVar("ROTATED_MASTER") != null);
+ FillGenJobContainer container = new FillGenJobContainer(router, fillCell, fillNi, connectionCell,
+ conNi, fillGenConfig.drcSpacingRule, rotated);
+
+ // Checking if any arc in FillCell collides with rest of the cells
+ if (!fillGenConfig.hierarchy) {
+ FixpTransform fillTransOut = fillNi.transformOut(conTransOut);
+ removeOverlappingBars(container, fillTransOut);
+ }
+
+ // Export all fillCell exports in connectCell before extra exports are
+ // added into fillCell
+ List<Export> gndList = new ArrayList<Export>();
+ List<Export> vddList = new ArrayList<Export>();
+ for (Iterator<Export> it = container.fillCell.getExports(); it.hasNext();) {
+ Export export = it.next();
+ PortInst p = container.fillNi.findPortInstFromProto(export);
+ Export e = Export.newInstance(container.connectionCell, p, p.getPortProto().getName(), ep);
+ e.setCharacteristic(p.getPortProto().getCharacteristic());
+ switch (p.getPortProto().getCharacteristic()) {
+ case GND:
+ gndList.add(e);
+ break;
+ case PWR:
+ vddList.add(e);
+ break;
+ default:
+ assert (false); // invalid case
+ }
+ }
+ if (vddList.isEmpty() && gndList.isEmpty()) {
+ System.out.println("Error: No vdd/gnd exports in master cell.");
+ return false;
+ }
+
+ // List<PolyBase> polyList = new ArrayList<PolyBase>();
+ // List<Geometric> gList = new ArrayList<Geometric>();
+ List<Object> errorList = new ArrayList<Object>();
+
+ if (fillGenConfig.fillCellType == FillGenConfig.FillGenType.ONLYSKILL) {
+ return true;
+ } else if (fillGenConfig.fillCellType == FillGenConfig.FillGenType.SEAGATES) {
+ // trying Sea-of-Gates router for now
+ SeaOfGatesEngine seaGrouter = SeaOfGatesEngineFactory.createSeaOfGatesEngine();
+ List<ArcInst> arcsToRoute = new ArrayList<ArcInst>();
+ Map<Export, Point2D> centerMapGnd = new HashMap<Export, Point2D>(gndList.size());
+ Map<Export, Point2D> centerMapVdd = new HashMap<Export, Point2D>(vddList.size());
+
+ for (PortConfig p : portList) {
+ // On exports for now only
+ Export ex = p.e;
+ // if (p.p.getPortProto() instanceof Export)
+ {
+ // Export ex = (Export)p.p.getPortProto();
+ List<Export> list = (ex.getCharacteristic() == PortCharacteristic.GND) ? gndList
+ : vddList;
+ Export fillE = null;
+ // Search for the closest pin in
+ if (ex.getCharacteristic() == PortCharacteristic.GND)
+ fillE = searchForClosestPort(p.p, gndList, centerMapGnd, conTransOut);
+ else fillE = searchForClosestPort(p.p, vddList, centerMapVdd, conTransOut);
+
+ if (fillE == null) {
+ System.out.println("It couldn't find closest port for " + p.e.getName());
+ continue;
+ }
+ PortInst pi = conNi.findPortInst(fillE.getName());
+ assert (pi != null);
+
+ ArcProto ap = Generic.tech().unrouted_arc;
+ ArcInst ai = ArcInst.newInstanceBase(ap, ep, ap.getDefaultLambdaBaseWidth(ep), pi, p.p);
+ arcsToRoute.add(ai);
+ }
+
+ }
+
+ seaGrouter.setPrefs(lcp.seaIfGatesPrefs);
+ seaGrouter.routeIt(SeaOfGatesHandlers.getDefault(topCell, null, SoGContactsStrategy.SOGCONTACTSATTOPLEVEL, this, ep), topCell, false, arcsToRoute);
+ return true;
+ }
+
+ // First attempt if ports are below a power/ground bars
+ for (PortConfig p : portList) {
+ Rectangle2D rect = null;
+ // Transformation of the cell instance containing this port
+ FixpTransform trans = null; // null if the port is on the top cell
+
+ if (p.p.getPortProto() instanceof Export) {
+ Export ex = (Export) p.p.getPortProto();
+ assert (ex == p.e); // Should I get rid of this condition and
+ // works only with p.e or just p.p?
+ Cell exportCell = (Cell) p.p.getNodeInst().getProto();
+ // Supposed to work only with metal layers
+ // This is extremely expensive
+ if (!fillGenConfig.onlyAround)
+ rect = LayerCoverageTool.getGeometryOnNetwork(exportCell, ex.getOriginalPort(), p.l, lcp);
+ else {
+ // This recta
+ rect = p.pPoly.getBounds2D();
+ // DBMath.transformRect(rect,
+ // p.p.getNodeInst().transformIn()); // bring export down to
+ // the subcell
+ }
+ trans = p.p.getNodeInst().transformOut();
+ } else // port on pins
+ rect = (Rectangle2D) p.p.getNodeInst().getBounds().clone(); // just
+ // to be
+ // cloned
+ // due
+ // to
+ // changes
+ // inside
+ // function
+
+ // Looking to detect any possible contact based on overlap between
+ // this geometry and fill
+ Rectangle2D backupRect = (Rectangle2D) rect.clone();
+ NodeInst added = null;
+
+ // polyList.clear();
+ // gList.clear();
+ // polyList.add(p.pPoly);
+ // gList.add(p.p.getNodeInst());
+ errorList.clear();
+ errorList.add(p.pPoly);
+ errorList.add(p.p.getNodeInst());
+
+ if (!fillGenConfig.onlyAround) {
+ added = addAllPossibleContacts(container, p, rect, trans, fillTransIn, fillTransOutToCon,
+ conTransOut, areaVisitor.exclusionArea);
+
+ if (added != null) {
+ log.logMessage(p.p.describe(false) + " connected", errorList, topCell, 0, false);
+ continue;
+ }
+ }
+
+ // Trying the closest arc
+ rect = backupRect;
+ rect = p.pPoly.getBounds2D();
+ // double searchWidth =
+ // fillGen.masters.get(0).getBounds().getWidth();
+ // rect = new Rectangle2D.Double(rect.getX()-searchWidth/2,
+ // rect.getY(), rect.getWidth()+searchWidth/2,
+ // backupRect.getHeight());
+ rect = new Rectangle2D.Double(rect.getX() - fillGenConfig.gap, rect.getY(), rect.getWidth()
+ + fillGenConfig.gap * 2, backupRect.getHeight());
+ added = addAllPossibleContactsOverPort(container, p, rect, null, // trans,
+ fillTransIn, null, true);
+
+ if (added == null) // trying extension with different width
+ {
+ double searchWidth = fillGen.masters.get(0).getBounds().getWidth();
+ rect = p.pPoly.getBounds2D();
+ rect = new Rectangle2D.Double(rect.getX() - searchWidth / 2, rect.getY(), rect.getWidth()
+ + searchWidth / 2, backupRect.getHeight());
+ added = addAllPossibleContactsOverPort(container, p, rect, null, // trans,
+ fillTransIn, null, false);
+ }
+
+ if (added != null) {
+ log.logMessage(p.p.describe(false) + " connected by extension", errorList, topCell, 0, false);
+ continue;
+ } else {
+ log.logMessage(p.p.describe(false) + " not connected", errorList, topCell, 0, true);
+ }
+ }
+
+ // Checking if ports not falling over power/gnd bars can be connected
+ // using existing contacts
+ // along same X axis
+ // PortInst[] ports = new PortInst[portNotReadList.size()];
+ // portNotReadList.toArray(ports);
+ // portNotReadList.clear();
+ // Rectangle2D[] rects = new Rectangle2D[ports.length];
+ // bndNotReadList.toArray(rects);
+ // bndNotReadList.clear();
+ //
+ // for (int i = 0; i < ports.length; i++)
+ // {
+ // PortInst p = ports[i];
+ // Rectangle2D portBnd = rects[i];
+ // NodeInst minNi = connectToExistingContacts(p, portBnd,
+ // fillContactList, fillPortInstList);
+ //
+ // if (minNi != null)
+ // {
+ // int index = fillContactList.indexOf(minNi);
+ // PortInst fillNiPort = fillPortInstList.get(index);
+ // // Connecting the export in the top cell
+ // Route exportRoute = router.planRoute(topCell, p, fillNiPort,
+ // new Point2D.Double(p.getBounds().getCenterX(),
+ // p.getBounds().getCenterY()), null, false);
+ // Router.createRouteNoJob(exportRoute, topCell, true, false, null);
+ // }
+ // else
+ // {
+ // portNotReadList.add(p);
+ // bndNotReadList.add(rects[i]);
+ // }
+ // }
+ //
+ // // If nothing works, try to insert contacts in location with same Y
+ // // Cleaning fillContacts so it doesn't try again with the same sets
+ // fillPortInstList.clear();
+ // fillContactList.clear();
+ // for (int i = 0; i < portNotReadList.size(); i++)
+ // {
+ // PortInst p = portNotReadList.get(i);
+ // Rectangle2D r = bndNotReadList.get(i);
+ // double newWid = r.getWidth()+globalWidth;
+ // Rectangle2D rect = new Rectangle2D.Double(r.getX()-newWid, r.getY(),
+ // 2*newWid, r.getHeight()); // copy the rectangle to add extra width
+ //
+ // // Check possible new contacts added
+ // NodeInst minNi = connectToExistingContacts(p, rect, fillContactList,
+ // fillPortInstList);
+ // if (minNi != null)
+ // {
+ // int index = fillContactList.indexOf(minNi);
+ // PortInst fillNiPort = fillPortInstList.get(index);
+ // // Connecting the export in the top cell
+ // Route exportRoute = router.planRoute(topCell, p, fillNiPort,
+ // new Point2D.Double(p.getBounds().getCenterX(),
+ // p.getBounds().getCenterY()), null, false);
+ // Router.createRouteNoJob(exportRoute, topCell, true, false, null);
+ // }
+ // else
+ // {
+ // // Searching arcs again
+ // Geometric geom = routeToClosestArc(container, p, rect, 10,
+ // fillTransOut);
+ // if (geom == null)
+ // {
+ // ErrorLogger.MessageLog l = log.logError(p.describe(false) +
+ // " not connected", topCell, 0);
+ // l.addPoly(p.getPoly(), true, topCell);
+ // if (p.getPortProto() instanceof Export)
+ // l.addExport((Export)p.getPortProto(), true, topCell, null);
+ // l.addGeom(p.getNodeInst(), true, fillCell, null);
+ // }
+ // }
+ // }
+ return true;
+ }
+
+ /**
+ * Method to detect which fill nodes are overlapping in the top cell.
+ *
+ * @param cell
+ * @param fillTransUp
+ * matrix
+ */
+ private boolean detectOverlappingBars(Cell cell, FixpTransform fillTransUp,
+ HashSet<Geometric> nodesToRemove, FillGenJobContainer container) {
+ List<Layer.Function> tmp = new ArrayList<Layer.Function>();
+
+ // Check if any metalXY must be removed
+ for (Iterator<NodeInst> itNode = cell.getNodes(); itNode.hasNext();) {
+ NodeInst ni = itNode.next();
+
+ if (NodeInst.isSpecialNode(ni))
+ continue;
+
+ tmp.clear();
+ NodeProto np = ni.getProto();
+ if (ni.isCellInstance()) {
+ Cell subCell = (Cell) ni.getProto();
+ FixpTransform subTransUp = ni.transformOut(fillTransUp);
+ // No need of checking the rest of the elements if first one is
+ // detected.
+ if (detectOverlappingBars(subCell, subTransUp, nodesToRemove, container)) {
+ if (cell == container.fillCell)
+ nodesToRemove.add(ni);
+ else return true;
+ }
+ continue;
+ }
+ PrimitiveNode pn = (PrimitiveNode) np;
+ if (pn.getFunction().isPin())
+ continue; // pins have pseudo layers
+
+ for (Technology.NodeLayer tlayer : pn.getNodeLayers()) {
+ tmp.add(tlayer.getLayer().getFunction());
+ }
+ Rectangle2D rect = getSearchRectangle(ni.getBounds(), fillTransUp, container.drcSpacing);
+ if (searchCollision(topCell, rect, new Layer.Function.Set(tmp), null, new NodeInst[] {
+ container.fillNi, container.connectionNi }, null, null)) {
+ // Direct on last top fill cell
+ if (cell == container.fillCell)
+ nodesToRemove.add(ni);
+ else return true; // time to delete parent NodeInst
+ }
+ }
+
+ // Checking if any arc in FillCell collides with rest of the cells
+ for (Iterator<ArcInst> itArc = cell.getArcs(); itArc.hasNext();) {
+ ArcInst ai = itArc.next();
+ Layer.Function.Set thisLayer = new Layer.Function.Set(ai.getProto().getLayer(0).getFunction());
+ // Searching box must reflect DRC constrains
+ Rectangle2D rect = getSearchRectangle(ai.getBounds(), fillTransUp, container.drcSpacing);
+ if (searchCollision(topCell, rect, thisLayer, null, new NodeInst[] { container.fillNi,
+ container.connectionNi }, null, null)) {
+ if (cell == container.fillCell) {
+ nodesToRemove.add(ai);
+ // Remove exports and pins as well
+ nodesToRemove.add(ai.getTail().getPortInst().getNodeInst());
+ nodesToRemove.add(ai.getHead().getPortInst().getNodeInst());
+ } else return true; // time to delete parent NodeInst.
+ }
+ }
+ return false;
+ }
+
+ private void removeOverlappingBars(FillGenJobContainer container, FixpTransform fillTransOut) {
+ // Check if any metalXY must be removed
+ HashSet<Geometric> nodesToRemove = new HashSet<Geometric>();
+
+ // This function should replace NodeInsts for temporary cells that don't
+ // have elements overlapping
+ // the standard fill cells.
+ // DRC conditions to detect overlap otherwise too many elements/cells
+ // might be discarded.
+ detectOverlappingBars(container.fillCell, fillTransOut, nodesToRemove, container);
+
+ for (Geometric geo : nodesToRemove) {
+ System.out.println("Removing " + geo);
+ if (geo instanceof NodeInst)
+ ((NodeInst) geo).kill();
+ else ((ArcInst) geo).kill();
+ }
+ }
+
+ // private NodeInst connectToExistingContacts(PortInst p, Rectangle2D
+ // portBnd,
+ // List<NodeInst> fillContactList, List<PortInst> fillPortInstList)
+ // {
+ // double minDist = Double.POSITIVE_INFINITY;
+ // NodeInst minNi = null;
+ //
+ // for (int j = 0; j < fillContactList.size(); j++)
+ // {
+ // NodeInst ni = fillContactList.get(j);
+ // PortInst fillNiPort = fillPortInstList.get(j);
+ // // Checking only the X distance between a placed contact and the port
+ // Rectangle2D contBox = ni.getBounds();
+ //
+ // // check if contact is connected to the same grid
+ // if (fillNiPort.getPortProto().getCharacteristic() !=
+ // p.getPortProto().getCharacteristic())
+ // continue; // no match in network type
+ //
+ // // If they are not aligned on Y, discard
+ // if (!DBMath.areEquals(contBox.getCenterY(), portBnd.getCenterY()))
+ // continue;
+ // double pdx = Math.abs(Math.max(contBox.getMinX()-portBnd.getMaxX(),
+ // portBnd.getMinX()-contBox.getMaxX()));
+ // if (pdx < minDist)
+ // {
+ // minNi = ni;
+ // minDist = pdx;
+ // }
+ // }
+ // return minNi;
+ // }
+
+ private class FillGenJobContainer {
+ InteractiveRouter router;
+ Cell fillCell, connectionCell;
+ NodeInst fillNi, connectionNi;
+ List<PortInst> fillPortInstList;
+ List<NodeInst> fillContactList;
+ double drcSpacing;
+ boolean rotated; // tmp fix
+
+ FillGenJobContainer(InteractiveRouter r, Cell fC, NodeInst fNi, Cell cC, NodeInst cNi,
+ double drcSpacing, boolean rotated) {
+ this.router = r;
+ this.fillCell = fC;
+ this.fillNi = fNi;
+ this.connectionCell = cC;
+ this.connectionNi = cNi;
+ this.fillPortInstList = new ArrayList<PortInst>();
+ this.fillContactList = new ArrayList<NodeInst>();
+ this.drcSpacing = drcSpacing;
+ this.rotated = rotated;
+ }
+ }
+
+ /**
+ * THIS METHOD ASSUMES contactAreaOrig is horizontal!
+ */
+ /**
+ * Method to search for all overlaps with metal bars in the fill
+ *
+ * @param searchCell
+ * @param rotated
+ * true if original fill cell is rotated. This should be a
+ * temporary fix.
+ * @param handler
+ * structure containing elements that overlap with the given
+ * contactAreaOrig
+ * @param closestHandler
+ * structure containing elements that are close to the given
+ * contactAreaOrig
+ * @param p
+ * @param contactAreaOrig
+ * @param downTrans
+ * @param upTrans
+ * @return true if overlap was found
+ */
+ private boolean searchOverlapHierarchically(Cell searchCell, boolean rotated, GeometryHandler handler,
+ GeometryHandler closestHandler, PortConfig p, Rectangle2D contactAreaOrig,
+ FixpTransform downTrans, FixpTransform upTrans) {
+ EditingPreferences ep = getEditingPreferences();
+ Rectangle2D contactArea = new Rectangle2D.Double(contactAreaOrig.getX(), contactAreaOrig.getY(),
+ contactAreaOrig.getWidth(), contactAreaOrig.getHeight()); // contactAreaOrig.clone())
+ DBMath.transformRect(contactArea, downTrans);
+ Netlist fillNetlist = searchCell.getNetlist();
+ double contactAreaHeight = contactArea.getHeight();
+ double contactAreaWidth = contactArea.getWidth();
+ // Give high priority to lower arcs
+ HashMap<Layer, List<ArcInst>> protoMap = new HashMap<Layer, List<ArcInst>>();
+ boolean noIntermediateCells = false;
+ TechType techType = fillGenConfig.getTechType();
+
+ for (Iterator<Geometric> it = searchCell.searchIterator(contactArea); it.hasNext();) {
+ // Check if there is a contact on that place already!
+ Geometric geom = it.next();
+
+ if (geom instanceof NodeInst) {
+ NodeInst ni = (NodeInst) geom;
+ if (!ni.isCellInstance())
+ continue;
+
+ FixpTransform fillIn = ni.transformIn();
+ FixpTransform fillUp = ni.transformOut(upTrans);
+ // In case of being a cell
+ if (searchOverlapHierarchically((Cell) ni.getProto(), rotated, handler, closestHandler, p,
+ contactArea, fillIn, fillUp))
+ noIntermediateCells = true;
+ continue;
+ }
+
+ ArcInst ai = (ArcInst) geom;
+ ArcProto ap = ai.getProto();
+ Network arcNet = fillNetlist.getNetwork(ai, 0);
+
+ // No export with the same characteristic found in this netlist
+ if (arcNet.findExportWithSameCharacteristic(p.e) == null)
+ continue; // no match in network type
+
+ if (ap == techType.m2() || ap == techType.m1() || !ap.getFunction().isMetal())
+ continue;
+
+ // if (ap != Tech.m3)
+ // {
+ // System.out.println("picking metal");
+ // continue; // Only metal 3 arcs
+ // }
+
+ // Adding now
+ Layer layer = ap.getLayerIterator().next();
+ List<ArcInst> list = protoMap.get(layer);
+ if (list == null) {
+ list = new ArrayList<ArcInst>();
+ protoMap.put(layer, list);
+ }
+ list.add(ai);
+ }
+
+ if (noIntermediateCells)
+ return true; // done already down in the hierarchy
+
+ // Assign priority to lower metal bars. eg m3 instead of m4
+ Set<Layer> results = protoMap.keySet();
+ List<Layer> listOfLayers = new ArrayList<Layer>(results.size());
+ listOfLayers.addAll(results);
+ Layer.getLayersSortedByRule(listOfLayers, Layer.LayerSortingType.ByName);
+ double closestDist = Double.POSITIVE_INFINITY;
+ Rectangle2D closestRect = null;
+
+ // Give priority to port layer (p.l)
+ int index = listOfLayers.indexOf(p.l);
+ if (index > -1) {
+ Layer first = listOfLayers.get(0);
+ listOfLayers.set(0, p.l);
+ listOfLayers.set(index, first);
+ }
+
+ // Now select possible pins
+ for (Layer layer : listOfLayers) {
+ ArcProto ap = findArcProtoFromLayer(layer);
+ boolean horizontalBar = (rotated) ? (ap == techType.m3() || ap == techType.m5())
+ : (ap == techType.m4() || ap == techType.m6());
+ PrimitiveNode defaultContact = null;
+
+ if (horizontalBar) {
+ // continue;
+ if ((!rotated && ap == techType.m4()) || (rotated && ap == techType.m3()))
+ defaultContact = techType.m3m4();
+ else if ((!rotated && ap == techType.m6()) || (rotated && ap == techType.m5()))
+ defaultContact = techType.m4m5();
+ else assert (false);
+ }
+
+ boolean found = false;
+
+ Layer theLayer = null;
+ for (ArcInst ai : protoMap.get(layer)) {
+ Rectangle2D geomBnd = ai.getBounds();
+ theLayer = layer;
+
+ // Add only the piece that overlap. If more than 1 arc covers
+ // the same area -> only 1 contact
+ // will be added.
+ Rectangle2D newElem = null;
+ double usefulBar, newElemMin, newElemMax, areaMin, areaMax, geoMin, geoMax;
+
+ if (horizontalBar) {
+ if (layer != p.l)
+ continue; // only when they match in layer so the same
+ // contacts can be used
+ usefulBar = geomBnd.getHeight();
+ // search for the contacts m3m4 at least
+ Network net = fillNetlist.getNetwork(ai, 0);
+ List<NodeInst> nodes = new ArrayList<NodeInst>();
+
+ // get contact nodes in the same network
+ for (Iterator<NodeInst> it = searchCell.getNodes(); it.hasNext();) {
+ NodeInst ni = it.next();
+ Rectangle2D r = ni.getBounds();
+ // only contacts
+ if (!ni.getProto().getFunction().isContact())
+ continue;
+ // Only those that overlap 100% with the contact
+ // otherwise it would add zig-zag extra metals
+ if (!r.intersects(geomBnd))
+ continue;
+ for (Iterator<PortInst> pit = ni.getPortInsts(); pit.hasNext();) {
+ PortInst pi = pit.next();
+ // Only those
+ if (fillNetlist.getNetwork(pi) == net) {
+ nodes.add(ni);
+ break; // stop the loop here
+ }
+ }
+ }
+ // No contact on that bar
+ if (nodes.size() == 0)
+ newElem = new Rectangle2D.Double(contactArea.getX(), geomBnd.getY(), defaultContact
+ .getDefWidth(ep), usefulBar);
+ else {
+ // better if find a vertical bar by closest distance
+ // continue;
+ // search for closest distance or I could add all!!
+ // Taking the first element for now
+ NodeInst ni = nodes.get(0);
+ // Check lower layer of the contact so it won't add
+ // unnecessary contacts
+ PrimitiveNode np = (PrimitiveNode) ni.getProto();
+ // layerTmpList.clear();
+ // for (Iterator<Layer> it = np.getLayerIterator();
+ // it.hasNext(); )
+ // {
+ // Layer l = it.next();
+ // if (l.getFunction().isMetal())
+ // layerTmpList.add(l);
+ // }
+ // Collections.sort(layerTmpList,
+ // Layer.layerSortByName);
+ // theLayer = layerTmpList.get(0);
+ Rectangle2D r = ni.getBounds();
+ double contactW = ni.getXSizeWithoutOffset();
+ double contactH = ni.getYSizeWithoutOffset();
+ r = new Rectangle2D.Double(r.getCenterX() - contactW / 2, contactArea.getY(),
+ contactW, contactAreaHeight);
+ geomBnd = r;
+ newElem = geomBnd;
+ }
+ newElemMin = newElem.getMinY();
+ newElemMax = newElem.getMaxY();
+ areaMin = contactArea.getMinY();
+ areaMax = contactArea.getMaxY();
+ geoMin = geomBnd.getMinY();
+ geoMax = geomBnd.getMaxY();
+ } else {
+ if (rotated) {
+ usefulBar = geomBnd.getHeight();
+ newElem = new Rectangle2D.Double(contactArea.getX(), geomBnd.getY(),
+ contactAreaWidth, usefulBar);
+ newElemMin = newElem.getMinY();
+ newElemMax = newElem.getMaxY();
+ areaMin = contactArea.getMinY();
+ areaMax = contactArea.getMaxY();
+ geoMin = geomBnd.getMinY();
+ geoMax = geomBnd.getMaxY();
+ } else {
+ usefulBar = geomBnd.getWidth();
+ newElem = new Rectangle2D.Double(geomBnd.getX(), contactArea.getY(), usefulBar,
+ contactAreaHeight);
+ newElemMin = newElem.getMinX();
+ newElemMax = newElem.getMaxX();
+ areaMin = contactArea.getMinX();
+ areaMax = contactArea.getMaxX();
+ geoMin = geomBnd.getMinX();
+ geoMax = geomBnd.getMaxX();
+ }
+ }
+
+ // Don't consider no overlapping areas
+ if (newElemMax < areaMin || areaMax < newElemMin)
+ continue;
+ boolean containMin = newElemMin <= areaMin && areaMin <= newElemMax;
+ boolean containMax = newElemMin <= areaMax && areaMax <= newElemMax;
+
+ // Either end is not contained otherwise the contact is fully
+ // contained by the arc
+ if (!containMin || !containMax) {
+ // Getting the intersection along X/Y axis. Along YX it
+ // should cover completely
+ assert (geoMin == newElemMin);
+ assert (geoMax == newElemMax);
+
+ double min = Math.max(geoMin, areaMin);
+ double max = Math.min(geoMax, areaMax);
+ double diff = max - min;
+ double overlap = (diff) / usefulBar;
+ // Checking if new element is completely inside the
+ // contactArea otherwise routeToClosestArc could add
+ // the missing contact
+ if (overlap < fillGenConfig.minOverlap) {
+ System.out.println("Not enough overlap (" + overlap + ") in " + ai + " to cover "
+ + p.p);
+ double val = Math.abs(diff);
+ if (closestDist > val) // only in this case the elements
+ // are close enough but not
+ // touching
+ {
+ closestDist = val;
+ closestRect = newElem;
+ }
+ continue;
+ }
+ }
+ // Transforming geometry up to fillCell coordinates
+ DBMath.transformRect(newElem, upTrans);
+ // Adding element
+ handler.add(theLayer, newElem);
+ found = true;
+ }
+ if (found)
+ return true; // only one set for now if something overlapping
+ // was found
+
+ if (horizontalBar || closestRect == null)
+ continue;
+ // trying with closest vertical arcs
+ // Transforming geometry up to fillCell coordinates
+ DBMath.transformRect(closestRect, upTrans);
+ // Adding element
+ closestHandler.add(theLayer, closestRect);
+ // return true;
+ }
+ return false;
+ }
+
+ private static class FillGenArcConnect {
+ Rectangle2D rect;
+ ArcInst ai;
+
+ FillGenArcConnect(Rectangle2D r, ArcInst ai) {
+ this.rect = r;
+ this.ai = ai;
+ }
+ }
+
+ /**
+ * Second try
+ *
+ * @param searchCell
+ * @param rotated
+ * @param p
+ * @param contactAreaOrig
+ * @param downTrans
+ * @param upTrans
+ * @return Export object that overlaps with the given geometry
+ */
+ private Export searchOverlapHierarchicallyOverPort(FillGenJobContainer container, Cell searchCell,
+ boolean rotated, PortConfig p, Rectangle2D contactAreaOrig, FixpTransform downTrans,
+ FixpTransform upTrans, boolean noClosestPin) {
+ EditingPreferences ep = getEditingPreferences();
+ Rectangle2D contactArea = (Rectangle2D) contactAreaOrig.clone();
+ DBMath.transformRect(contactArea, downTrans);
+ Netlist fillNetlist = searchCell.getNetlist();
+ double contactAreaHeight = contactArea.getHeight();
+ double contactAreaWidth = contactArea.getWidth();
+ // Give high priority to lower arcs
+ HashMap<Layer, List<ArcInst>> protoMap = new HashMap<Layer, List<ArcInst>>();
+ boolean noIntermediateCells = false;
+ TechType techType = fillGenConfig.getTechType();
+
+ for (Iterator<Geometric> it = searchCell.searchIterator(contactArea); it.hasNext();) {
+ // Check if there is a contact on that place already!
+ Geometric geom = it.next();
+
+ if (geom instanceof NodeInst) {
+ NodeInst ni = (NodeInst) geom;
+ if (!ni.isCellInstance())
+ continue;
+
+ FixpTransform fillIn = ni.transformIn();
+ FixpTransform fillUp = ni.transformOut(upTrans);
+ // In case of being a cell
+ Export export = searchOverlapHierarchicallyOverPort(container, (Cell) ni.getProto(), rotated,
+ p, contactArea, fillIn, fillUp, noClosestPin);
+ if (export != null) {
+ PortInst pinPort = ni.findPortInstFromProto(export);
+ Export pinExport = Export.newInstance(searchCell, pinPort, "proj-" + p.e.getName(), ep);
+ pinExport.setCharacteristic(p.e.getCharacteristic());
+ noIntermediateCells = true;
+ return pinExport;
+ }
+ continue;
+ }
+
+ ArcInst ai = (ArcInst) geom;
+ ArcProto ap = ai.getProto();
+ Network arcNet = fillNetlist.getNetwork(ai, 0);
+
+ // No export with the same characteristic found in this netlist
+ if (arcNet.findExportWithSameCharacteristic(p.e) == null)
+ continue; // no match in network type
+
+ if (ap == techType.m2() || ap == techType.m1() || !ap.getFunction().isMetal())
+ continue;
+
+ // Adding now
+ Layer layer = ap.getLayerIterator().next();
+ List<ArcInst> list = protoMap.get(layer);
+ if (list == null) {
+ list = new ArrayList<ArcInst>();
+ protoMap.put(layer, list);
+ }
+ list.add(ai);
+ }
+
+ if (noIntermediateCells)
+ assert (false); // it shouldn't reach this point?
+
+ // Assign priority to lower metal bars. eg m3 instead of m4
+ Set<Layer> results = protoMap.keySet();
+ List<Layer> listOfLayers = new ArrayList<Layer>(results.size());
+ listOfLayers.addAll(results);
+ Layer.getLayersSortedByRule(listOfLayers, Layer.LayerSortingType.ByName);
+ double closestDist = Double.POSITIVE_INFINITY;
+ Rectangle2D closestRect = null;
+ ArcInst closestArc = null;
+
+ // Give priority to port layer (p.l)
+ int index = listOfLayers.indexOf(p.l);
+ if (index > -1) {
+ Layer first = listOfLayers.get(0);
+ listOfLayers.set(0, p.l);
+ listOfLayers.set(index, first);
+ }
+
+ // Now select possible pins
+ for (Layer layer : listOfLayers) {
+ ArcProto ap = findArcProtoFromLayer(layer);
+ boolean horizontalBar = (rotated) ? (ap == techType.m3() || ap == techType.m5())
+ : (ap == techType.m4() || ap == techType.m6());
+ PrimitiveNode defaultContact = null;
+
+ if (horizontalBar) {
+ // continue;
+ if ((!rotated && ap == techType.m4()) || (rotated && ap == techType.m3()))
+ defaultContact = techType.m3m4();
+ else if ((!rotated && ap == techType.m6()) || (rotated && ap == techType.m5()))
+ defaultContact = techType.m4m5();
+ else assert (false);
+ }
+
+ // Layer theLayer = null;
+ // sort the elements in the list otherwise the results are not
+ // deterministic
+ List<ArcInst> theSortedList = protoMap.get(layer);
+ Collections.sort(theSortedList, new ArcInst.ArcsByLength());
+ for (ArcInst ai : theSortedList) // protoMap.get(layer))
+ {
+ Rectangle2D geomBnd = ai.getBounds();
+ // Layer theLayer = layer;
+
+ // Add only the piece that overlap. If more than 1 arc covers
+ // the same area -> only 1 contact
+ // will be added.
+ Rectangle2D newElem = null;
+ double usefulBar, newElemMin, newElemMax, areaMin, areaMax, geoMin, geoMax;
+
+ if (horizontalBar) {
+ if (layer != p.l)
+ continue; // only when they match in layer so the same
+ // contacts can be used
+ usefulBar = geomBnd.getHeight();
+ // search for the contacts m3m4 at least
+ Network net = fillNetlist.getNetwork(ai, 0);
+ List<NodeInst> nodes = new ArrayList<NodeInst>();
+
+ // get contact nodes in the same network
+ for (Iterator<NodeInst> it = searchCell.getNodes(); it.hasNext();) {
+ NodeInst ni = it.next();
+ Rectangle2D r = ni.getBounds();
+ // only contacts
+ if (!ni.getProto().getFunction().isContact())
+ continue;
+ // Only those that overlap 100% with the contact
+ // otherwise it would add zig-zag extra metals
+ if (!r.intersects(geomBnd))
+ continue;
+ for (Iterator<PortInst> pit = ni.getPortInsts(); pit.hasNext();) {
+ PortInst pi = pit.next();
+ // Only those
+ if (fillNetlist.getNetwork(pi) == net) {
+ nodes.add(ni);
+ break; // stop the loop here
+ }
+ }
+ }
+ // No contact on that bar
+ if (nodes.size() == 0)
+ newElem = new Rectangle2D.Double(contactArea.getX(), geomBnd.getY(), defaultContact
+ .getDefWidth(ep), usefulBar);
+ else {
+ // better if find a vertical bar by closest distance
+ // continue;
+ // search for closest distance or I could add all!!
+ // Taking the first element for now
+ NodeInst ni = nodes.get(0);
+ // Check lower layer of the contact so it won't add
+ // unnecessary contacts
+ PrimitiveNode np = (PrimitiveNode) ni.getProto();
+ // layerTmpList.clear();
+ // for (Iterator<Layer> it = np.getLayerIterator();
+ // it.hasNext(); )
+ // {
+ // Layer l = it.next();
+ // if (l.getFunction().isMetal())
+ // layerTmpList.add(l);
+ // }
+ // Collections.sort(layerTmpList,
+ // Layer.layerSortByName);
+ // theLayer = layerTmpList.get(0);
+ Rectangle2D r = ni.getBounds();
+ double contactW = ni.getXSizeWithoutOffset();
+ double contactH = ni.getYSizeWithoutOffset();
+ r = new Rectangle2D.Double(r.getCenterX() - contactW / 2, contactArea.getY(),
+ contactW, contactAreaHeight);
+ geomBnd = r;
+ newElem = geomBnd;
+ }
+ newElemMin = newElem.getMinY();
+ newElemMax = newElem.getMaxY();
+ areaMin = contactArea.getMinY();
+ areaMax = contactArea.getMaxY();
+ geoMin = geomBnd.getMinY();
+ geoMax = geomBnd.getMaxY();
+ } else {
+ if (rotated) {
+ usefulBar = geomBnd.getHeight();
+ newElem = new Rectangle2D.Double(contactArea.getX(), geomBnd.getY(),
+ contactAreaWidth, usefulBar);
+ newElemMin = newElem.getMinY();
+ newElemMax = newElem.getMaxY();
+ areaMin = contactArea.getMinY();
+ areaMax = contactArea.getMaxY();
+ geoMin = geomBnd.getMinY();
+ geoMax = geomBnd.getMaxY();
+ } else {
+ usefulBar = geomBnd.getWidth();
+ newElem = new Rectangle2D.Double(geomBnd.getX(), contactArea.getY(), usefulBar,
+ contactAreaHeight);
+ newElemMin = newElem.getMinX();
+ newElemMax = newElem.getMaxX();
+ areaMin = contactArea.getMinX();
+ areaMax = contactArea.getMaxX();
+ geoMin = geomBnd.getMinX();
+ geoMax = geomBnd.getMaxX();
+ }
+ }
+
+ // Don't consider no overlapping areas
+ if (newElemMax < areaMin || areaMax < newElemMin)
+ continue;
+ boolean containMin = newElemMin <= areaMin && areaMin <= newElemMax;
+ boolean containMax = newElemMin <= areaMax && areaMax <= newElemMax;
+
+ // Either end is not contained otherwise the contact is fully
+ // contained by the arc
+ if (!containMin || !containMax) {
+ // Getting the intersection along X/Y axis. Along YX it
+ // should cover completely
+ assert (geoMin == newElemMin);
+ assert (geoMax == newElemMax);
+
+ double min = Math.max(geoMin, areaMin);
+ double max = Math.min(geoMax, areaMax);
+ double diff = max - min;
+ double overlap = (diff) / usefulBar;
+ // Checking if new element is completely inside the
+ // contactArea otherwise routeToClosestArc could add
+ // the missing contact
+ if (overlap < fillGenConfig.minOverlap || !noClosestPin) {
+ if (noClosestPin)
+ System.out.println("Not enough overlap (" + overlap + ") in " + ai + " to cover "
+ + p.p);
+ double val = Math.abs(diff);
+ if (closestDist > val) // only in this case the elements
+ // are close enough but not
+ // touching
+ {
+ closestDist = val;
+ closestRect = newElem;
+ closestArc = ai;
+ }
+ continue;
+ }
+ }
+
+ if (noClosestPin) {
+ closestDist = 0; // found
+ closestRect = newElem;
+ closestArc = ai;
+ break;
+ }
+ }
+
+ if (noClosestPin && closestRect != null)
+ break;
+ if (horizontalBar || closestRect == null)
+ continue;
+ }
+ if (closestRect != null) {
+ if (!noClosestPin)
+ System.out.println("Selecting a closest arc!");
+ PrimitiveNode thePin = findPrimitiveNodeFromLayer(closestArc.getProto().getLayerIterator().next());
+ NodeInst pinOnArc = LayoutLib.newNodeInst(thePin, ep, closestRect.getCenterX(), closestRect
+ .getCenterY(), thePin.getDefWidth(ep), contactAreaHeight, 0, closestArc.getParent());
+ EPoint center = pinOnArc.getOnlyPortInst().getCenter();
+ Route exportRoute = container.router.planRoute(closestArc.getParent(), closestArc.getPortInst(0),
+ pinOnArc.getOnlyPortInst(), center, null, ep, false, false, null, null);
+ Map<ArcProto, Integer> arcsCreatedMap = new HashMap<ArcProto, Integer>();
+ Map<NodeProto, Integer> nodesCreatedMap = new HashMap<NodeProto, Integer>();
+ Router.createRouteNoJob(exportRoute, closestArc.getParent(), arcsCreatedMap, nodesCreatedMap, ep);
+ Export pinExport = Export.newInstance(closestArc.getParent(), pinOnArc.getOnlyPortInst(), "proj-"
+ + p.e.getName(), ep);
+ pinExport.setCharacteristic(p.e.getCharacteristic());
+ return pinExport;
+ }
+ // I might work with the best case
+ return null;
+ }
+
+ /**
+ * Method to find corresponding metal pin associated to the given layer
+ *
+ * @param layer
+ * @return PrimitiveNode pin for the given layer
+ */
+ private static PrimitiveNode findPrimitiveNodeFromLayer(Layer layer) {
+ for (PrimitiveNode pin : VddGndStraps.PINS) {
+ if (pin != null && layer == pin.getLayerIterator().next()) {
+ return pin; // found
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Method to find corresponding metal arc associated to the given layer
+ *
+ * @param layer
+ * @return Primitive of a metal arc
+ */
+ private static ArcProto findArcProtoFromLayer(Layer layer) {
+ for (ArcProto arc : VddGndStraps.METALS) {
+ if (arc != null && layer == arc.getLayerIterator().next()) {
+ return arc; // found
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Method to add all possible contacts in connection cell based on the
+ * overlap of a given metal2 area and fill cell. THIS ONLY WORK if first
+ * fill bar is vertical
+ *
+ * @param container
+ * @param p
+ * @param contactArea
+ * @param nodeTransOut
+ * null if the port is on the top cell
+ * @param fillTransOutToCon
+ * @return Node instance of a contact added.
+ */
+ private NodeInst addAllPossibleContacts(FillGenJobContainer container, PortConfig p,
+ Rectangle2D contactArea, FixpTransform nodeTransOut, FixpTransform fillTransIn,
+ FixpTransform fillTransOutToCon, FixpTransform conTransOut, Area exclusionArea) {
+ EditingPreferences ep = getEditingPreferences();
+ // Until this point, contactArea is at the fillCell level
+ // Contact area will contain the remaining are to check
+ double contactAreaHeight = contactArea.getHeight();
+
+ NodeInst added = null;
+ // Transforming rectangle with gnd/power metal into the connection cell
+ if (nodeTransOut != null)
+ DBMath.transformRect(contactArea, nodeTransOut);
+ if (exclusionArea != null && exclusionArea.intersects(contactArea))
+ return null; // can't connect here.
+
+ GeometryHandler overlapHandler = GeometryHandler.createGeometryHandler(
+ GeometryHandler.GHMode.ALGO_SWEEP, 1);
+ GeometryHandler closestHandler = GeometryHandler.createGeometryHandler(
+ GeometryHandler.GHMode.ALGO_SWEEP, 1);
+ GeometryHandler handler;
+
+ searchOverlapHierarchically(container.fillCell, container.rotated, overlapHandler, closestHandler, p,
+ contactArea, fillTransIn, GenMath.MATID);
+ handler = overlapHandler;
+ handler.postProcess(false);
+ closestHandler.postProcess(false);
+
+ Set<Layer> overlapResults = handler.getKeySet();
+ Set<Layer> closestResults = closestHandler.getKeySet();
+
+ List<Layer> listOfLayers = new ArrayList<Layer>(overlapResults.size());
+ listOfLayers.addAll(overlapResults);
+ listOfLayers.addAll(closestResults);
+ Layer.getLayersSortedByRule(listOfLayers, Layer.LayerSortingType.ByName);
+
+ int size = listOfLayers.size();
+
+ // assert(size <= 1); // Must contain only m3
+
+ if (size == 0)
+ return null;
+
+ Rectangle2D portInConFill = new Rectangle2D.Double();
+ portInConFill.setRect(p.pPoly.getBounds2D());
+ DBMath.transformRect(portInConFill, fillTransIn);
+ TechType techType = fillGenConfig.getTechType();
+
+ // Creating the corresponding export in connectionNi (projection pin)
+ // This should be done only once!
+ PrimitiveNode thePin = findPrimitiveNodeFromLayer(p.l);
+ assert (thePin != null);
+ assert (thePin != techType.m1pin()); // should start from m2
+ NodeInst pinNode = null;
+ PortInst pin = null;
+
+ // Loop along all possible connections (different layers)
+ // from both GeometricHandler structures.
+ for (Layer layer : listOfLayers) {
+ if (!layer.getFunction().isMetal())
+ continue; // in case of active arcs!
+ Collection set = handler.getObjects(layer, false, true);
+
+ if (set == null || set.size() == 0) // information from
+ // closestHandling
+ set = closestHandler.getObjects(layer, false, true);
+
+ if (!(set != null && set.size() > 0))
+ System.out.println("Assert error");
+ // assert (set != null && set.size() > 0);
+ if (set == null) {
+ System.out.println("Null set");
+ continue;
+ }
+ // Get connecting metal contact (PrimitiveNode) starting from
+ // techPin up to the power/vdd bar found
+ List<Layer.Function> fillLayers = new ArrayList<Layer.Function>();
+ PrimitiveNode topPin = findPrimitiveNodeFromLayer(layer);
+ PrimitiveNode topContact = null;
+ int start = -1;
+ int end = -1;
+ for (int i = 0; i < VddGndStraps.PINS.length; i++) {
+ if (start == -1 && VddGndStraps.PINS[i] == thePin)
+ start = i;
+ if (end == -1 && VddGndStraps.PINS[i] == topPin)
+ end = i;
+ }
+ if (start > end) {
+ int tmp = start;
+ start = end;
+ end = tmp;
+ }
+ for (int i = start; i <= end; i++) {
+ fillLayers.add(VddGndStraps.PINS[i].getLayerIterator().next().getFunction());
+ if (i < end)
+ topContact = VddGndStraps.fillContacts[i];
+ }
+
+ // assert(topContact != null);
+ boolean horizontalBar = (container.rotated) ? (topPin == techType.m3pin() || topPin == techType
+ .m5pin()) : (topPin == techType.m4pin() || topPin == techType.m6pin());
+
+ Layer.Function.Set fillLayersSet = new Layer.Function.Set(fillLayers);
+ for (Iterator it = set.iterator(); it.hasNext();) {
+ // ALGO_SWEEP retrieves only PolyBase
+ PolyBase poly = (PolyBase) it.next();
+ Rectangle2D newElemFill = poly.getBounds2D();
+ double newElemFillWidth = newElemFill.getWidth();
+ double newElemFillHeight = newElemFill.getHeight();
+
+ // Location of new element in fillCell
+ Rectangle2D newElemConnect = (Rectangle2D) newElemFill.clone();
+ DBMath.transformRect(newElemConnect, fillTransOutToCon);
+
+ // Location of new contact from top cell
+ Rectangle2D newElemTop = (Rectangle2D) newElemConnect.clone();
+ DBMath.transformRect(newElemTop, conTransOut);
+
+ // Get connecting metal contact (PrimitiveNode) starting from
+ // techPin up to the power/vdd bar found
+ // Search if there is a collision with existing nodes/arcs
+ if (searchCollision(topCell, newElemTop, fillLayersSet, p, new NodeInst[] { container.fillNi,
+ container.connectionNi }, null, null))
+ continue;
+
+ // The first time but only after at least one element can be
+ // placed
+ if (pinNode == null) {
+ pinNode = LayoutLib.newNodeInst(thePin, ep, portInConFill.getCenterX(), portInConFill
+ .getCenterY(), thePin.getDefWidth(ep), contactAreaHeight, 0,
+ container.connectionCell);
+ pin = pinNode.getOnlyPortInst();
+ }
+
+ if (topContact != null) {
+ // adding contact
+ // center if the overlapping was found by just overlapping
+ // of the vertical metal bar
+ // boolean center = horizontalBar ||
+ // newElemConnect.getCenterY() != contactArea.getCenterY();
+ added = horizontalBar ? LayoutLib.newNodeInst(topContact, ep, newElemConnect.getCenterX(),
+ newElemConnect.getCenterY(), newElemFillWidth, newElemFillHeight, 0,
+ container.connectionCell) : LayoutLib.newNodeInst(topContact, ep, newElemConnect
+ .getCenterX(), newElemConnect.getCenterY(), newElemFillWidth, contactAreaHeight,
+ 0, container.connectionCell);
+ } else // on the same layer as thePin
+ added = pinNode;
+
+ container.fillContactList.add(added);
+
+ // route new pin instance in connectioNi with new contact
+ Route pinExportRoute = container.router.planRoute(container.connectionCell, pin, added
+ .getOnlyPortInst(), new Point2D.Double(portInConFill.getCenterX(), portInConFill
+ .getCenterY()), null, ep, false, false, null, null);
+ Map<ArcProto, Integer> arcsCreatedMap = new HashMap<ArcProto, Integer>();
+ Map<NodeProto, Integer> nodesCreatedMap = new HashMap<NodeProto, Integer>();
+ Router.createRouteNoJob(pinExportRoute, container.connectionCell, arcsCreatedMap,
+ nodesCreatedMap, ep);
+
+ // It was removed by the vertical router
+ if (!pin.isLinked()) {
+ pinNode = pinExportRoute.getStart().getNodeInst();
+ pin = pinExportRoute.getStart().getPortInst();
+ }
+
+ // Adding the connection to the fill via the exports.
+ // Looking for closest export in fillCell.
+ PortInst fillNiPort = null;
+ double minDistance = Double.POSITIVE_INFINITY;
+
+ for (Iterator<Export> e = container.fillNi.getExports(); e.hasNext();) {
+ Export exp = e.next();
+ PortInst port = exp.getOriginalPort();
+
+ // The port characteristics must be identical
+ if (port.getPortProto().getCharacteristic() != p.e.getCharacteristic())
+ continue;
+
+ Rectangle2D geo = port.getPoly().getBounds2D();
+ assert (fillGenConfig.evenLayersHorizontal);
+ double deltaX = geo.getCenterX() - newElemConnect.getCenterX();
+ double deltaY = geo.getCenterY() - newElemConnect.getCenterY();
+
+ boolean condition = (horizontalBar) ? DBMath.isInBetween(geo.getCenterY(), newElemConnect
+ .getMinY(), newElemConnect.getMaxY()) : DBMath.isInBetween(geo.getCenterX(),
+ newElemConnect.getMinX(), newElemConnect.getMaxX());
+ if (!condition)
+ continue; // only align with this so it could guarantee
+ // correct arc (M3)
+ double dist = Math.sqrt(deltaX * deltaX + deltaY * deltaY);
+ if (DBMath.isGreaterThan(minDistance, dist)) {
+ minDistance = dist;
+ fillNiPort = port;
+ }
+ }
+ if (fillNiPort != null) {
+ EPoint center = fillNiPort.getCenter();
+ Route exportRoute = container.router.planRoute(container.connectionCell, added
+ .getOnlyPortInst(), fillNiPort, center, null, ep, false, false, null, null);
+ Router.createRouteNoJob(exportRoute, container.connectionCell, arcsCreatedMap,
+ nodesCreatedMap, ep);
+ }
+ }
+
+ // Done at the end so extra connections would not produce
+ // collisions.
+ // Routing the new contact to topCell in connectNi instead of top
+ // cell
+ // Export connect projected pin in ConnectionCell
+ if (pinNode != null) // at least done for one
+ {
+ Export pinExport = Export.newInstance(container.connectionCell, pin, "proj-" + p.e.getName(), ep);
+ assert (pinExport != null);
+ pinExport.setCharacteristic(p.e.getCharacteristic());
+ // Connect projected pin in ConnectionCell with real port
+ PortInst pinPort = container.connectionNi.findPortInstFromProto(pinExport);
+ Route conTopExportRoute = container.router.planRoute(topCell, p.p, pinPort,
+ new Point2D.Double(p.pPoly.getBounds2D().getCenterX(), p.pPoly.getBounds2D()
+ .getCenterY()), null, ep, false, false, null, null);
+ Map<ArcProto, Integer> arcsCreatedMap = new HashMap<ArcProto, Integer>();
+ Map<NodeProto, Integer> nodesCreatedMap = new HashMap<NodeProto, Integer>();
+ Router.createRouteNoJob(conTopExportRoute, topCell, arcsCreatedMap, nodesCreatedMap, ep);
+
+ return added;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Method to add all possible contacts in connection cell based on the
+ * overlap of a given metal2 area and fill cell. THIS ONLY WORK if first
+ * fill bar is vertical
+ *
+ * @param container
+ * @param p
+ * @param contactArea
+ * @param nodeTransOut
+ * null if the port is on the top cell
+ * @return Node instance of a metal contact added.
+ */
+ private NodeInst addAllPossibleContactsOverPort(FillGenJobContainer container, PortConfig p,
+ Rectangle2D contactArea, FixpTransform nodeTransOut, FixpTransform fillTransIn,
+ Area exclusionArea, boolean noClosestPin) {
+ EditingPreferences ep = getEditingPreferences();
+ // Until this point, contactArea is at the fillCell level
+ // Contact area will contain the remaining are to check
+ double contactAreaHeight = contactArea.getHeight();
+
+ // Transforming rectangle with gnd/power metal into the connection cell
+ if (nodeTransOut != null)
+ DBMath.transformRect(contactArea, nodeTransOut);
+ if (exclusionArea != null && exclusionArea.intersects(contactArea))
+ return null; // can't connect here.
+
+ Export fillExport = searchOverlapHierarchicallyOverPort(container, container.fillCell,
+ container.rotated, p, contactArea, fillTransIn, GenMath.MATID, noClosestPin);
+
+ if (fillExport == null)
+ return null;
+
+ // fillExpor in connectionCell
+ PortInst pinPort = container.fillNi.findPortInstFromProto(fillExport);
+
+ // Creating the corresponding export in connectionNi (projection pin)
+ // This should be done only once!
+ PrimitiveNode thePin = findPrimitiveNodeFromLayer(p.l);
+ TechType techType = fillGenConfig.getTechType();
+ assert (thePin != null);
+ assert (thePin != techType.m1pin()); // should start from m2
+ Rectangle2D portInConFill = new Rectangle2D.Double();
+ portInConFill.setRect(p.pPoly.getBounds2D());
+ DBMath.transformRect(portInConFill, fillTransIn);
+ NodeInst pinNode = LayoutLib.newNodeInst(thePin, ep, portInConFill.getCenterX(), portInConFill
+ .getCenterY(), thePin.getDefWidth(ep), contactAreaHeight, 0, container.connectionCell);
+ PortInst pin = pinNode.getOnlyPortInst();
+
+ // route new pin instance in connectioNi with new contact
+ Route pinExportRoute = container.router.planRoute(container.connectionCell, pin, pinPort,
+ new Point2D.Double(portInConFill.getCenterX(), portInConFill.getCenterY()), null, ep, false,
+ false, null, null);
+ Map<ArcProto, Integer> arcsCreatedMap = new HashMap<ArcProto, Integer>();
+ Map<NodeProto, Integer> nodesCreatedMap = new HashMap<NodeProto, Integer>();
+ Router.createRouteNoJob(pinExportRoute, container.connectionCell, arcsCreatedMap, nodesCreatedMap, ep);
+
+ // Connecting with top cell
+
+ Export pinExport = Export.newInstance(container.connectionCell, pin, "proj-" + p.e.getName(), ep);
+ // assert(pinExport != null);
+ if (pinExport != null) {
+ pinExport.setCharacteristic(p.e.getCharacteristic());
+ // Connect projected pin in ConnectionCell with real port
+ PortInst pinTopPort = container.connectionNi.findPortInstFromProto(pinExport);
+ Route conTopExportRoute = container.router
+ .planRoute(topCell, p.p, pinTopPort, new Point2D.Double(p.pPoly.getBounds2D()
+ .getCenterX(), p.pPoly.getBounds2D().getCenterY()), null, ep, false, false, null,
+ null);
+ Router.createRouteNoJob(conTopExportRoute, topCell, arcsCreatedMap, nodesCreatedMap, ep);
+ } else System.out.println("Error here");
+ return pinNode;
+ }
+
+ /**
+ * Auxiliary class to hold port and its corresponding layer so no extra
+ * calculation has to be done later.
+ */
+ protected static class PortConfig {
+ PortInst p;
+ Export e;
+ Layer l;
+ Poly pPoly; // to speed up the progress because PortInst.getPoly() calls
+ // getShape()
+
+ PortConfig(PortInst p, Export e, Layer l) {
+ this.e = e;
+ this.p = p;
+ this.pPoly = p.getPoly();
+ this.l = l;
+ }
+ }
+}
diff --git a/com/sun/electric/tool/generator/layout/fillCell/FillCellTool.java b/com/sun/electric/tool/generator/layout/fillCell/FillCellTool.java
new file mode 100644
index 0000000..5d14f72
--- /dev/null
+++ b/com/sun/electric/tool/generator/layout/fillCell/FillCellTool.java
@@ -0,0 +1,198 @@
+/* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: FillCellTool.java
+ *
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.generator.layout.fillCell;
+
+import com.sun.electric.database.EditingPreferences;
+import com.sun.electric.tool.generator.layout.fill.ExportConfig;
+import com.sun.electric.tool.generator.layout.fill.FillGeneratorTool;
+import com.sun.electric.tool.generator.layout.fill.FillGenConfig;
+import com.sun.electric.tool.generator.layout.fill.G;
+import com.sun.electric.tool.generator.layout.LayoutLib;
+import com.sun.electric.tool.generator.layout.TechType;
+import com.sun.electric.tool.Job;
+import com.sun.electric.database.text.Pref;
+import com.sun.electric.database.hierarchy.Cell;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.awt.geom.Rectangle2D;
+import java.awt.geom.Area;
+
+/**
+ * User: gg151869
+ * Date: Sep 15, 2006
+ */
+public class FillCellTool extends FillGeneratorTool {
+
+ public FillCellTool()
+ {
+ super();
+ }
+
+ /****************************** PREFERENCES ******************************/
+
+ public enum FillCellMode
+ {
+ NONE(-1),
+ FLAT(0),
+ BINARY(1),
+ ADAPTIVE(2);
+ private final int mode;
+ FillCellMode(int m) { mode = m; }
+ static FillCellMode find(int mode)
+ {
+ for (FillCellMode m : FillCellMode.values())
+ {
+ if (m.mode == mode) return m;
+ }
+ return NONE;
+ }
+ }
+
+ private static Pref cacheFillCellMode;
+ /**
+ * Method to retrieve how a given cell must filled.
+ * The default is FLAT.
+ * @return value representing the algorithm to use for filling a given cell.
+ */
+ public static FillCellTool.FillCellMode getFillCellMode()
+ {
+ if (cacheFillCellMode == null)
+ {
+ cacheFillCellMode = Pref.makeIntPref("FillCellMode", getTool().prefs, FillCellTool.FillCellMode.FLAT.mode);
+ }
+ return FillCellTool.FillCellMode.find(cacheFillCellMode.getInt());
+ }
+ /**
+ * Method to set mode how a given cell must filled.
+ * @param mode value representing the algorithm to use for filling a given cell.
+ */
+ public static void setFillCellMode(FillCellTool.FillCellMode mode) { cacheFillCellMode.setInt(mode.mode); }
+
+ private static Pref cacheFillRouterMode;
+ /**
+ * Method to retrieve mode to select router to fill the given cell.
+ * The default is FULL.
+ * @return value representing the routing algorithm to use for connecting a given cell.
+ */
+ public static FillGenConfig.FillGenType getFillRouterMode()
+ {
+ if (cacheFillRouterMode == null)
+ {
+ cacheFillRouterMode = Pref.makeIntPref("FillRouterMode",
+ getTool().prefs,FillGenConfig.FillGenType.INTERNAL.getMode());
+ }
+ return FillGenConfig.FillGenType.find(cacheFillRouterMode.getInt());
+ }
+ /**
+ * Method to set mode to select router to fill the given cell.
+ * @param mode value representing the routing algorithm to use for connecting a given cell.
+ */
+ public static void setFillRouterMode(FillGenConfig.FillGenType mode) { cacheFillRouterMode.setInt(mode.getMode()); }
+
+ private static Pref cacheFillCellCreateMaster;
+ /**
+ * Method to tell whether FillGeneratorTool will generate a master cell or use a given one.
+ * The default is "true".
+ * @return true if FillGeneratorTool should generate a master cell instead of use a given one.
+ */
+ public static boolean isFillCellCreateMasterOn()
+ {
+ if (cacheFillCellCreateMaster == null)
+ {
+ cacheFillCellCreateMaster = Pref.makeBooleanPref("FillCellCreateMaster", getTool().prefs, true);
+ }
+ return cacheFillCellCreateMaster.getBoolean();
+ }
+ /**
+ * Method to set whether FillGeneratorTool will generate a master cell or use a given one.
+ * @param on true if FillGeneratorTool should generate a master cell instead of use a given one.
+ */
+ public static void setFillCellCreateMasterOn(boolean on) { cacheFillCellCreateMaster.setBoolean(on); }
+
+ private Cell treeMakeAndTileCell(TechType tech, EditingPreferences ep, List<Cell> masters, boolean isPlanHorizontal,
+ Cell topCell, List<Rectangle2D> topBoxList, Area area)
+ {
+ // Create an empty cell for cases where all nodes/arcs are moved due to collision
+ Cell empty = Cell.newInstance(lib, "empty"+masters.get(0).getName()+"{lay}");
+ empty.setTechnology(topCell.getTechnology());
+ double cellWidth = masters.get(0).getBounds().getWidth();
+ double cellHeight = masters.get(0).getBounds().getHeight();
+ LayoutLib.newNodeInst(tech.essentialBounds(), ep,
+ -cellWidth/2, -cellHeight/2,
+ G.DEF_SIZE, G.DEF_SIZE, 180, empty);
+ LayoutLib.newNodeInst(tech.essentialBounds(), ep,
+ cellWidth/2, cellHeight/2,
+ G.DEF_SIZE, G.DEF_SIZE, 0, empty);
+
+ int tileOnX = (int)Math.ceil(config.targetW/config.minTileSizeX);
+ int tileOnY = (int)Math.ceil(config.targetH/config.minTileSizeY);
+
+ TreeTiledCell t = new TreeTiledCell(config, ep);
+ Cell topFill = t.makeQTreeCell(masters, empty, lib, tileOnX, tileOnY, isPlanHorizontal,
+ topCell, topBoxList, area);
+ topFill.setTechnology(topCell.getTechnology());
+ return topFill;
+ }
+
+ /** Similar to standardMakeFillCell but it generates hierarchical fills with a qTree
+ * @return Top fill cell
+ */
+ protected Cell treeMakeFillCell(FillGenConfig config, EditingPreferences ep, Cell topCell,
+ List<Cell> givenMasters, List<Rectangle2D> topBoxList, Area area)
+ {
+ boolean metalFlex = true;
+ int loLayer = config.firstLayer;
+ int hiLayer = config.lastLayer;
+ ExportConfig exportConfig = config.perim;
+ initFillParameters(metalFlex, true, ep);
+ TechType tech = config.getTechType();
+
+ masters = givenMasters;
+
+ if (masters == null)
+ {
+ Job.error(loLayer<1, "loLayer must be >=1");
+ int maxNumMetals = tech.getNumMetals();
+ Job.error(hiLayer>maxNumMetals, "hiLayer must be <=" + maxNumMetals);
+ Job.error(loLayer>hiLayer, "loLayer must be <= hiLayer");
+ masters = new ArrayList<Cell>();
+ Cell master = makeFillCell(lib, plans, loLayer, hiLayer, capCell,
+ tech, ep, exportConfig,
+ metalFlex, true);
+ masters.add(master);
+ }
+ else
+ {
+ // must adjust minSize
+ Rectangle2D r = masters.get(0).findEssentialBounds(); // must use essential elements to match the edges
+ if (r == null)
+ r = masters.get(0).getBounds();
+ config.minTileSizeX = r.getWidth();
+ config.minTileSizeY = r.getHeight();
+ }
+ Cell cell = treeMakeAndTileCell(tech, ep, masters, getOrientation(), topCell, topBoxList, area);
+
+ return cell;
+ }
+
+}
diff --git a/com/sun/electric/tool/generator/layout/fillCell/FillCelllGenPanel.java b/com/sun/electric/tool/generator/layout/fillCell/FillCelllGenPanel.java
new file mode 100644
index 0000000..5efaa6f
--- /dev/null
+++ b/com/sun/electric/tool/generator/layout/fillCell/FillCelllGenPanel.java
@@ -0,0 +1,300 @@
+/* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: FillCellGenPanel.java
+ *
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.generator.layout.fillCell;
+
+import com.sun.electric.tool.user.dialogs.FillGenDialog;
+import com.sun.electric.tool.generator.layout.fill.FillGenConfig;
+import com.sun.electric.tool.Job;
+
+import com.sun.electric.tool.extract.LayerCoverageTool;
+import com.sun.electric.util.TextUtils;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.ActionEvent;
+
+/**
+ * User: gg151869
+ * Date: Sep 15, 2006
+ */
+public class FillCelllGenPanel extends JPanel {
+
+ private javax.swing.JRadioButton cellButton;
+ private javax.swing.JComboBox fillTypeComboBox;
+ private javax.swing.JComboBox masterComboBox;
+ private javax.swing.JTextField gapTextField;
+ private javax.swing.JTextField levelTextField;
+ private javax.swing.JCheckBox aroundButton;
+ private javax.swing.JComboBox routerTypeComboBox;
+ private javax.swing.JLabel gapLabel;
+ private FillGenDialog parentDialog;
+
+ private enum CellTypeEnum {CREATE,USE}
+
+ public FillCelllGenPanel(FillGenDialog dialog, JPanel floorplanPanel, ButtonGroup topGroup, JButton okButton,
+ JRadioButton templateButton)
+ {
+ parentDialog = dialog;
+ initComponents(floorplanPanel, topGroup);
+
+ // Add listeners
+ okButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ okButtonActionPerformed();
+ }
+ });
+
+ templateButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ optionActionPerformed(evt);
+ }
+ });
+
+ FillCellTool.FillCellMode mode = FillCellTool.getFillCellMode();
+ fillTypeComboBox.setModel(new DefaultComboBoxModel(FillCellTool.FillCellMode.values()));
+ fillTypeComboBox.setSelectedItem(mode);
+
+ FillGenConfig.FillGenType routerMode = FillCellTool.getFillRouterMode();
+ routerTypeComboBox.setModel(new DefaultComboBoxModel(FillGenConfig.FillGenType.values()));
+ routerTypeComboBox.setSelectedItem(routerMode);
+
+ // master
+ boolean createMaster = FillCellTool.isFillCellCreateMasterOn();
+ masterComboBox.setModel(new DefaultComboBoxModel(CellTypeEnum.values()));
+ if (createMaster)
+ masterComboBox.setSelectedItem(CellTypeEnum.CREATE);
+ else
+ masterComboBox.setSelectedItem(CellTypeEnum.USE);
+
+ optionActionPerformed(null);
+ }
+
+ private void okButtonActionPerformed() {
+ boolean binary = fillTypeComboBox.getSelectedItem() == FillCellTool.FillCellMode.BINARY;
+ FillGenConfig.FillGenType routerType = (FillGenConfig.FillGenType)routerTypeComboBox.getSelectedItem();
+ double gap = TextUtils.atof(gapTextField.getText());
+ FillGenConfig config = parentDialog.okButtonClick(isFlatSelected(), isCreateOptionSelected(), binary, aroundButton.isSelected(),
+ gap, routerType, TextUtils.atoi(levelTextField.getText()));
+ if (config != null)
+ new FillCellGenJob(Job.getUserInterface().getCurrentCell(), config, false, new LayerCoverageTool.LayerCoveragePreferences(false));
+ // Store preferences
+ FillCellTool.FillCellMode mode = (FillCellTool.FillCellMode)fillTypeComboBox.getSelectedItem();
+ FillCellTool.setFillCellMode(mode);
+ FillCellTool.setFillRouterMode(routerType);
+ FillCellTool.setFillCellCreateMasterOn(isCreateOptionSelected());
+ }
+
+ private void initComponents(JPanel floorplanPanel, ButtonGroup topGroup)
+ {
+ setBorder(javax.swing.BorderFactory.createTitledBorder("Fill Information"));
+ setLayout(new java.awt.GridBagLayout());
+
+ java.awt.GridBagConstraints gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 4;
+ gridBagConstraints.gridy = 1;
+ gridBagConstraints.gridwidth = 4;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH;
+ floorplanPanel.add(this, gridBagConstraints);
+
+ cellButton = new javax.swing.JRadioButton();
+ cellButton.setText("Fill Cell");
+ cellButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
+ cellButton.setMargin(new java.awt.Insets(0, 0, 0, 0));
+ cellButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ optionActionPerformed(evt);
+ }
+ });
+ topGroup.add(cellButton);
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 4;
+ gridBagConstraints.gridy = 0;
+ gridBagConstraints.gridwidth = 2;
+ gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
+ gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
+ floorplanPanel.add(cellButton, gridBagConstraints);
+
+ javax.swing.JLabel fillTypeLabel = new javax.swing.JLabel();
+ fillTypeLabel.setText("Type");
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 0;
+ gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
+ gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
+ add(fillTypeLabel, gridBagConstraints);
+
+ javax.swing.JLabel masterLabel = new javax.swing.JLabel();
+ masterLabel.setText("Master");
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 2;
+ gridBagConstraints.gridy = 0;
+ gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
+ gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 2);
+ add(masterLabel, gridBagConstraints);
+
+ masterComboBox = new javax.swing.JComboBox();
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 3;
+ gridBagConstraints.gridy = 0;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ gridBagConstraints.insets = new java.awt.Insets(4, 2, 4, 4);
+ add(masterComboBox, gridBagConstraints);
+ masterComboBox.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ generalSetup();
+ }
+ });
+
+ fillTypeComboBox = new javax.swing.JComboBox();
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 1;
+ gridBagConstraints.gridy = 0;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
+ add(fillTypeComboBox, gridBagConstraints);
+ fillTypeComboBox.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ generalSetup();
+ }
+ });
+
+ gapLabel = new javax.swing.JLabel();
+ gapLabel.setText("Overlap");
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 2;
+ gridBagConstraints.gridy = 1;
+ gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 2);
+ add(gapLabel, gridBagConstraints);
+
+ gapTextField = new javax.swing.JTextField();
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 3;
+ gridBagConstraints.gridy = 1;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ gridBagConstraints.insets = new java.awt.Insets(4, 2, 4, 4);
+ add(gapTextField, gridBagConstraints);
+
+ javax.swing.JLabel levelLabel = new javax.swing.JLabel();
+ levelLabel.setText("Level");
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 2;
+ gridBagConstraints.gridy = 2;
+ gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 2);
+ add(levelLabel, gridBagConstraints);
+
+ levelTextField = new javax.swing.JTextField();
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 3;
+ gridBagConstraints.gridy = 2;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ gridBagConstraints.insets = new java.awt.Insets(4, 2, 4, 4);
+ add(levelTextField, gridBagConstraints);
+
+ aroundButton = new javax.swing.JCheckBox();
+ aroundButton.setText("Only Around");
+ aroundButton.setBorder(javax.swing.BorderFactory.createEmptyBorder(0, 0, 0, 0));
+ aroundButton.setMargin(new java.awt.Insets(0, 0, 0, 0));
+ aroundButton.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ aroundButtonActionPerformed(evt);
+ }
+ });
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 2;
+ gridBagConstraints.gridwidth = 2;
+ gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
+ gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
+ add(aroundButton, gridBagConstraints);
+
+ javax.swing.JLabel routerLabel = new javax.swing.JLabel();
+ routerLabel.setText("Router");
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 1;
+ gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
+ gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
+ add(routerLabel, gridBagConstraints);
+
+ routerTypeComboBox = new javax.swing.JComboBox();
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 1;
+ gridBagConstraints.gridy = 1;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
+ add(routerTypeComboBox, gridBagConstraints);
+ routerTypeComboBox.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ generalSetup();
+ }
+ });
+ }
+
+ private boolean isFlatSelected()
+ {
+ return fillTypeComboBox.getSelectedItem() == FillCellTool.FillCellMode.FLAT;
+ }
+
+ private boolean isCreateOptionSelected()
+ {
+ return masterComboBox.getSelectedItem() == CellTypeEnum.CREATE;
+ }
+
+ private void optionActionPerformed(ActionEvent evt) {
+ boolean isCellSelected = cellButton.isSelected();
+ setEnabledInHierarchy(this, isCellSelected);
+ // Calls master select setting
+ parentDialog.optionAction(isFlatSelected(), isCreateOptionSelected(), isCellSelected);
+ }
+
+ private void aroundButtonActionPerformed(java.awt.event.ActionEvent evt)
+ {
+ gapTextField.setEnabled(aroundButton.isSelected());
+ gapLabel.setEnabled(aroundButton.isSelected());
+ }
+
+ private static void setEnabledInHierarchy(Container c, boolean value)
+ {
+ c.setEnabled(value);
+ for (int i = 0; i < c.getComponentCount(); i++)
+ {
+ Component co = c.getComponent(i);
+ co.setEnabled(value);
+ if (co instanceof Container)
+ setEnabledInHierarchy((Container)co, value);
+ }
+ }
+
+ private void generalSetup()
+ {
+ boolean flatSelected = isFlatSelected();
+ setEnabledInHierarchy(masterComboBox, !flatSelected);
+
+ parentDialog.generalSetup(flatSelected, isCreateOptionSelected());
+
+ // setting the around toggles
+ aroundButtonActionPerformed(null);
+ }
+}
diff --git a/com/sun/electric/tool/generator/layout/fillCell/TreeTiledCell.java b/com/sun/electric/tool/generator/layout/fillCell/TreeTiledCell.java
new file mode 100644
index 0000000..56ede1f
--- /dev/null
+++ b/com/sun/electric/tool/generator/layout/fillCell/TreeTiledCell.java
@@ -0,0 +1,528 @@
+/* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: TreeTiledCell.java
+ *
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.generator.layout.fillCell;
+
+import com.sun.electric.database.EditingPreferences;
+import com.sun.electric.tool.generator.layout.fill.TiledCell;
+import com.sun.electric.tool.generator.layout.fill.FillGenConfig;
+import com.sun.electric.tool.generator.layout.fill.G;
+import com.sun.electric.tool.generator.layout.LayoutLib;
+import com.sun.electric.tool.generator.layout.TechType;
+import com.sun.electric.util.math.DBMath;
+import com.sun.electric.util.math.GenMath;
+import com.sun.electric.database.hierarchy.Cell;
+import com.sun.electric.database.hierarchy.Library;
+import com.sun.electric.database.topology.NodeInst;
+import com.sun.electric.database.topology.ArcInst;
+
+import com.sun.electric.util.math.FixpTransform;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Collections;
+import java.awt.geom.Rectangle2D;
+import java.awt.geom.Area;
+
+/**
+ * User: gg151869
+ * Date: Sep 19, 2006
+ */
+public class TreeTiledCell extends TiledCell {
+ public TreeTiledCell(FillGenConfig conf, EditingPreferences ep)
+ {
+ super(conf, ep);
+ }
+
+ enum CutType {NONE,X,Y,XY}
+
+ /**
+ * Method to calculate number of master sizes to cover using binary division or the intersection approach
+ * @param size
+ * @param binary
+ * @return number of master cells
+ */
+ private static int getFillDimension(int size, boolean binary)
+ {
+ if (size <=2) return size;
+ if (binary)
+ {
+ // calculate the closest upper 2^n so the qTree will be perfectely balanced.
+ double val = Math.sqrt(size);
+ val = Math.ceil(val);
+ return (int)Math.pow(2,val);
+ }
+ // otherwise just the closest even number
+ if (size%2 != 0) //odd number
+ {
+ size -= 1;
+
+ }
+ return size;
+ }
+
+ /**
+ * ----------------------------
+ * | 2 | 3 |
+ * ----------------------------
+ * | 0 | 1 |
+ * ----------------------------
+ * @param masters
+ * @param empty
+ * @param autoLib
+ * @param box bounding box representing region to refine. (0,0) is the top left corner
+ * @param topCell
+ * @param area
+ * @return true if refined elements form std cell
+ */
+ private boolean refine(List<Cell> masters, Rectangle2D masterBnd, Cell empty, Library autoLib,
+ Rectangle2D box, boolean isPlanHorizontal,
+ List<Cell> newElems, Cell topCell, Area area)
+ {
+ double masterW = masterBnd.getWidth();
+ double masterH = masterBnd.getHeight();
+ double w = box.getWidth(), wHalf = w/2;
+ double h = box.getHeight(), hHalf = h/2;
+ double x = box.getX();
+ double y = box.getY();
+ double refineOnX = w/masterW;
+ double refineOnY = h/masterH;
+ // refineOnX and refineOnY must be multiple of masterW/masterH
+ if (DBMath.hasRemainder(w, masterW) || DBMath.hasRemainder(h, masterH))
+ System.out.println("not good refinement");
+
+ if (config.job != null && config.job.checkAbort())
+ return false;
+
+ int cutX = (int)Math.ceil(refineOnX);
+ int cutY = (int)Math.ceil(refineOnY);
+ assert(cutX > 0 && cutY > 0);
+ int cutXOnLeft = getFillDimension((int)(refineOnX/2), false);
+ int cutXOnRight = cutX - cutXOnLeft; // get exact number of cuts
+ int cutYOnBottom = getFillDimension((int)(refineOnY/2), false);
+ int cutYOnTop = cutY - cutYOnBottom; // get exact number of cuts
+
+ // Each cut will have a copy of the cell to use
+ List<Cell> childrenList = new ArrayList<Cell>();
+ boolean stdCell = true;
+ List<Rectangle2D> boxes = new ArrayList<Rectangle2D>();
+ CutType cut = CutType.NONE;
+ Rectangle2D bb = null;
+ List<String> namesList = new ArrayList<String>();
+
+ if (cutX > 1 && cutY > 1) // refine on XY
+ {
+ cut = CutType.XY;
+ double[] widths = null, heights = null;
+ double[] centerX = null, centerY = null;
+
+ if (config.binary)
+ {
+ widths = new double[]{wHalf, wHalf, wHalf, wHalf};
+ heights = new double[]{hHalf, hHalf, hHalf, hHalf};
+ centerX = new double[]{box.getCenterX(), box.getCenterX(), box.getCenterX(), box.getCenterX()};
+ centerY = new double[]{box.getCenterY(), box.getCenterY(), box.getCenterY(), box.getCenterY()};
+ }
+ else
+ {
+ double tmpXLeft = cutXOnLeft*masterW, tmpYOnBottom = cutYOnBottom*masterH;
+ widths = new double[]{tmpXLeft, cutXOnRight*masterW};
+ heights = new double[]{tmpYOnBottom, cutYOnTop*masterH};
+ centerX = new double[]{x, x+tmpXLeft};
+ centerY = new double[]{y, y+tmpYOnBottom};
+ }
+
+ for (int i = 0; i < 4; i++)
+ {
+ int xPos = i%2;
+ int yPos = i/2;
+ bb = GenMath.getQTreeBox(x, y, widths[xPos], heights[yPos], centerX[xPos], centerY[yPos], i);
+ boxes.add(bb);
+ if (!refine(masters, masterBnd, empty, autoLib, bb, isPlanHorizontal, childrenList,
+ topCell, area))
+ stdCell = false;
+ }
+ }
+ else if (cutX > 1) // only on X
+ {
+ cut = CutType.X;
+ double[] widths = null, centerX = null;
+
+ if (config.binary)
+ {
+ widths = new double[]{wHalf, wHalf};
+ centerX = new double[]{box.getCenterX(), box.getCenterX()};
+ }
+ else
+ {
+ double tmpXLeft = cutXOnLeft*masterW;
+ widths = new double[]{tmpXLeft, cutXOnRight*masterW};
+ centerX = new double[]{x, x+tmpXLeft};
+ }
+
+ for (int i = 0; i < 2; i++)
+ {
+ bb = GenMath.getQTreeBox(x, y, widths[i], h, centerX[i], box.getCenterY(), i);
+ boxes.add(bb);
+ if (!refine(masters, masterBnd, empty, autoLib, bb, isPlanHorizontal, childrenList,
+ topCell, area))
+ stdCell = false;
+ }
+ }
+ else if (cutY > 1) // only on Y
+ {
+ cut = CutType.Y;
+ double[] heights = null, centerY = null;
+
+ if (config.binary)
+ {
+ heights = new double[]{hHalf, hHalf};
+ centerY = new double[]{box.getCenterY(), box.getCenterY()};
+ }
+ else
+ {
+ double tmpYOnBottom = cutYOnBottom*masterH;
+ heights = new double[]{tmpYOnBottom, cutYOnTop*masterH};
+ centerY = new double[]{y, y+tmpYOnBottom};
+ }
+ for (int i = 0; i < 2; i++)
+ {
+ bb = GenMath.getQTreeBox(x, y, w, heights[i], box.getCenterX(), centerY[i], i*2);
+ boxes.add(bb);
+ if (!refine(masters, masterBnd, empty, autoLib, bb, isPlanHorizontal, childrenList,
+ topCell, area))
+ stdCell = false;
+ }
+ } else {
+
+ if (config.job != null && config.job.checkAbort())
+ return false;
+
+ // nothing refined, qTree leave
+ HashSet<NodeInst> nodesToRemove = new HashSet<NodeInst>();
+ HashSet<ArcInst> arcsToRemove = new HashSet<ArcInst>();
+
+ // test all possible masters starting from the one in index=0
+ boolean excluded = false;
+ Cell theMasterCell = null, bestFitCell = null;
+ int bestFitNum = Integer.MAX_VALUE;
+
+ for (Cell master : masters)
+ {
+ // Translation from master cell center to actual location in the qTree
+ /* [ 1 0 tx ]
+ * [ 0 1 ty ]
+ * [ 0 0 1 ]
+ */
+ Rectangle2D box1 = new Rectangle2D.Double(box.getMinX()+config.gap, box.getMinY()+config.gap,
+ box.getWidth()-config.gap*2, box.getHeight()-config.gap*2);
+ Rectangle2D essentialBnd = master.findEssentialBounds();
+ if (essentialBnd == null) essentialBnd = master.getBounds();
+ Rectangle2D masterRealBnd = master.getBounds();
+ FixpTransform fillTransUp = FixpTransform.getTranslateInstance(
+ box.getCenterX() - masterRealBnd.getCenterX(),
+ box.getCenterY() - masterRealBnd.getCenterY());
+// boolean isExcluded1 = area.intersects(box);
+ boolean isExcluded = area.intersects(box1);
+
+// if (box.getMinX() > -5680 && box.getMinY() > 3680) //&& box.getMinY() > 2784)
+// System.out.println("Here ");
+
+ // if (isExcluded != isExcluded1)
+ // System.out.println("HHH");
+ // Testing if all points are completely inside
+ // boolean anotherTest = area.contains(box1.getMinX(), box1.getMinY());
+ // if (!anotherTest) anotherTest = area.contains(box1.getMinX(), box1.getMaxY());
+ // if (!anotherTest) anotherTest = area.contains(box1.getMaxX(), box1.getMaxY());
+ // if (!anotherTest) anotherTest = area.contains(box1.getMaxX(), box1.getMinY());
+ // if (isExcluded != anotherTest)
+ // System.out.println("HHH dddd");
+ Cell c = null;
+
+ if (isExcluded)
+ {
+
+ theMasterCell = empty; // the best is the empty cell as the area is excluded
+ excluded = true;
+ break;
+ }
+ else
+ {
+ c = FillCellGenJob.detectOverlappingBars(master, master, empty,
+ fillTransUp, nodesToRemove, arcsToRemove,
+ topCell, new NodeInst[] {}, config.drcSpacingRule, 0);
+ if (c != empty && c != null)
+ {
+ theMasterCell = c;
+ break; // perfect fit
+ }
+ else
+ {
+ // keeping the best option
+ int numToRemove = arcsToRemove.size() + nodesToRemove.size();
+ if (c != empty && numToRemove < bestFitNum)
+ {
+ bestFitCell = master;
+ bestFitNum = numToRemove;
+ }
+ }
+ }
+ }
+
+ stdCell = true;
+
+ if (theMasterCell == null)
+ {
+ assert(!excluded);
+ boolean isEmptyCell = excluded || bestFitCell == null || arcsToRemove.size() == bestFitCell.getNumArcs();
+ Cell dummyCell = null;
+
+ if (isEmptyCell)
+ dummyCell = empty;
+ else
+ {
+ // Replace by dummy cell for now
+ String dummyName = "dummy";
+ // Collect names from nodes and arcs to remove if the cell is not empty
+ namesList.clear();
+ for (NodeInst ni : nodesToRemove)
+ {
+ // Not deleting the pins otherwise cells can be connected.
+ // List should not contain pins
+ if (!ni.getProto().getFunction().isPin())
+ namesList.add(ni.getName());
+ }
+// for (ArcInst ai : arcsToRemove)
+// {
+// namesList.add(ai.getName());
+// }
+ Collections.sort(namesList);
+ int code = namesList.toString().hashCode();
+
+ dummyName +=code+"{lay}";
+ // Place dummy cells in same location as the empty cells. It should be in "autoFillLib"
+ dummyCell = empty.getLibrary().findNodeProto(dummyName);// master.getLibrary().findNodeProto(dummyName);
+
+ if (dummyCell == null)
+ {
+ // Creating empty/dummy Master cell or look for an existing one
+ dummyCell = Cell.copyNodeProto(bestFitCell, bestFitCell.getLibrary(), dummyName, true);
+// LayoutLib.newNodeInst(Tech.essentialBounds, -masterW/2, -masterH/2,
+// G.DEF_SIZE, G.DEF_SIZE, 180, dummyCell);
+// LayoutLib.newNodeInst(Tech.essentialBounds, masterW/2, masterW/2,
+// G.DEF_SIZE, G.DEF_SIZE, 0, dummyCell);
+
+ // Time to delete the elements overlapping with the rest of the top cell
+ for (NodeInst ni : nodesToRemove)
+ {
+ NodeInst d = dummyCell.findNode(ni.getName());
+ if (d != null)
+ d.kill();
+ }
+
+ for (ArcInst ai : arcsToRemove)
+ {
+ ArcInst d = dummyCell.findArc(ai.getName());
+ // d is null if a NodeInst connected was killed.
+ if (d != null)
+ d.kill();
+ }
+ // if cell is now empty
+ if (dummyCell.getNumArcs() == 0) // now is empty
+ {
+ dummyCell.kill();
+ dummyCell = empty;
+ isEmptyCell = true;
+ }
+ }
+ }
+ newElems.add(dummyCell);
+ stdCell = isEmptyCell;
+ }
+ else
+ newElems.add(theMasterCell);
+ return stdCell;
+ }
+
+
+
+ if (config.job != null && config.job.checkAbort())
+ return false;
+
+ Cell tiledCell = null;
+ String tileName = null;
+ boolean stdC = true;
+ boolean readStdC = true;
+ assert(childrenList.size() > 1);
+ Cell template = childrenList.get(0);
+ for (int i = 1; i < childrenList.size(); i++)
+ {
+ if (template != childrenList.get(i))
+ {
+ stdC = false;
+ readStdC = false;
+ break;
+ }
+ }
+
+// if (readStdC != stdCell)
+// System.out.println("They are not std");
+
+ stdCell = readStdC;
+
+ // Search by names
+ if (!stdCell)
+ {
+ stdCell = stdC;
+ }
+
+ stdC = stdCell;
+
+ if (stdCell)
+ {
+ String rootName = childrenList.get(0).getName();
+ if (childrenList.get(0) == masters.get(0))
+ rootName = masters.get(0).getName();
+ else if (childrenList.get(0) == empty)
+ rootName = empty.getName();
+ tileName = rootName+"_"+w+"x"+h+"{lay}";
+ tiledCell = empty.getLibrary().findNodeProto(tileName);
+ }
+ else
+ {
+ // Better to name based on children found
+ namesList.clear();
+ for (Cell c : childrenList)
+ {
+ namesList.add(c.getName());
+ }
+ namesList.add(cut.toString());
+ // you can't sort names otherwise you look order in the qtree
+// Collections.sort(namesList);
+ int code = namesList.toString().hashCode();
+// tileName = "dummy"+master.getName()+"_"+w+"x"+h+"("+x+","+y+"){lay}";
+ tileName = "dummy"+masters.get(0).getName()+"_"+w+"x"+h+"("+code+"){lay}";
+ tiledCell = empty.getLibrary().findNodeProto(tileName);
+ if (tiledCell != null)
+ {
+ stdC = true;
+ }
+ }
+
+ if (tiledCell == null || !stdC)
+ {
+ tiledCell = Cell.newInstance(empty.getLibrary(), tileName);
+ TechType techType = config.getTechType();
+ LayoutLib.newNodeInst(techType.essentialBounds(), ep, -w/2, -h/2,
+ G.DEF_SIZE, G.DEF_SIZE, 180, tiledCell);
+ LayoutLib.newNodeInst(techType.essentialBounds(), ep, w/2, h/2,
+ G.DEF_SIZE, G.DEF_SIZE, 0, tiledCell);
+
+ NodeInst[][] rows = null;
+
+ // if it could use previous std fill cells
+ switch (cut)
+ {
+ case X:
+ rows = new NodeInst[1][2];
+ break;
+ case Y:
+ rows = new NodeInst[2][1];
+ break;
+ case XY:
+ rows = new NodeInst[2][2];
+ break;
+ }
+ assert(boxes.size() == childrenList.size());
+
+ for (int i = 0; i < boxes.size(); i++)
+ {
+ Rectangle2D b = boxes.get(i);
+ double cenX = b.getCenterX() - box.getCenterX();
+ double cenY = b.getCenterY() - box.getCenterY();
+ NodeInst node = LayoutLib.newNodeInst(childrenList.get(i), ep, cenX, cenY,
+ b.getWidth(), b.getHeight(), 0, tiledCell);
+ switch (cut)
+ {
+ case X:
+ rows[0][i] = node;
+ break;
+ case Y:
+ rows[i][0] = node;
+ break;
+ case XY:
+ rows[(int)i/2][i%2] = node;
+ }
+ }
+
+ connectAllPortInsts(config.getTechType(), ep, tiledCell);
+ exportUnconnectedPortInsts(rows, isPlanHorizontal, tiledCell);
+ }
+
+ newElems.add(tiledCell);
+ return stdCell;
+ }
+
+ /**
+ * Method to set up conditions for qTree refinement
+ */
+ public Cell makeQTreeCell(List<Cell> masters, Cell empty, Library autoLib,
+ int tileOnX, int tileOnY, boolean isPlanHorizontal,
+ Cell topCell,
+ List<Rectangle2D> topBoxList, Area area)
+ {
+ double fillWidth = tileOnX * config.minTileSizeX;
+ double fillHeight = tileOnY * config.minTileSizeY;
+ // in case of binary division, make sure the division is 2^N
+ if (config.binary)
+ {
+ int powerX = getFillDimension(tileOnX, true);
+ int powerY = getFillDimension(tileOnY, true);
+ fillWidth = powerX*config.minTileSizeX;
+ fillHeight = powerY*config.minTileSizeY;
+ }
+
+ // topBox its width/height must be multiply of master.getWidth()/Height()
+ Rectangle2D topEssential = topCell.findEssentialBounds();
+// Rectangle2D topBox = new Rectangle2D.Double(topCell.getBounds().getCenterX()-fillWidth/2,
+// topCell.getBounds().getCenterY()-fillHeight/2, fillWidth, fillHeight);
+ // Center bounding box using the left-bottom corner
+ Rectangle2D topBox = new Rectangle2D.Double(topCell.getBounds().getX() + config.gap,
+ topCell.getBounds().getY() + config.gap, fillWidth, fillHeight);
+ if (topEssential != null) // make correction
+ {
+ topBox = new Rectangle2D.Double(topEssential.getX(), topEssential.getY(), fillWidth, fillHeight);
+ }
+
+ topBoxList.clear(); // remove original value
+ topBoxList.add(topBox); // I need information for setting
+
+ // refine recursively
+ List<Cell> newElems = new ArrayList<Cell>();
+ Rectangle2D essentialBnd = masters.get(0).findEssentialBounds();
+ if (essentialBnd == null)
+ essentialBnd = masters.get(0).getBounds();
+ refine(masters, essentialBnd, empty, autoLib, topBox, isPlanHorizontal, newElems,
+ topCell, area);
+ assert(newElems.size()==1);
+ return newElems.iterator().next();
+ }
+}
diff --git a/com/sun/electric/tool/generator/layout/gates/DrcRing.java b/com/sun/electric/tool/generator/layout/gates/DrcRing.java
index e874b69..8600cd0 100644
--- a/com/sun/electric/tool/generator/layout/gates/DrcRing.java
+++ b/com/sun/electric/tool/generator/layout/gates/DrcRing.java
@@ -4,7 +4,7 @@
*
* File: DrcRing.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Inv.java b/com/sun/electric/tool/generator/layout/gates/Inv.java
index 638652a..3400958 100644
--- a/com/sun/electric/tool/generator/layout/gates/Inv.java
+++ b/com/sun/electric/tool/generator/layout/gates/Inv.java
@@ -4,7 +4,7 @@
*
* File: Inv.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Inv2i.java b/com/sun/electric/tool/generator/layout/gates/Inv2i.java
index 5f6e8dd..ed72e23 100644
--- a/com/sun/electric/tool/generator/layout/gates/Inv2i.java
+++ b/com/sun/electric/tool/generator/layout/gates/Inv2i.java
@@ -4,7 +4,7 @@
*
* File: Inv2i.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Inv2iKn.java b/com/sun/electric/tool/generator/layout/gates/Inv2iKn.java
index fb15358..38e7e9b 100644
--- a/com/sun/electric/tool/generator/layout/gates/Inv2iKn.java
+++ b/com/sun/electric/tool/generator/layout/gates/Inv2iKn.java
@@ -4,7 +4,7 @@
*
* File: Inv_star_wideOutput.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Inv2iKp.java b/com/sun/electric/tool/generator/layout/gates/Inv2iKp.java
index 8eb4311..4c260d7 100644
--- a/com/sun/electric/tool/generator/layout/gates/Inv2iKp.java
+++ b/com/sun/electric/tool/generator/layout/gates/Inv2iKp.java
@@ -4,7 +4,7 @@
*
* File: Inv_star_wideOutput.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/InvCLK.java b/com/sun/electric/tool/generator/layout/gates/InvCLK.java
index e9e678d..e91967b 100644
--- a/com/sun/electric/tool/generator/layout/gates/InvCLK.java
+++ b/com/sun/electric/tool/generator/layout/gates/InvCLK.java
@@ -4,7 +4,7 @@
*
* File: InvCLK.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/InvCTLn.java b/com/sun/electric/tool/generator/layout/gates/InvCTLn.java
index 06ca3d3..d4fd87d 100644
--- a/com/sun/electric/tool/generator/layout/gates/InvCTLn.java
+++ b/com/sun/electric/tool/generator/layout/gates/InvCTLn.java
@@ -4,7 +4,7 @@
*
* File: InvCTLn.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/InvHT.java b/com/sun/electric/tool/generator/layout/gates/InvHT.java
index d55fe88..93b6066 100644
--- a/com/sun/electric/tool/generator/layout/gates/InvHT.java
+++ b/com/sun/electric/tool/generator/layout/gates/InvHT.java
@@ -4,7 +4,7 @@
*
* File: InvHT.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/InvLT.java b/com/sun/electric/tool/generator/layout/gates/InvLT.java
index 3ac27b5..0c7afba 100644
--- a/com/sun/electric/tool/generator/layout/gates/InvLT.java
+++ b/com/sun/electric/tool/generator/layout/gates/InvLT.java
@@ -4,7 +4,7 @@
*
* File: InvLT.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/InvV.java b/com/sun/electric/tool/generator/layout/gates/InvV.java
index 90f08d4..77a41f1 100644
--- a/com/sun/electric/tool/generator/layout/gates/InvV.java
+++ b/com/sun/electric/tool/generator/layout/gates/InvV.java
@@ -4,7 +4,7 @@
*
* File: InvV.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Inv_passgate.java b/com/sun/electric/tool/generator/layout/gates/Inv_passgate.java
index 3753ff5..e1a2341 100644
--- a/com/sun/electric/tool/generator/layout/gates/Inv_passgate.java
+++ b/com/sun/electric/tool/generator/layout/gates/Inv_passgate.java
@@ -4,7 +4,7 @@
*
* File: Inv_passgate.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Inv_star.java b/com/sun/electric/tool/generator/layout/gates/Inv_star.java
index 91135a7..9fd57b6 100644
--- a/com/sun/electric/tool/generator/layout/gates/Inv_star.java
+++ b/com/sun/electric/tool/generator/layout/gates/Inv_star.java
@@ -4,7 +4,7 @@
*
* File: Inv_star.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Inv_star_wideOutput.java b/com/sun/electric/tool/generator/layout/gates/Inv_star_wideOutput.java
index ebe5663..b977925 100644
--- a/com/sun/electric/tool/generator/layout/gates/Inv_star_wideOutput.java
+++ b/com/sun/electric/tool/generator/layout/gates/Inv_star_wideOutput.java
@@ -4,7 +4,7 @@
*
* File: Inv_star_wideOutput.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/MoCMOSGenerator.java b/com/sun/electric/tool/generator/layout/gates/MoCMOSGenerator.java
index 6e07a11..d187a44 100644
--- a/com/sun/electric/tool/generator/layout/gates/MoCMOSGenerator.java
+++ b/com/sun/electric/tool/generator/layout/gates/MoCMOSGenerator.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: MoCMOSGenerator.java
- * Written by: Jonathan Gainsley, Sun Microsystems.
+ * Written by: Jonathan Gainsley.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/MullerC_sy.java b/com/sun/electric/tool/generator/layout/gates/MullerC_sy.java
index ed94f13..0537862 100644
--- a/com/sun/electric/tool/generator/layout/gates/MullerC_sy.java
+++ b/com/sun/electric/tool/generator/layout/gates/MullerC_sy.java
@@ -4,7 +4,7 @@
*
* File: MullerC_sy.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nand2.java b/com/sun/electric/tool/generator/layout/gates/Nand2.java
index 6ca9a12..b85e6ff 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nand2.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nand2.java
@@ -4,7 +4,7 @@
*
* File: Nand2.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nand2HLT.java b/com/sun/electric/tool/generator/layout/gates/Nand2HLT.java
index 1bdd2af..50801eb 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nand2HLT.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nand2HLT.java
@@ -4,7 +4,7 @@
*
* File: Nand2HLT.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nand2HLT_sy.java b/com/sun/electric/tool/generator/layout/gates/Nand2HLT_sy.java
index 3f35c62..6143cad 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nand2HLT_sy.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nand2HLT_sy.java
@@ -4,7 +4,7 @@
*
* File: Nand2HLT_sy.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nand2HTen.java b/com/sun/electric/tool/generator/layout/gates/Nand2HTen.java
index ce02f60..f8ea3c6 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nand2HTen.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nand2HTen.java
@@ -4,7 +4,7 @@
*
* File: Inv.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nand2LT.java b/com/sun/electric/tool/generator/layout/gates/Nand2LT.java
index ec272f3..36098d9 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nand2LT.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nand2LT.java
@@ -4,7 +4,7 @@
*
* File: Nand2LT.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nand2LT_sy.java b/com/sun/electric/tool/generator/layout/gates/Nand2LT_sy.java
index eac3384..259f99c 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nand2LT_sy.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nand2LT_sy.java
@@ -4,7 +4,7 @@
*
* File: Nand2LT_sy.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nand2LTen.java b/com/sun/electric/tool/generator/layout/gates/Nand2LTen.java
index 65fcafd..ca2914b 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nand2LTen.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nand2LTen.java
@@ -4,7 +4,7 @@
*
* File: Inv.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nand2PH.java b/com/sun/electric/tool/generator/layout/gates/Nand2PH.java
index 7422b3b..d91f516 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nand2PH.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nand2PH.java
@@ -4,7 +4,7 @@
*
* File: Nand2PH.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nand2PHfk.java b/com/sun/electric/tool/generator/layout/gates/Nand2PHfk.java
index 7c355ee..2e0dd5a 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nand2PHfk.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nand2PHfk.java
@@ -4,7 +4,7 @@
*
* File: Nand2PHfk.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nand2_star.java b/com/sun/electric/tool/generator/layout/gates/Nand2_star.java
index 0dfd977..bea4517 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nand2_star.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nand2_star.java
@@ -4,7 +4,7 @@
*
* File: Nand2_star.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nand2_star_en.java b/com/sun/electric/tool/generator/layout/gates/Nand2_star_en.java
index 91d2ac7..72cfd0b 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nand2_star_en.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nand2_star_en.java
@@ -4,7 +4,7 @@
*
* File: Nand2_star_en.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nand2_star_sy.java b/com/sun/electric/tool/generator/layout/gates/Nand2_star_sy.java
index 91ba950..1f3cb36 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nand2_star_sy.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nand2_star_sy.java
@@ -4,7 +4,7 @@
*
* File: Nand2_star_sy.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nand2_sy.java b/com/sun/electric/tool/generator/layout/gates/Nand2_sy.java
index a277956..0a7d919 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nand2_sy.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nand2_sy.java
@@ -4,7 +4,7 @@
*
* File: Nand2_sy.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nand2en.java b/com/sun/electric/tool/generator/layout/gates/Nand2en.java
index 9be9593..bb1663f 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nand2en.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nand2en.java
@@ -4,7 +4,7 @@
*
* File: Inv.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nand2en_sy.java b/com/sun/electric/tool/generator/layout/gates/Nand2en_sy.java
index c0b3bab..ee8b8a5 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nand2en_sy.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nand2en_sy.java
@@ -4,7 +4,7 @@
*
* File: Nand2en_sy.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nand3.java b/com/sun/electric/tool/generator/layout/gates/Nand3.java
index e6fcdb0..a916893 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nand3.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nand3.java
@@ -4,7 +4,7 @@
*
* File: Nand3.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nand3LT.java b/com/sun/electric/tool/generator/layout/gates/Nand3LT.java
index 2f697d9..266e432 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nand3LT.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nand3LT.java
@@ -4,7 +4,7 @@
*
* File: Nand3LT.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nand3LT_sy3.java b/com/sun/electric/tool/generator/layout/gates/Nand3LT_sy3.java
index 960a15b..4f80581 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nand3LT_sy3.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nand3LT_sy3.java
@@ -4,7 +4,7 @@
*
* File: Nand3LT_sy3.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nand3LTen.java b/com/sun/electric/tool/generator/layout/gates/Nand3LTen.java
index f9c976a..1786c0e 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nand3LTen.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nand3LTen.java
@@ -4,7 +4,7 @@
*
* File: Nand3LTen.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nand3LTen_sy.java b/com/sun/electric/tool/generator/layout/gates/Nand3LTen_sy.java
index 7c1a089..bb99b6c 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nand3LTen_sy.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nand3LTen_sy.java
@@ -4,7 +4,7 @@
*
* File: Nand3LTen_sy.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nand3LTen_sy3.java b/com/sun/electric/tool/generator/layout/gates/Nand3LTen_sy3.java
index 8af56b1..2267711 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nand3LTen_sy3.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nand3LTen_sy3.java
@@ -4,7 +4,7 @@
*
* File: Nand3LTen_sy3.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nand3MLT.java b/com/sun/electric/tool/generator/layout/gates/Nand3MLT.java
index ba16a58..946590d 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nand3MLT.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nand3MLT.java
@@ -4,7 +4,7 @@
*
* File: Nand3MLT.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nand3_star.java b/com/sun/electric/tool/generator/layout/gates/Nand3_star.java
index e310a93..1afc866 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nand3_star.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nand3_star.java
@@ -4,7 +4,7 @@
*
* File: Nand3_star.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nand3_star_en_star.java b/com/sun/electric/tool/generator/layout/gates/Nand3_star_en_star.java
index 06a1aad..d0a6b8e 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nand3_star_en_star.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nand3_star_en_star.java
@@ -4,7 +4,7 @@
*
* File: Nand3_star_en_star.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nand3_star_en_sy3.java b/com/sun/electric/tool/generator/layout/gates/Nand3_star_en_sy3.java
index 65b683d..33d29d8 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nand3_star_en_sy3.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nand3_star_en_sy3.java
@@ -4,7 +4,7 @@
*
* File: Nand3_star_en_sy3.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nand3_star_sy3.java b/com/sun/electric/tool/generator/layout/gates/Nand3_star_sy3.java
index 9876c19..b520850 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nand3_star_sy3.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nand3_star_sy3.java
@@ -4,7 +4,7 @@
*
* File: Nand3_star_sy3.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nand3_sy3.java b/com/sun/electric/tool/generator/layout/gates/Nand3_sy3.java
index 9d8d00f..b971e45 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nand3_sy3.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nand3_sy3.java
@@ -4,7 +4,7 @@
*
* File: Nand3_sy3.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nand3en.java b/com/sun/electric/tool/generator/layout/gates/Nand3en.java
index 2cce8f6..f93cf47 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nand3en.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nand3en.java
@@ -4,7 +4,7 @@
*
* File: Nand3en.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nand3en_sy.java b/com/sun/electric/tool/generator/layout/gates/Nand3en_sy.java
index d7518cd..c252cd1 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nand3en_sy.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nand3en_sy.java
@@ -4,7 +4,7 @@
*
* File: Nand3en_sy.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nand3en_sy3.java b/com/sun/electric/tool/generator/layout/gates/Nand3en_sy3.java
index a61d341..424206a 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nand3en_sy3.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nand3en_sy3.java
@@ -4,7 +4,7 @@
*
* File: Nand3en_sy3.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nms1.java b/com/sun/electric/tool/generator/layout/gates/Nms1.java
index 5d1323e..f311180 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nms1.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nms1.java
@@ -4,7 +4,7 @@
*
* File: Nms1.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nms2.java b/com/sun/electric/tool/generator/layout/gates/Nms2.java
index fb3237c..3e3b1dd 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nms2.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nms2.java
@@ -4,7 +4,7 @@
*
* File: Nms2.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nms2_sy.java b/com/sun/electric/tool/generator/layout/gates/Nms2_sy.java
index 3a41275..3b0e1b5 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nms2_sy.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nms2_sy.java
@@ -4,7 +4,7 @@
*
* File: Nms2_sy.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nms3_sy3.java b/com/sun/electric/tool/generator/layout/gates/Nms3_sy3.java
index 3d906b0..0c20a45 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nms3_sy3.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nms3_sy3.java
@@ -4,7 +4,7 @@
*
* File: Nms3_sy3.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nor2.java b/com/sun/electric/tool/generator/layout/gates/Nor2.java
index d79b922..37d2144 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nor2.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nor2.java
@@ -4,7 +4,7 @@
*
* File: Nor2.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nor2LT.java b/com/sun/electric/tool/generator/layout/gates/Nor2LT.java
index 4dc92f6..c5a30d0 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nor2LT.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nor2LT.java
@@ -4,7 +4,7 @@
*
* File: Nor2LT.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nor2_star.java b/com/sun/electric/tool/generator/layout/gates/Nor2_star.java
index 76df753..4cadbbc 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nor2_star.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nor2_star.java
@@ -4,7 +4,7 @@
*
* File: Nor2_star.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Nor2kresetV.java b/com/sun/electric/tool/generator/layout/gates/Nor2kresetV.java
index 1a422a9..1a2e75b 100644
--- a/com/sun/electric/tool/generator/layout/gates/Nor2kresetV.java
+++ b/com/sun/electric/tool/generator/layout/gates/Nor2kresetV.java
@@ -4,7 +4,7 @@
*
* File: Nor2kresetV.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Pms1.java b/com/sun/electric/tool/generator/layout/gates/Pms1.java
index 5741192..befa771 100644
--- a/com/sun/electric/tool/generator/layout/gates/Pms1.java
+++ b/com/sun/electric/tool/generator/layout/gates/Pms1.java
@@ -4,7 +4,7 @@
*
* File: Pms1.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Pms2.java b/com/sun/electric/tool/generator/layout/gates/Pms2.java
index a774ce2..65142d0 100644
--- a/com/sun/electric/tool/generator/layout/gates/Pms2.java
+++ b/com/sun/electric/tool/generator/layout/gates/Pms2.java
@@ -4,7 +4,7 @@
*
* File: Pms2.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/Pms2_sy.java b/com/sun/electric/tool/generator/layout/gates/Pms2_sy.java
index e510ac6..80c0d1e 100644
--- a/com/sun/electric/tool/generator/layout/gates/Pms2_sy.java
+++ b/com/sun/electric/tool/generator/layout/gates/Pms2_sy.java
@@ -4,7 +4,7 @@
*
* File: Pms2_sy.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/TieHi.java b/com/sun/electric/tool/generator/layout/gates/TieHi.java
index 596d93e..e7b8f92 100644
--- a/com/sun/electric/tool/generator/layout/gates/TieHi.java
+++ b/com/sun/electric/tool/generator/layout/gates/TieHi.java
@@ -4,7 +4,7 @@
*
* File: TieHi.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/VertTrack.java b/com/sun/electric/tool/generator/layout/gates/VertTrack.java
index a882991..8f50a30 100644
--- a/com/sun/electric/tool/generator/layout/gates/VertTrack.java
+++ b/com/sun/electric/tool/generator/layout/gates/VertTrack.java
@@ -4,7 +4,7 @@
*
* File: VertTrack.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/layout/gates/WellTie.java b/com/sun/electric/tool/generator/layout/gates/WellTie.java
index da69c8a..fe404d8 100644
--- a/com/sun/electric/tool/generator/layout/gates/WellTie.java
+++ b/com/sun/electric/tool/generator/layout/gates/WellTie.java
@@ -4,7 +4,7 @@
*
* File: WellTie.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/generator/sclibrary/SCLibraryGen.java b/com/sun/electric/tool/generator/sclibrary/SCLibraryGen.java
index 85d43b1..08e775c 100644
--- a/com/sun/electric/tool/generator/sclibrary/SCLibraryGen.java
+++ b/com/sun/electric/tool/generator/sclibrary/SCLibraryGen.java
@@ -4,7 +4,7 @@
*
* File: SCLibraryGen.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/ELIBConstants.java b/com/sun/electric/tool/io/ELIBConstants.java
index b13a7e5..5c24da4 100644
--- a/com/sun/electric/tool/io/ELIBConstants.java
+++ b/com/sun/electric/tool/io/ELIBConstants.java
@@ -4,7 +4,7 @@
*
* File: ELIBConstants.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/ExecProcess.java b/com/sun/electric/tool/io/ExecProcess.java
index 1239740..0e37146 100644
--- a/com/sun/electric/tool/io/ExecProcess.java
+++ b/com/sun/electric/tool/io/ExecProcess.java
@@ -4,7 +4,7 @@
*
* File: ExecProcess.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/FileType.java b/com/sun/electric/tool/io/FileType.java
index 3b9b8da..3fbfe97 100644
--- a/com/sun/electric/tool/io/FileType.java
+++ b/com/sun/electric/tool/io/FileType.java
@@ -4,7 +4,7 @@
*
* File: FileType.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -67,6 +67,7 @@ public class FileType implements Serializable {
/** Describes Assura DRC Error files. */public static final FileType ERR = makeFileType("ERR", new String[] {"err"}, "Assura DRC Error File (err)", FileTypeGroup.EXPORTIMPORTGRP);
/** Describes ESIM/RNL output. */ public static final FileType ESIM = makeFileType("ESIM", new String[] {"sim"}, "ESIM File (sim)", FileTypeGroup.OTHERSIMGRP);
/** Describes FastHenry files.*/ public static final FileType FASTHENRY = makeFileType("FastHenry", new String[] {"inp"}, "FastHenry File (inp)", FileTypeGroup.OTHERSIMGRP);
+ /** Describes Flattened Rectangles output. */ public static final FileType FLATRECT = makeFileType("FlatRect", new String[] {"txt"}, "Flattened Rectangle File (txt)", FileTypeGroup.OTHERSIMGRP);
/** Describes FPGA files.*/ public static final FileType FPGA = makeFileType("FPGA", new String[] {"fpga"}, "FPGA Architecture File (fpga)", FileTypeGroup.EXPORTIMPORTGRP);
/** Describes GDS files. */ public static final FileType GDS = makeFileType("GDS", new String[] {"gds"}, "GDS File (gds)", FileTypeGroup.EXPORTIMPORTGRP);
/** Describes GDS layer Map files. */ public static final FileType GDSMAP = makeFileType("GDS Map", new String[] {"map"}, "GDS Layer Map File (map)", FileTypeGroup.EXPORTIMPORTGRP);
diff --git a/com/sun/electric/tool/io/GDSReader.java b/com/sun/electric/tool/io/GDSReader.java
index ce71892..9a8263e 100644
--- a/com/sun/electric/tool/io/GDSReader.java
+++ b/com/sun/electric/tool/io/GDSReader.java
@@ -5,7 +5,7 @@
* File: GDSReader.java
* Input/output tool: GDS input
*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/IOTool.java b/com/sun/electric/tool/io/IOTool.java
index 0fdac81..dccc100 100644
--- a/com/sun/electric/tool/io/IOTool.java
+++ b/com/sun/electric/tool/io/IOTool.java
@@ -4,7 +4,7 @@
*
* File: IOTool.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -322,7 +322,7 @@ public class IOTool extends Tool
/**
* Method to tell whether Dais input is available.
- * Dais is a proprietary format of Sun Microsystems.
+ * Dais is a proprietary format of Oracle.
* This method dynamically figures out whether the Dais module is present by using reflection.
* @return true if the Dais input module is available.
*/
@@ -795,6 +795,31 @@ public class IOTool extends Tool
*/
public static boolean isFactoryDEFConnectByGDSNames() { return cacheDEFConnectByGDSNames.getBooleanFactoryValue(); }
+ private static Pref cacheDEFPlaceAndConnectAllPins = Pref.makeBooleanPref("DEFPlaceAndConnectAllPins", IOTool.tool.prefs, false);
+ /**
+ * Method to tell whether DEF Input places and connects all mentioned pins.
+ * Pins sometimes have multiple pieces of geometry, but only one is made into a pin.
+ * This option allows all to be placed, and connects them with unrouted ards.
+ * The default is "false" (only place one pin).
+ * @return true if DEF Input places and connects all mentioned pins.
+ */
+ public static boolean isDEFPlaceAndConnectAllPins() { return cacheDEFPlaceAndConnectAllPins.getBoolean(); }
+ /**
+ * Method to set whether DEF Input places and connects all mentioned pins.
+ * Pins sometimes have multiple pieces of geometry, but only one is made into a pin.
+ * This option allows all to be placed, and connects them with unrouted ards.
+ * @param on true if DEF Input places and connects all mentioned pins.
+ */
+ public static void setDEFPlaceAndConnectAllPins(boolean on) { cacheDEFPlaceAndConnectAllPins.setBoolean(on); }
+ /**
+ * Method to tell whether DEF Input places and connects all mentioned pins, by default.
+ * Pins sometimes have multiple pieces of geometry, but only one is made into a pin.
+ * This option allows all to be placed, and connects them with unrouted ards.
+ * The default is "false" (no extra connections).
+ * @return true if DEF Input places and connects all mentioned pins, by default.
+ */
+ public static boolean isFactoryDEFPlaceAndConnectAllPins() { return cacheDEFPlaceAndConnectAllPins.getBooleanFactoryValue(); }
+
public static final int DEFLEFUNKNOWNLAYERIGNORE = 0;
public static final int DEFLEFUNKNOWNLAYERUSEDRC = 1;
private static Pref cacheDEFInUnknownLayerHandling = Pref.makeIntPref("DEFInUnknownLayerHandling", IOTool.tool.prefs, DEFLEFUNKNOWNLAYERIGNORE);
@@ -1019,18 +1044,6 @@ public class IOTool extends Tool
*/
public static Setting getGDSInputScaleSetting() { return ToolSettings.getGDSInputScaleSetting(); }
- /**
- * Method to tell the scale to be applied when writing GDS.
- * The default is 1 (no scaling).
- * @return the scale to be applied when writing GDS.
- */
- public static double getGDSOutputScale() { return getGDSOutputScaleSetting().getDouble(); }
- /**
- * Method to set the scale to be applied when writing GDS.
- * @return the scale to be applied when writing GDS.
- */
- public static Setting getGDSOutputScaleSetting() { return ToolSettings.getGDSOutputScaleSetting(); }
-
private static Pref cacheGDSInMergesBoxes = Pref.makeBooleanPref("GDSInMergesBoxes", IOTool.tool.prefs, false);
/**
* Method to tell whether GDS Input merges boxes into complex polygons.
@@ -1112,7 +1125,43 @@ public class IOTool extends Tool
* @return true if GDS Export needs to include only visible layers
*/
public static boolean isFactoryGDSOnlyInvisibleLayers() { return cacheGDSOnlyVisible.getBooleanFactoryValue(); }
-
+
+ /**
+ * Method to tell the GDS Export precision.
+ * Precision is the number of "database units" per "user unit" (the units written to the GDS file).
+ * The default number is 1000.
+ * @return the GDS Export precision.
+ */
+ public static double getGDSOutputPrecision() { return getGDSOutputPrecisionSetting().getDouble(); }
+ /**
+ * Method to tell the GDS Export precision, by default.
+ * Precision is the number of "database units" per "user unit" (the units written to the GDS file).
+ * @return the GDS Export precision, by default.
+ */
+ public static double getFactoryGDSOutputPrecision() { return getGDSOutputPrecisionSetting().getDoubleFactoryValue(); }
+ /**
+ * Method to get the Setting for the GDS output precision.
+ * @return the Setting for the GDS output precision.
+ */
+ public static Setting getGDSOutputPrecisionSetting() { return ToolSettings.getGDSOutputPrecisionSetting(); }
+
+ /**
+ * Method to tell the size of a GDS "database unit" in meters, when exporting.
+ * The default number is 1,000,000,000 (1 nanometer).
+ * @return the size of a GDS "database unit" in meters, when exporting.
+ */
+ public static double getGDSOutputUnitsPerMeter() { return getGDSOutputUnitsPerMeterSetting().getDouble(); }
+ /**
+ * Method to tell the size of a GDS "database unit" in meters, when exporting, by default.
+ * @return the size of a GDS "database unit" in meters, when exporting, by default.
+ */
+ public static double getFactoryGDSOutputUnitsPerMeter() { return getGDSOutputUnitsPerMeterSetting().getDoubleFactoryValue(); }
+ /**
+ * Method to get the Setting for the GDS output units per meter.
+ * @return the Setting for the GDS output units per meter.
+ */
+ public static Setting getGDSOutputUnitsPerMeterSetting() { return ToolSettings.getGDSOutputUnitsPerMeterSetting(); }
+
private static Pref cacheGDSIncludesText = Pref.makeBooleanPref("GDSInIncludesText", IOTool.tool.prefs, false);
/**
* Method to tell whether GDS Input/Output ignores text.
@@ -1310,6 +1359,24 @@ public class IOTool extends Tool
*/
public static boolean isFactoryGDSCadenceCompatibility() { return cacheGDSCadenceCompatibility.getBooleanFactoryValue(); }
+ private static Pref cacheGDSDumpReadable = Pref.makeBooleanPref("GDSDumpReadable", IOTool.tool.prefs, false);
+ /**
+ * Method to tell whether GDS input dumps a readable form of the data while reading.
+ * The default is "false".
+ * @return true if GDS input dumps a readable form of the data while reading.
+ */
+ public static boolean isGDSDumpReadable() { return cacheGDSDumpReadable.getBoolean(); }
+ /**
+ * Method to set whether GDS input dumps a readable form of the data while reading.
+ * @param c true if GDS input dumps a readable form of the data while reading.
+ */
+ public static void setGDSDumpReadable(boolean c) { cacheGDSDumpReadable.setBoolean(c); }
+ /**
+ * Method to tell whether GDS input dumps a readable form of the data while reading, by default.
+ * @return true if GDS input dumps a readable form of the data while reading, by default.
+ */
+ public static boolean isFactoryGDSDumpReadable() { return cacheGDSDumpReadable.getBooleanFactoryValue(); }
+
/****************************** POSTSCRIPT OUTPUT PREFERENCES ******************************/
private static Pref cachePrintEncapsulated = Pref.makeBooleanPref("PostScriptEncapsulated", IOTool.tool.prefs, false);
diff --git a/com/sun/electric/tool/io/input/Applicon860.java b/com/sun/electric/tool/io/input/Applicon860.java
index 2aa34dc..d7010e7 100644
--- a/com/sun/electric/tool/io/input/Applicon860.java
+++ b/com/sun/electric/tool/io/input/Applicon860.java
@@ -5,7 +5,7 @@
* File: Applicon860.java
* Input tool: Applicon\860 input
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/CIF.java b/com/sun/electric/tool/io/input/CIF.java
index 136eb7a..fd4700f 100644
--- a/com/sun/electric/tool/io/input/CIF.java
+++ b/com/sun/electric/tool/io/input/CIF.java
@@ -6,9 +6,9 @@
* Input/output tool: CIF input
* Original C CIF Parser (front end) by Robert W. Hon, Schlumberger Palo Alto Research
* and its interface to C Electric (back end) by Robert Winstanley, University of Calgary.
- * Translated into Java by Steven M. Rubin, Sun Microsystems.
+ * Translated into Java by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/DEF.java b/com/sun/electric/tool/io/input/DEF.java
index 6bdd2e2..a645f7c 100644
--- a/com/sun/electric/tool/io/input/DEF.java
+++ b/com/sun/electric/tool/io/input/DEF.java
@@ -4,9 +4,9 @@
*
* File: DEF.java
* Input/output tool: DEF (Design Exchange Format) reader
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -99,7 +99,7 @@ import java.util.regex.Pattern;
*/
public class DEF extends LEFDEF
{
- // debugging control
+ // debugging control
private static final int LIMITNETS = -1; // for specialnets, 3710 eliminates all globals; 3717 includes one global (VSB)
private static final boolean READCOMPONENTS = true;
@@ -124,7 +124,7 @@ public class DEF extends LEFDEF
private Job job;
private Map<Cell,Map<String,String>> cellModifiedNetNames = new HashMap<Cell,Map<String,String>>();
private Map<Cell,Set<String>> cellOriginalNetNames = new HashMap<Cell,Set<String>>();
- private Map<Cell,Long> cellAutonames = new HashMap<Cell,Long>();
+ private Map<Cell,Long> cellAutonames = new HashMap<Cell,Long>();
private Pattern pat_starleftbracket = Pattern.compile(".*\\\\"+ "\\[");
private Pattern pat_leftbracket = Pattern.compile("\\\\"+ "\\[");
@@ -134,7 +134,7 @@ public class DEF extends LEFDEF
private DEFPreferences localPrefs;
public static class DEFPreferences extends InputPreferences
- {
+ {
public boolean physicalPlacement;
public boolean ignorePhysicalInNets;
public boolean usePureLayerNodes;
@@ -146,64 +146,68 @@ public class DEF extends LEFDEF
public boolean ignoreViasBlock;
public int unknownLayerHandling;
public boolean connectByGDSName;
+ public boolean connectAndPlaceAllPins;
- public DEFPreferences(boolean factory)
- {
- super(factory);
- if (factory)
- {
- physicalPlacement = IOTool.isFactoryDEFPhysicalPlacement();
- ignorePhysicalInNets = IOTool.isFactoryDEFIgnorePhysicalInNets();
- usePureLayerNodes = IOTool.isFactoryDEFUsePureLayerNodes();
- logicalPlacement = IOTool.isFactoryDEFLogicalPlacement();
- ignoreLogicalInSpecialNets = IOTool.isFactoryDEFIgnoreLogicalInSpecialNets();
- makeDummyCells = IOTool.isFactoryDEFMakeDummyCells();
- ignoreUngeneratedPins = IOTool.isFactoryDEFIgnoreUngeneratedPins();
- ignoreViasBlock = IOTool.isFactoryDEFIgnoreViasBlock();
- unknownLayerHandling = IOTool.getFactoryDEFInUnknownLayerHandling();
- connectByGDSName = IOTool.isFactoryDEFConnectByGDSNames();
- } else
- {
- physicalPlacement = IOTool.isDEFPhysicalPlacement();
- ignorePhysicalInNets = IOTool.isDEFIgnorePhysicalInNets();
- usePureLayerNodes = IOTool.isDEFUsePureLayerNodes();
- logicalPlacement = IOTool.isDEFLogicalPlacement();
- ignoreLogicalInSpecialNets = IOTool.isDEFIgnoreLogicalInSpecialNets();
- makeDummyCells = IOTool.isDEFMakeDummyCells();
- ignoreUngeneratedPins = IOTool.isDEFIgnoreUngeneratedPins();
- ignoreViasBlock = IOTool.isDEFIgnoreViasBlock();
- unknownLayerHandling = IOTool.getDEFInUnknownLayerHandling();
- connectByGDSName = IOTool.isDEFConnectByGDSNames();
- }
- }
+ public DEFPreferences(boolean factory)
+ {
+ super(factory);
+ if (factory)
+ {
+ physicalPlacement = IOTool.isFactoryDEFPhysicalPlacement();
+ ignorePhysicalInNets = IOTool.isFactoryDEFIgnorePhysicalInNets();
+ usePureLayerNodes = IOTool.isFactoryDEFUsePureLayerNodes();
+ logicalPlacement = IOTool.isFactoryDEFLogicalPlacement();
+ ignoreLogicalInSpecialNets = IOTool.isFactoryDEFIgnoreLogicalInSpecialNets();
+ makeDummyCells = IOTool.isFactoryDEFMakeDummyCells();
+ ignoreUngeneratedPins = IOTool.isFactoryDEFIgnoreUngeneratedPins();
+ ignoreViasBlock = IOTool.isFactoryDEFIgnoreViasBlock();
+ unknownLayerHandling = IOTool.getFactoryDEFInUnknownLayerHandling();
+ connectByGDSName = IOTool.isFactoryDEFConnectByGDSNames();
+ connectAndPlaceAllPins = IOTool.isFactoryDEFPlaceAndConnectAllPins();
+ } else
+ {
+ physicalPlacement = IOTool.isDEFPhysicalPlacement();
+ ignorePhysicalInNets = IOTool.isDEFIgnorePhysicalInNets();
+ usePureLayerNodes = IOTool.isDEFUsePureLayerNodes();
+ logicalPlacement = IOTool.isDEFLogicalPlacement();
+ ignoreLogicalInSpecialNets = IOTool.isDEFIgnoreLogicalInSpecialNets();
+ makeDummyCells = IOTool.isDEFMakeDummyCells();
+ ignoreUngeneratedPins = IOTool.isDEFIgnoreUngeneratedPins();
+ ignoreViasBlock = IOTool.isDEFIgnoreViasBlock();
+ unknownLayerHandling = IOTool.getDEFInUnknownLayerHandling();
+ connectByGDSName = IOTool.isDEFConnectByGDSNames();
+ connectAndPlaceAllPins = IOTool.isDEFPlaceAndConnectAllPins();
+ }
+ }
- @Override
- public Library doInput(URL fileURL, Library lib, Technology tech, EditingPreferences ep, Map<Library,Cell> currentCells, Map<CellId,BitSet> nodesToExpand, Job job)
- {
- DEF in = new DEF(ep, this);
- in.job = job;
+ @Override
+ public Library doInput(URL fileURL, Library lib, Technology tech, EditingPreferences ep, Map<Library,Cell> currentCells, Map<CellId,BitSet> nodesToExpand, Job job)
+ {
+ DEF in = new DEF(ep, this);
+ in.job = job;
if (in.openTextInput(fileURL)) return null;
lib = in.importALibrary(lib, tech, currentCells);
in.closeInput();
return lib;
- }
- }
+ }
+ }
/**
* Creates a new instance of DEF.
*/
- DEF(EditingPreferences ep, DEFPreferences ap) {
- super(ep);
- localPrefs = ap;
- }
+ DEF(EditingPreferences ep, DEFPreferences ap)
+ {
+ super(ep);
+ localPrefs = ap;
+ }
/**
* Method to import a library from disk.
* @param lib the library to fill
- * @param currentCells this map will be filled with currentCells in Libraries found in library file
+ * @param currentCells this map will be filled with currentCells in Libraries found in library file
* @return the created library (null on error).
*/
- @Override
+ @Override
protected Library importALibrary(Library lib, Technology tech, Map<Library,Cell> currentCells)
{
initKeywordParsing();
@@ -217,7 +221,7 @@ public class DEF extends LEFDEF
try
{
if (readFile(lib, currentCells)) return null; // error during reading
- } catch (IOException e)
+ } catch (IOException e)
{
System.out.println("ERROR reading DEF libraries");
}
@@ -241,13 +245,13 @@ public class DEF extends LEFDEF
Cell cell = null;
for(;;)
{
- if (job != null && job.checkAbort())
- {
- System.out.println("DEF import aborted!");
- break;
- }
+ if (job != null && job.checkAbort())
+ {
+ System.out.println("DEF import aborted!");
+ break;
+ }
- // get the next keyword
+ // get the next keyword
String key = getAKeyword();
if (key == null) break;
@@ -297,16 +301,6 @@ public class DEF extends LEFDEF
cell = Cell.makeInstance(ep, lib, cellName + "{lay}");
}
}
-// if (cell == null)
-// {
-// reportError("A cell must be currently opened for this operation, aborting.", null);
-// return true;
-// }
-// if (!cell.getCellName().getName().equals(cellName))
-// {
-// reportError("Cell name in DEF file '" + cellName + "' does not equal current cell name '" + cell.getCellName().getName() + "', aborting.", cell);
-// return true;
-// }
View cellView = cell.getCellName().getView();
if (cellView.getAbbreviation().equals("sch"))
{
@@ -314,7 +308,7 @@ public class DEF extends LEFDEF
}
} else if (cell == null || !cell.getCellName().getName().equals(cellName))
{
- // does not equal current cell, so make ie
+ // does not equal current cell, so make instance
cell = Cell.makeInstance(ep, lib, cellName + "{lay}");
}
@@ -454,13 +448,13 @@ public class DEF extends LEFDEF
if (ignoreToSemicolon("BLOCKAGES", cell)) return true;
for(;;)
{
- if (job != null && job.checkAbort())
- {
- System.out.println("DEF import aborted!");
- return true;
- }
+ if (job != null && job.checkAbort())
+ {
+ System.out.println("DEF import aborted!");
+ return true;
+ }
- // get the next keyword
+ // get the next keyword
String key = mustGetKeyword("BLOCKAGES", cell);
if (key == null) return true;
if (key.equals("-"))
@@ -555,13 +549,13 @@ public class DEF extends LEFDEF
if (ignoreToSemicolon("PINS", cell)) return true;
for(;;)
{
- if (job != null && job.checkAbort())
- {
- System.out.println("DEF import aborted!");
- return true;
- }
+ if (job != null && job.checkAbort())
+ {
+ System.out.println("DEF import aborted!");
+ return true;
+ }
- // get the next keyword
+ // get the next keyword
String key = mustGetKeyword("PINs", cell);
if (key == null) return true;
if (key.equals("-"))
@@ -582,6 +576,46 @@ public class DEF extends LEFDEF
return false;
}
+ private static class PinPlacement
+ {
+ Point2D ll, ur;
+ Point2D xy;
+ Orientation orient;
+ NodeProto np;
+
+ public PinPlacement()
+ {
+ ll = new Point2D.Double(0, 0);
+ ur = new Point2D.Double(0, 0);
+ xy = new Point2D.Double(0, 0);
+ orient = Orientation.IDENT;
+ np = null;
+ }
+
+ public PinPlacement(PinPlacement copy)
+ {
+ ll = copy.ll;
+ ur = copy.ur;
+ xy = copy.xy;
+ orient = copy.orient;
+ np = copy.np;
+ }
+
+ public boolean equals(Object o)
+ {
+ PinPlacement other = (PinPlacement)o;
+ if (ll.getX() != other.ll.getX()) return false;
+ if (ll.getY() != other.ll.getY()) return false;
+ if (ur.getX() != other.ur.getX()) return false;
+ if (ur.getY() != other.ur.getY()) return false;
+ if (xy.getX() != other.xy.getX()) return false;
+ if (xy.getY() != other.xy.getY()) return false;
+ if (orient != other.orient) return false;
+ if (np != other.np) return false;
+ return true;
+ }
+ }
+
private boolean readPin(Cell cell)
throws IOException
{
@@ -590,11 +624,9 @@ public class DEF extends LEFDEF
if (key == null) return true;
String pinName = translateDefName(key);
PortCharacteristic portCharacteristic = null;
- NodeProto np = null;
- Point2D ll = null, ur = null, xy = null;
- boolean haveCoord = false;
- GetOrientation orient = null;
+ List<PinPlacement> pinsToMake = new ArrayList<PinPlacement>();
+ PinPlacement curPin = new PinPlacement();
for(;;)
{
// get the next keyword
@@ -670,7 +702,7 @@ public class DEF extends LEFDEF
reportError("Unknown pin for layer " + layer + (mask == null ? "" : ", mask "+mask), cell);
return true;
}
- np = li.pin;
+ curPin.np = li.pin;
}
if (!key.equals("("))
@@ -678,19 +710,24 @@ public class DEF extends LEFDEF
reportError("Expected '(' in coordinate", cell);
return true;
}
- ll = readCoordinate(cell, true);
- if (ll == null) return true;
- ur = readCoordinate(cell, false);
- if (ur == null) return true;
+ curPin.ll = readCoordinate(cell, true);
+ if (curPin.ll == null) return true;
+ curPin.ur = readCoordinate(cell, false);
+ if (curPin.ur == null) return true;
continue;
}
if (key.equalsIgnoreCase("PLACED") || key.equalsIgnoreCase("FIXED"))
{
// get pin location and orientation
- xy = readCoordinate(cell, false);
- if (xy == null) return true;
- orient = new GetOrientation(cell);
- haveCoord = true;
+ curPin.xy = readCoordinate(cell, false);
+ if (curPin.xy == null) return true;
+ curPin.orient = new GetOrientation(cell).orient;
+ if (curPin.np != null)
+ {
+ // remember this PinPlacement
+ pinsToMake.add(curPin);
+ curPin = new PinPlacement(curPin);
+ }
continue;
}
continue;
@@ -720,33 +757,46 @@ public class DEF extends LEFDEF
// port must connect to both arcs
PortProto pp = loc_np.getPort(0);
- if (pp.connectsTo(apTry)) { np = loc_np; break; }
+ if (pp.connectsTo(apTry)) { curPin.np = loc_np; break; }
}
}
// if pin is ungenerated and placement is requested, put it at the origin
- if (!haveCoord && !localPrefs.ignoreUngeneratedPins)
- {
- haveCoord = true;
- xy = new Point2D.Double(0, 0);
- }
+ if (curPin.xy == null && !localPrefs.ignoreUngeneratedPins)
+ curPin.xy = new Point2D.Double(0, 0);
+
+ // now make list of pins to place
+ if (curPin.np != null && curPin.xy != null) pinsToMake.add(curPin);
- // all factors read, now place the pin
- if (np != null && haveCoord)
+ // special case when all export (PIN) geometries must be instantiated and connected
+ if (localPrefs.connectAndPlaceAllPins)
{
- // determine the pin size
- FixpTransform trans = orient.orient.pureRotate();
- trans.transform(ll, ll);
- trans.transform(ur, ur);
- double sX = Math.abs(ll.getX() - ur.getX());
- double sY = Math.abs(ll.getY() - ur.getY());
- double cX = (ll.getX() + ur.getX()) / 2 + xy.getX();
- double cY = (ll.getY() + ur.getY()) / 2 + xy.getY();
+ // eliminate redundant pins
+ for(int i=1; i<pinsToMake.size(); i++)
+ {
+ PinPlacement last = pinsToMake.get(i-1);
+ PinPlacement current = pinsToMake.get(i);
+ if (!last.equals(current)) continue;
+ pinsToMake.remove(i);
+ i--;
+ }
- // make the pin
- EPoint loc = EPoint.fromLambda(cX, cY);
- if (acceptNode(loc, sX, sY))
+ // place the pins
+ PortInst lastPi = null;
+ for(PinPlacement cp : pinsToMake)
{
+ // determine the pin size
+ FixpTransform trans = cp.orient.pureRotate();
+ trans.transform(cp.ll, cp.ll);
+ trans.transform(cp.ur, cp.ur);
+ double sX = Math.abs(cp.ll.getX() - cp.ur.getX());
+ double sY = Math.abs(cp.ll.getY() - cp.ur.getY());
+ double cX = (cp.ll.getX() + cp.ur.getX()) / 2 + cp.xy.getX();
+ double cY = (cp.ll.getY() + cp.ur.getY()) / 2 + cp.xy.getY();
+
+ // make the pin
+ EPoint loc = EPoint.fromLambda(cX, cY);
+ if (!acceptNode(loc, sX, sY)) continue;
if (LIMITINGAREA)
{
double lX = loc.getX() - sX/2;
@@ -760,52 +810,119 @@ public class DEF extends LEFDEF
sY = hY - lY;
}
- Export ex = cell.findExport(pinName);
- if (ex != null)
- {
- NodeInst existingNI = ex.getOriginalPort().getNodeInst();
- if (existingNI.getProto() == np)
- {
- if (!DBMath.areEquals(existingNI.getAnchorCenterX(), cX) || !DBMath.areEquals(existingNI.getAnchorCenterY(), cY) ||
- !DBMath.areEquals(existingNI.getLambdaBaseXSize(), sX) || !DBMath.areEquals(existingNI.getLambdaBaseYSize(), sY))
- {
- String msg = "Cell already has an export named '" + pinName + "' that is different.";
- if (!DBMath.areEquals(existingNI.getAnchorCenterX(), cX) || !DBMath.areEquals(existingNI.getAnchorCenterY(), cY))
- msg += " Center was (" + TextUtils.formatDistance(existingNI.getAnchorCenterX()) + "," +
- TextUtils.formatDistance(existingNI.getAnchorCenterY()) + ") but now is (" + TextUtils.formatDistance(cX) +
- "," + TextUtils.formatDistance(cY) + ").";
- if (!DBMath.areEquals(existingNI.getLambdaBaseXSize(), sX) || !DBMath.areEquals(existingNI.getLambdaBaseYSize(), sY))
- msg += " Size was " + TextUtils.formatDistance(existingNI.getLambdaBaseXSize()) + "X" +
- TextUtils.formatDistance(existingNI.getLambdaBaseYSize()) + " but now is " + TextUtils.formatDistance(sX) +
- "X" + TextUtils.formatDistance(sY);
- reportWarning(msg, existingNI, cell);
- double dX = cX - existingNI.getAnchorCenterX();
- double dY = cY - existingNI.getAnchorCenterY();
- double dXSize = sX - existingNI.getLambdaBaseXSize();
- double dYSize = sY - existingNI.getLambdaBaseYSize();
- existingNI.modifyInstance(dX, dY, dXSize, dYSize, Orientation.IDENT);
- }
- return false;
- }
- String newPinName = ElectricObject.uniqueObjectName(pinName, cell, Export.class, false, true);
- reportWarning("Cell already has an export named '" + pinName + "' on node " +
- existingNI.getProto().describe(false) + ". Making new export '" + newPinName + "' on node " + np.describe(false),
- existingNI, cell);
- pinName = newPinName;
- }
-
- // create the pin and export
- NodeInst ni = makeNode(np, loc, sX, sY, cell);
- if (ni == null) return true;
- PortInst pi = ni.findPortInstFromProto(np.getPort(0));
- Export e = Export.newInstance(cell, pi, pinName, ep, portCharacteristic);
- if (e == null)
+ // see if pin exists at this location
+ NodeInst existingNI = null;
+ for(Iterator<NodeInst> it = cell.getNodes(); it.hasNext(); )
{
- reportError("Unable to create pin name", cell);
- return true;
+ NodeInst ni = it.next();
+ if (ni.getProto() != cp.np) continue;
+ if (!ni.getProto().getFunction().isPin()) continue;
+ if (!DBMath.areEquals(ni.getAnchorCenterX(), cX) || !DBMath.areEquals(ni.getAnchorCenterY(), cY)) continue;
+ existingNI = ni;
+ break;
+ }
+ PortInst pi;
+ if (existingNI != null)
+ {
+ // pin found at this location: reuse
+ pi = existingNI.getOnlyPortInst();
+ } else
+ {
+ // no pin at this location: create it
+ String newPinName = ElectricObject.uniqueObjectName(pinName, cell, Export.class, false, true);
+ NodeInst ni = makeNode(cp.np, loc, sX, sY, cell);
+ if (ni == null) return true;
+ pi = ni.findPortInstFromProto(cp.np.getPort(0));
+ Export e = Export.newInstance(cell, pi, newPinName, ep, portCharacteristic);
+ if (e == null)
+ {
+ reportError("Unable to create pin " + newPinName, cell);
+ return true;
+ }
+ }
+ if (lastPi != null)
+ makeUnroutedConnection(lastPi, pi, null);
+ lastPi = pi;
+ continue;
+ }
+ } else
+ {
+ // place only the current pin, determine its size
+ if (curPin.np == null)
+ {
+ reportError("No layer given for pin", cell);
+ return false;
+ }
+ FixpTransform trans = curPin.orient.pureRotate();
+ trans.transform(curPin.ll, curPin.ll);
+ trans.transform(curPin.ur, curPin.ur);
+ double sX = Math.abs(curPin.ll.getX() - curPin.ur.getX());
+ double sY = Math.abs(curPin.ll.getY() - curPin.ur.getY());
+ double cX = (curPin.ll.getX() + curPin.ur.getX()) / 2 + curPin.xy.getX();
+ double cY = (curPin.ll.getY() + curPin.ur.getY()) / 2 + curPin.xy.getY();
+
+ // make the pin
+ EPoint loc = EPoint.fromLambda(cX, cY);
+ if (!acceptNode(loc, sX, sY)) return false;
+ if (LIMITINGAREA)
+ {
+ double lX = loc.getX() - sX/2;
+ double hX = loc.getX() + sX/2;
+ double lY = loc.getY() - sY/2;
+ double hY = loc.getY() + sY/2;
+ if (hX > MAXX) hX = MAXX;
+ if (hY > MAXY) hY = MAXY;
+ loc = EPoint.fromLambda((lX+hX)/2, (lY+hY)/2);
+ sX = hX - lX;
+ sY = hY - lY;
+ }
+ // default case where only one export (PIN) is created
+ Export ex = cell.findExport(pinName);
+ if (ex != null)
+ {
+ NodeInst existingNI = ex.getOriginalPort().getNodeInst();
+ if (existingNI.getProto() == curPin.np)
+ {
+ if (!DBMath.areEquals(existingNI.getAnchorCenterX(), cX) || !DBMath.areEquals(existingNI.getAnchorCenterY(), cY) ||
+ !DBMath.areEquals(existingNI.getLambdaBaseXSize(), sX) || !DBMath.areEquals(existingNI.getLambdaBaseYSize(), sY))
+ {
+ String msg = "Cell already has an export named '" + pinName + "' that is different.";
+ if (!DBMath.areEquals(existingNI.getAnchorCenterX(), cX) || !DBMath.areEquals(existingNI.getAnchorCenterY(), cY))
+ msg += " Center was (" + TextUtils.formatDistance(existingNI.getAnchorCenterX()) + "," +
+ TextUtils.formatDistance(existingNI.getAnchorCenterY()) + ") but now is (" + TextUtils.formatDistance(cX) +
+ "," + TextUtils.formatDistance(cY) + ").";
+ if (!DBMath.areEquals(existingNI.getLambdaBaseXSize(), sX) || !DBMath.areEquals(existingNI.getLambdaBaseYSize(), sY))
+ msg += " Size was " + TextUtils.formatDistance(existingNI.getLambdaBaseXSize()) + "X" +
+ TextUtils.formatDistance(existingNI.getLambdaBaseYSize()) + " but now is " + TextUtils.formatDistance(sX) +
+ "X" + TextUtils.formatDistance(sY);
+ reportWarning(msg, existingNI, cell);
+ double dX = cX - existingNI.getAnchorCenterX();
+ double dY = cY - existingNI.getAnchorCenterY();
+ double dXSize = sX - existingNI.getLambdaBaseXSize();
+ double dYSize = sY - existingNI.getLambdaBaseYSize();
+ existingNI.modifyInstance(dX, dY, dXSize, dYSize, Orientation.IDENT);
+ }
+ return false;
}
+ String newPinName = ElectricObject.uniqueObjectName(pinName, cell, Export.class, false, true);
+ reportWarning("Cell already has an export named '" + pinName + "' on node " +
+ existingNI.getProto().describe(false) + ". Making new export '" + newPinName + "' on node " + curPin.np.describe(false),
+ existingNI, cell);
+ pinName = newPinName;
+ }
+
+ // create the pin and export
+ NodeInst ni = makeNode(curPin.np, loc, sX, sY, cell);
+ if (ni == null) return true;
+ PortInst pi = ni.findPortInstFromProto(curPin.np.getPort(0));
+ Export e = Export.newInstance(cell, pi, pinName, ep, portCharacteristic);
+ if (e == null)
+ {
+ reportError("Unable to create pin name", cell);
+ return true;
}
}
+
return false;
}
@@ -817,11 +934,11 @@ public class DEF extends LEFDEF
if (ignoreToSemicolon("COMPONENTS", cell)) return true;
for(;;)
{
- if (job != null && job.checkAbort())
- {
- System.out.println("DEF import aborted!");
- return true;
- }
+ if (job != null && job.checkAbort())
+ {
+ System.out.println("DEF import aborted!");
+ return true;
+ }
// get the next keyword
String key = mustGetKeyword("COMPONENTs", cell);
@@ -939,65 +1056,6 @@ public class DEF extends LEFDEF
if (key.equals(";")) break;
}
- // place the node
-// Variable prX = np.getVar(prXkey);
-// double width=0;
-// if (prX != null)
-// {
-// String tmps = prX.getPureValue(0);
-// width = TextUtils.atof(tmps);
-// } else
-// {
-// width = sX; //no PR boundary, use cell boundary
-// }
-// Variable prY = np.getVar(prYkey);
-// double height=0;
-// if (prY != null)
-// {
-// String tmps = prY.getPureValue(0);
-// height = TextUtils.atof(tmps);
-// } else
-// {
-// height = sY; //no PR boundary, use cell boundary
-// }
-//
-// // DEF orientations require translations from Java orientations
-// if (or.equals(Orientation.YRR))
-// {
-// // FN DEF orientation
-// nx = nx + width;
-// }
-// if (or.equals(Orientation.Y))
-// {
-// // FS DEF orientation
-// ny = ny + height;
-// }
-// if (or.equals(Orientation.RR))
-// {
-// // S DEF orientation
-// ny = ny + height;
-// nx = nx + width;
-// }
-// if (or.equals(Orientation.RRR))
-// {
-// // E DEF orientation
-// ny = ny + width;
-// }
-// if (or.equals(Orientation.R))
-// {
-// // W DEF orientation
-// nx = nx + height;
-// }
-// if (or.equals(Orientation.YRRR))
-// {
-// // FE DEF orientation
-// }
-// if (or.equals(Orientation.YR))
-// {
-// // FW DEF orientation
-// nx = nx + height;
-// ny = ny + width;
-// }
EPoint loc = EPoint.fromLambda(nx, ny);
if (acceptNode(loc, sX, sY))
{
@@ -1136,10 +1194,6 @@ public class DEF extends LEFDEF
break;
}
}
-// String tmp = topology.getArcAutoname().toString(); // could be done with a split
-// int index = tmp.indexOf("@");
-// if (index != -1) tmp = tmp.substring(index+1, tmp.length());
-// newN = tmp + netName;
if (Job.getDebug())
System.out.println("Net name already taken '" + netName + "'. Using '" + newN + "'");
if (map == null)
@@ -1158,8 +1212,6 @@ public class DEF extends LEFDEF
cellOriginalNetNames.put(cell, names);
}
names.add(netName);
-// if (Job.getDebug())
-// System.out.println("Caching '" + netName + "' as well");
}
}
else
@@ -1233,7 +1285,6 @@ public class DEF extends LEFDEF
doingRect = false;
specialWidth = 0;
specialFunction = null;
-// currentMask = null;
if (schImport)
{
@@ -1343,7 +1394,7 @@ public class DEF extends LEFDEF
li = getLayerInformation(currentLayer, currentMask);
if (li.pin == null)
{
- reportError("Unknown net rect layer " + currentLayer + (currentMask == null ? "" : ", mask "+currentMask), cell);
+ reportError("Unknown pin associated to net rect layer " + currentLayer + (currentMask == null ? "" : ", mask "+currentMask), cell);
return true;
}
pathStart = true;
@@ -2230,7 +2281,6 @@ public class DEF extends LEFDEF
// get the via layer
key = mustGetKeyword("VIA", null);
if (key == null) return true;
-// vg.viaLayer = getLayerInformation(key, null);
vg.viaLayer = getLayerBasedOnNameAndMask(key, null, localPrefs.unknownLayerHandling);
if (vg.viaLayer == null || vg.viaLayer.pure == null)
{
@@ -2420,13 +2470,7 @@ public class DEF extends LEFDEF
if (lib == curlib) continue;
cell = lib.findNodeProto(name);
if (cell != null)
- {
- // must copy the cell
-// Cell newCell = copyrecursively(cell, cell->protoname, curlib, cell->cellview,
-// FALSE, FALSE, "", FALSE, FALSE, TRUE, new HashSet());
-// return newCell;
return cell;
- }
}
return null;
}
@@ -2444,21 +2488,12 @@ public class DEF extends LEFDEF
if (lib.isHidden()) continue;
if (lib == curlib) continue;
cell = lib.findNodeProto(name);
- if (cell != null)
- {
- // must copy the cell
-// Cell newCell = copyrecursively(cell, cell->protoname, curlib, cell->cellview,
-// FALSE, FALSE, "", FALSE, FALSE, TRUE, new HashSet());
-// return newCell;
- return cell;
- }
+ if (cell != null) return cell;
}
return null;
}
- //RBR - temporary method until I figure out
- //why in Java 6.0 my use of GetOrientation
- //generates a compile error
+ // RBR - temporary method until I figure out why in Java 6.0 my use of GetOrientation generates a compile error
private Orientation FetchOrientation(Cell cell) throws IOException
{
String key = mustGetKeyword("orientation", cell);
@@ -2581,7 +2616,7 @@ public class DEF extends LEFDEF
NodeInst ni = NodeInst.makeInstance(np, ep, loc, sX, sY, cell);
if (ni == null)
{
- reportError("Unable to create node", cell);
+ reportError("Unable to create node of type "+np, cell);
return null;
}
return ni;
@@ -2624,8 +2659,6 @@ public class DEF extends LEFDEF
// found other export to connect by name
PortInst pi = ni1.findPortInstFromEquivalentProto(e);
makeSingleUnroutedConnection(pi, pi2, null);
-//System.out.println("CONNECTION FROM "+ni1.describe(false)+" PORT "+pe1.getName()+" TO NODE "+ni2.describe(false)+" PORT "+pe2.getName()+
-// " ALSO CONNECTS TO NODE "+pi.getNodeInst().describe(false)+" PORT "+pi.getPortProto().getName());
}
}
}
@@ -2646,8 +2679,6 @@ public class DEF extends LEFDEF
// found other export to connect by name
PortInst pi = ni2.findPortInstFromEquivalentProto(e);
makeSingleUnroutedConnection(pi1, pi, null);
-//System.out.println("CONNECTION FROM "+ni1.describe(false)+" PORT "+pe1.getName()+" TO NODE "+ni2.describe(false)+" PORT "+pe2.getName()+
-// " ALSO CONNECTS TO NODE "+pi.getNodeInst().describe(false)+" PORT "+pi.getPortProto().getName());
}
}
}
@@ -2724,35 +2755,6 @@ public class DEF extends LEFDEF
}
return false;
}
-
-// protected GetLayerInformation getLayerBasedOnNameAndMask(String metalLayer, Integer mask)
-// {
-// GetLayerInformation gLay = getLayerInformation(metalLayer, mask);
-// if (gLay.pure == null && mask != null)
-// {
-// gLay = getLayerInformation(metalLayer, null);
-// if (gLay != null)
-// reportWarning("Layer " + metalLayer + ", mask " + mask + " not found, using non-mask version", null);
-// }
-// if (gLay.pure == null)
-// {
-// int unknownLayerHandling = localPrefs.unknownLayerHandling; // original given value;
-// if (unknownLayerHandling == IOTool.DEFUNKNOWNLAYERIGNORE)
-// {
-// reportError("Layer " + metalLayer + " not found", null);
-// return null;
-// }
-// else if (unknownLayerHandling == IOTool.DEFUNKNOWNLAYERUSEDRC)
-// {
-// reportWarning("Layer " + metalLayer + " was replaced by DRC layer", null);
-// gLay = getLayerInformation(Generic.tech().drcLay.getName(), null, Generic.tech());
-// assert(gLay != null);
-// }
-// else
-// assert(false); // should not reach this
-// }
-// return gLay;
-// }
/**
* Method to find a ViaDef given its name.
@@ -3083,85 +3085,4 @@ public class DEF extends LEFDEF
System.out.println("WARNING: Arc function " + got + " found at line " + lineReader.getLineNumber() +
" but expected function " + exp);
}
-
-// private static class ProfileIt
-// {
-// String methodName;
-// double totalTime;
-// int totalCalls;
-// long timeAtEnter;
-//
-// static Map<String,ProfileIt> allClasses;
-//
-// private ProfileIt(String name)
-// {
-// methodName = name;
-// totalTime = 0;
-// totalCalls = 0;
-// }
-//
-// public static void init()
-// {
-// allClasses = new HashMap<String,ProfileIt>();
-// }
-//
-// public static void enter(String name)
-// {
-// ProfileIt md = allClasses.get(name);
-// if (md == null) allClasses.put(name, md = new ProfileIt(name));
-// md.timeAtEnter = System.nanoTime();
-// md.totalCalls++;
-// }
-//
-// public static void exit(String name)
-// {
-// ProfileIt md = allClasses.get(name);
-// if (md == null) allClasses.put(name, md = new ProfileIt(name));
-// long timeNow = System.nanoTime();
-// md.totalTime += timeNow - md.timeAtEnter;
-// }
-//
-// public static void dump()
-// {
-// List<ProfileIt> totalList = new ArrayList<ProfileIt>();
-// for(String name : allClasses.keySet()) totalList.add(allClasses.get(name));
-// Collections.sort(totalList, new ProfileItByTime());
-// int widestName = 0;
-// for(ProfileIt pi : totalList) widestName = Math.max(widestName, pi.methodName.length());
-// if (widestName < 10) widestName = 10;
-// widestName++;
-//
-// String header = "Method";
-// while (header.length() < widestName) header += " ";
-// header += " #calls Total Time (ns)";
-// System.out.println(header);
-//
-// for(ProfileIt pi : totalList)
-// {
-// String name = pi.methodName;
-// while (name.length() < widestName) name += " ";
-//
-// String callCount = "" + pi.totalCalls;
-// while (callCount.length() < 7) callCount = " " + callCount;
-//
-// DecimalFormat df = new DecimalFormat("#,##0");
-// String totTime = df.format(pi.totalTime); // TextUtils.formatDouble(pi.totalTime);
-// while (totTime.length() < 20) totTime = " " + totTime;
-// System.out.println(name+callCount+totTime);
-// }
-// }
-// }
-//
-// /**
-// * Comparator class for sorting Preferences by their name.
-// */
-// public static class ProfileItByTime implements Comparator<ProfileIt>
-// {
-// public int compare(ProfileIt p1, ProfileIt p2)
-// {
-// if (p1.totalTime < p2.totalTime) return 1;
-// if (p1.totalTime > p2.totalTime) return -1;
-// return 0;
-// }
-// }
}
diff --git a/com/sun/electric/tool/io/input/DXF.java b/com/sun/electric/tool/io/input/DXF.java
index f980201..82350e6 100644
--- a/com/sun/electric/tool/io/input/DXF.java
+++ b/com/sun/electric/tool/io/input/DXF.java
@@ -4,9 +4,9 @@
*
* File: DXF.java
* Input/output tool: DXF input
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/EDIF.java b/com/sun/electric/tool/io/input/EDIF.java
index 0c10be6..e8f8249 100644
--- a/com/sun/electric/tool/io/input/EDIF.java
+++ b/com/sun/electric/tool/io/input/EDIF.java
@@ -5,9 +5,9 @@
* File: EDIF.java
* Input/output tool: EDIF 2.0.0 input
* Original EDIF reader by Glen Lawson.
- * Translated into Java and debugged by Steven M. Rubin, Sun Microsystems.
+ * Translated into Java and debugged by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/ELIB.java b/com/sun/electric/tool/io/input/ELIB.java
index ef94ed6..27b90eb 100644
--- a/com/sun/electric/tool/io/input/ELIB.java
+++ b/com/sun/electric/tool/io/input/ELIB.java
@@ -4,9 +4,9 @@
*
* File: ELIB.java
* Input/output tool: ELIB Library input
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/EpicOut.java b/com/sun/electric/tool/io/input/EpicOut.java
index c857738..8fb1e52 100644
--- a/com/sun/electric/tool/io/input/EpicOut.java
+++ b/com/sun/electric/tool/io/input/EpicOut.java
@@ -5,7 +5,7 @@
* File: EpicOut.java
* Module to read Nanosim simulation output
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/GDS.java b/com/sun/electric/tool/io/input/GDS.java
index a3d01fe..1c27bf8 100644
--- a/com/sun/electric/tool/io/input/GDS.java
+++ b/com/sun/electric/tool/io/input/GDS.java
@@ -5,9 +5,9 @@
* File: GDS.java
* Input/output tool: GDS input
* Original C code written by Glen M. Lawson, S-MOS Systems, Inc.
- * Translated into Java by Steven M. Rubin, Sun Microsystems.
+ * Translated into Java by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -61,14 +61,15 @@ import com.sun.electric.technology.Technology.NodeLayer;
import com.sun.electric.technology.technologies.Artwork;
import com.sun.electric.technology.technologies.Generic;
import com.sun.electric.tool.Job;
+import com.sun.electric.tool.io.FileType;
import com.sun.electric.tool.io.GDSReader;
import com.sun.electric.tool.io.GDSReader.GSymbol;
import com.sun.electric.tool.io.IOTool;
-import com.sun.electric.tool.io.input.CellArrayBuilder;
import com.sun.electric.tool.ncc.basic.NccCellAnnotations;
+import com.sun.electric.tool.user.dialogs.OpenFile;
import com.sun.electric.tool.user.ui.LayerVisibility;
-import com.sun.electric.util.math.FixpCoord;
import com.sun.electric.util.math.DBMath;
+import com.sun.electric.util.math.FixpCoord;
import com.sun.electric.util.math.GenMath;
import com.sun.electric.util.math.MutableInteger;
import com.sun.electric.util.math.Orientation;
@@ -76,7 +77,13 @@ import com.sun.electric.util.math.Orientation;
import java.awt.Point;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
+import java.io.BufferedWriter;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.PrintWriter;
import java.net.URL;
+import java.net.URLConnection;
import java.util.ArrayList;
import java.util.BitSet;
import java.util.Collection;
@@ -111,14 +118,13 @@ import java.util.TreeSet;
*/
public class GDS extends Input<Object>
{
- private static final boolean DEBUGALL = false; /* true for debugging */
private static final boolean SHOWPROGRESS = false; /* true for debugging */
-// private static final boolean IGNOREIMMENSECELLS = false; /* true for debugging */
private static final boolean TALLYCONTENTS = false; /* true for debugging */
/** key of Variable holding original GDS file. */ public static final Variable.Key SKELETON_ORIGIN = Variable.newKey("ATTR_GDS_original");
/** key of Variable holding original export name. */ public static final Variable.Key ORIGINAL_EXPORT_NAME = Variable.newKey("GDS_original_export_name");
+ public static final boolean CADENCE_GROWS_SIZE = true;
public static final boolean INSTANTIATE_ARRAYS_VIA_BISECTION = true;
// data declarations
@@ -159,6 +165,7 @@ public class GDS extends Input<Object>
private static boolean arraySimplificationUseful;
private Set<Cell> missingCells;
private MakeInstance lastExportInstance = null;
+ private PrintWriter printWriter;
private static GSymbol [] optionSet = {GDSReader.GDS_ATTRTABLE, GDSReader.GDS_REFLIBS, GDSReader.GDS_FONTS, GDSReader.GDS_GENERATIONS};
private static GSymbol [] shapeSet = {GDSReader.GDS_AREF, GDSReader.GDS_SREF, GDSReader.GDS_BOUNDARY, GDSReader.GDS_PATH,
@@ -187,6 +194,7 @@ public class GDS extends Input<Object>
public boolean includeText;
public int unknownLayerHandling;
public boolean cadenceCompatibility;
+ public boolean dumpReadable;
public boolean skeletonize;
boolean onlyVisibleLayers;
boolean[] visibility;
@@ -209,6 +217,7 @@ public class GDS extends Input<Object>
includeText = IOTool.isFactoryGDSIncludesText();
unknownLayerHandling = IOTool.getFactoryGDSInUnknownLayerHandling();
cadenceCompatibility = IOTool.isFactoryGDSCadenceCompatibility();
+ dumpReadable = IOTool.isFactoryGDSDumpReadable();
onlyVisibleLayers = IOTool.isFactoryGDSOnlyInvisibleLayers();
} else
{
@@ -221,6 +230,7 @@ public class GDS extends Input<Object>
includeText = IOTool.isGDSIncludesText();
unknownLayerHandling = IOTool.getGDSInUnknownLayerHandling();
cadenceCompatibility = IOTool.isGDSCadenceCompatibility();
+ dumpReadable = IOTool.isGDSDumpReadable();
onlyVisibleLayers = IOTool.isGDSOnlyInvisibleLayers();
}
if (onlyVisibleLayers)
@@ -669,37 +679,14 @@ public class GDS extends Input<Object>
private void makeInstances()
{
boolean countOff = false;
- if (SHOWPROGRESS /*|| IGNOREIMMENSECELLS*/)
+ if (SHOWPROGRESS)
{
int size = insts.size();
int arraySize = instArrays.size();
System.out.println("Building cell " + this.cell.describe(false) +
" with " + size + " single instances and " + arraySize + " arrayed instances");
if (size+arraySize >= 100000)
- {
countOff = true;
-
- // ignore internal contents when cell is very large (for testing only)
-// if (IGNOREIMMENSECELLS)
-// {
-// cellsTooComplex.add(cell.getId());
-// MakeInstance ll = null, ul = null, lr = null, ur = null;
-// for(MakeInstance mi : insts)
-// {
-// if (ll == null) ll = ul = lr = ur = mi;
-// if (mi.loc.getX() <= ll.loc.getX() && mi.loc.getY() <= ll.loc.getY()) ll = mi;
-// if (mi.loc.getX() <= ul.loc.getX() && mi.loc.getY() >= ul.loc.getY()) ul = mi;
-// if (mi.loc.getX() >= lr.loc.getX() && mi.loc.getY() <= lr.loc.getY()) lr = mi;
-// if (mi.loc.getX() >= ur.loc.getX() && mi.loc.getY() >= ur.loc.getY()) ur = mi;
-// }
-// insts.clear();
-// instArrays.clear();
-// insts.add(ll);
-// if (!insts.contains(ul)) insts.add(ul);
-// if (!insts.contains(lr)) insts.add(lr);
-// if (!insts.contains(ur)) insts.add(ur);
-// }
- }
}
int count = 0;
@@ -729,56 +716,77 @@ public class GDS extends Input<Object>
// center the export if possible
ArcProto theArc = mi.proto.getPort(0).getBasePort().getConnections()[0];
Layer theLayer = theArc.getLayer(0);
- NodeProto theProto = theLayer.getPureLayerNode();
- Rectangle2D search = new Rectangle2D.Double(mi.loc.getX(), mi.loc.getY(), 0, 0);
- for(Iterator<Geometric> it = this.cell.searchIterator(search); it.hasNext(); )
- {
- Geometric geom = it.next();
- if (geom instanceof NodeInst)
- {
- NodeInst ni = (NodeInst)geom;
- if (ni.getProto() != theProto) continue;
- Rectangle2D pointBounds = ni.getBounds();
- double cX = pointBounds.getCenterX();
- double cY = pointBounds.getCenterY();
- EPoint [] trace = ni.getTrace();
- if (trace != null)
- {
- PolyBase.Point [] newPoints = new PolyBase.Point[trace.length];
- for(int i=0; i<trace.length; i++)
- {
- if (trace[i] != null)
- newPoints[i] = PolyBase.fromLambda(trace[i].getX()+cX, trace[i].getY()+cY);
- }
- PolyBase poly = new PolyBase(newPoints);
- poly.transform(ni.rotateOut());
- if (poly.contains(mi.loc))
- {
- GeometryHandler thisMerge = GeometryHandler.createGeometryHandler(GeometryHandler.GHMode.ALGO_SWEEP, 1);
- thisMerge.add(theLayer, poly);
- thisMerge.postProcess(true);
- Collection<PolyBase> set = ((PolySweepMerge)thisMerge).getPolyPartition(theLayer);
- for(PolyBase simplePoly : set)
- {
- Rectangle2D polyBounds = simplePoly.getBounds2D();
- if (polyBounds.contains(mi.loc))
- {
- mi.loc.setLocation(polyBounds.getCenterX(), polyBounds.getCenterY());
- break;
- }
- }
- break;
- }
- } else
- {
- if (pointBounds.contains(mi.loc))
- {
- mi.loc.setLocation(cX, cY);
- break;
- }
- }
- }
- }
+ Set<NodeProto> possibleProtos = new HashSet<NodeProto>();
+ PrimitiveNode pNp = theLayer.getPureLayerNode();
+ if (pNp != null)
+ {
+ possibleProtos.add(pNp);
+ for(Iterator<Layer> it = pNp.getTechnology().getLayers(); it.hasNext(); )
+ {
+ Layer poss = it.next();
+ if (poss == theLayer) continue;
+ if (poss.getFunction().isMetal())
+ {
+ if (poss.getFunction().getLevel() == theLayer.getFunction().getLevel())
+ possibleProtos.add(poss.getPureLayerNode());
+ }
+ }
+ Rectangle2D search = new Rectangle2D.Double(mi.loc.getX(), mi.loc.getY(), 0, 0);
+ for(Iterator<Geometric> it = cell.searchIterator(search); it.hasNext(); )
+ {
+ Geometric geom = it.next();
+ if (geom instanceof NodeInst)
+ {
+ NodeInst ni = (NodeInst)geom;
+ if (!possibleProtos.contains(ni.getProto())) continue;
+ Rectangle2D pointBounds = ni.getBounds();
+ double cX = pointBounds.getCenterX();
+ double cY = pointBounds.getCenterY();
+ EPoint [] trace = ni.getTrace();
+ if (trace != null)
+ {
+ PolyBase.Point [] newPoints = new PolyBase.Point[trace.length];
+ for(int i=0; i<trace.length; i++)
+ {
+ if (trace[i] != null)
+ newPoints[i] = PolyBase.fromLambda(trace[i].getX()+cX, trace[i].getY()+cY);
+ }
+ PolyBase poly = new PolyBase(newPoints);
+ poly.transform(ni.rotateOut());
+ if (poly.contains(mi.loc))
+ {
+ GeometryHandler thisMerge = GeometryHandler.createGeometryHandler(GeometryHandler.GHMode.ALGO_SWEEP, 1);
+ thisMerge.add(theLayer, poly);
+ thisMerge.postProcess(true);
+ Collection<PolyBase> set = ((PolySweepMerge)thisMerge).getPolyPartition(theLayer);
+ for(PolyBase simplePoly : set)
+ {
+ Rectangle2D polyBounds = simplePoly.getBounds2D();
+ if (polyBounds.contains(mi.loc))
+ {
+ mi.loc.setLocation(polyBounds.getCenterX(), polyBounds.getCenterY());
+ break;
+ }
+ }
+ break;
+ }
+ } else
+ {
+ if (pointBounds.contains(mi.loc))
+ {
+ mi.loc.setLocation(cX, cY);
+ if (CADENCE_GROWS_SIZE)
+ {
+ double minSize = Math.min(pointBounds.getWidth(), pointBounds.getHeight());
+ if (mi.wid < minSize) mi.wid = minSize;
+ if (mi.hei < minSize) mi.hei = minSize;
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
// grid-align the export location
double scaledResolution = tech.getFactoryResolution().getLambda();
@@ -1092,7 +1100,7 @@ public class GDS extends Input<Object>
* Method to find missing cells in the GDS and substitute references to cells in other libraries.
* @param missingCells
* @param theLibrary
- * @return
+ * @return Map of missing Cells.
*/
private Map<Cell,Cell> substituteExternalCells(Set<Cell> missingCells, Library theLibrary)
{
@@ -1282,30 +1290,38 @@ public class GDS extends Input<Object>
}
}
- if (INSTANTIATE_ARRAYS_VIA_BISECTION) {
+ if (INSTANTIATE_ARRAYS_VIA_BISECTION)
+ {
double colspace;
double rowspace;
int rows;
int cols;
- if (orient.getAngle() % 1800 == 0) {
- if (rowOffset.getX() == 0 && colOffset.getY() == 0) {
+ if (orient.getAngle() % 1800 == 0)
+ {
+ if (rowOffset.getX() == 0 && colOffset.getY() == 0)
+ {
colspace = colOffset.getX();
rowspace = rowOffset.getY();
cols = nCols;
rows = nRows;
- } else {
+ } else
+ {
throw new Error("jagged arrays not allowed");
}
- } else if (orient.getAngle() % 1800 == 900) {
- if (colOffset.getX() == 0 && rowOffset.getY() == 0) {
+ } else if (orient.getAngle() % 1800 == 900)
+ {
+ if (colOffset.getX() == 0 && rowOffset.getY() == 0)
+ {
colspace = rowOffset.getX();
rowspace = colOffset.getY();
cols = nRows;
rows = nCols;
- } else {
+ } else
+ {
throw new Error("jagged arrays not allowed");
}
- } else {
+ } else
+ {
throw new Error("nonrectangular arrays not allowed");
}
cellArrayBuilder.buildArray(proto,
@@ -1387,7 +1403,7 @@ public class GDS extends Input<Object>
private NodeProto proto;
private final Point2D loc;
private final Orientation orient;
- private final double wid, hei;
+ private double wid, hei;
private final EPoint[] points; // trace
private String exportOrTextName; // export
private boolean isVariableText; // for annotation text
@@ -1589,7 +1605,29 @@ public class GDS extends Input<Object>
public void loadFile()
throws Exception
{
- gdsRead.getToken();
+ // prepare to do readable dump of GDS file
+ printWriter = null;
+ if (localPrefs.dumpReadable)
+ {
+ String dumpFileName = filePath;
+ int lastDot = dumpFileName.lastIndexOf('.');
+ if (lastDot > 0) dumpFileName = dumpFileName.substring(0, lastDot);
+ String fileName = OpenFile.chooseOutputFile(FileType.TEXT, "GDS readable dump file", dumpFileName+".txt");
+ if (fileName != null)
+ {
+ try
+ {
+ printWriter = new PrintWriter(new BufferedWriter(new FileWriter(fileName)));
+ } catch (IOException e) {}
+ }
+ if (printWriter == null) localPrefs.dumpReadable = false; else
+ {
+ printWriter.println("Readable dump of file: " + filePath);
+ printWriter.println();
+ }
+ }
+
+ gdsRead.getToken();
readHeader();
gdsRead.getToken();
readLibrary();
@@ -1611,6 +1649,13 @@ public class GDS extends Input<Object>
readStructure();
gdsRead.getToken();
}
+
+ if (localPrefs.dumpReadable)
+ {
+ printWriter.println();
+ printWriter.println("- End library");
+ printWriter.close();
+ }
}
private void readHeader()
@@ -1620,7 +1665,7 @@ public class GDS extends Input<Object>
gdsRead.getToken();
if (gdsRead.getTokenType() != GDSReader.GDS_SHORT_NUMBER) gdsRead.handleError("GDS II version number is not decipherable");
-
+ if (localPrefs.dumpReadable) printWriter.println("- File header");
// version "getShortValue()"
}
@@ -1637,6 +1682,7 @@ public class GDS extends Input<Object>
gdsRead.getToken();
if (gdsRead.getTokenType() != GDSReader.GDS_IDENT) gdsRead.handleError("Library name is missing");
}
+ if (localPrefs.dumpReadable) printWriter.println("- Library: " + gdsRead.getStringValue());
}
private void readRefLibs()
@@ -1644,6 +1690,7 @@ public class GDS extends Input<Object>
{
gdsRead.getToken();
gdsRead.getToken();
+ if (localPrefs.dumpReadable) printWriter.println("- Reference libraries");
}
private void readFonts()
@@ -1651,6 +1698,7 @@ public class GDS extends Input<Object>
{
gdsRead.getToken();
gdsRead.getToken();
+ if (localPrefs.dumpReadable) printWriter.println("- Fonts");
}
private void readAttrTable()
@@ -1661,6 +1709,7 @@ public class GDS extends Input<Object>
{
gdsRead.getToken();
}
+ if (localPrefs.dumpReadable) printWriter.println("- Attribute table");
}
private void readUnits()
@@ -1670,10 +1719,11 @@ public class GDS extends Input<Object>
gdsRead.getToken();
if (gdsRead.getTokenType() != GDSReader.GDS_REALNUM) gdsRead.handleError("Units statement has invalid number format");
+ double precision = gdsRead.getDoubleValue();
// get the meter unit
gdsRead.getToken();
- double meterUnit = gdsRead.getDoubleValue();
+ double meterUnit = gdsRead.getDoubleValue(); // * (precision * 1000.0);
// round the meter unit
double shift = 1;
@@ -1684,22 +1734,13 @@ public class GDS extends Input<Object>
shift *= 10;
}
roundedScale = DBMath.round(roundedScale) / shift;
- meterUnit = roundedScale;
// compute the scale
double microScale = TextUtils.convertFromDistance(1, curTech, TextUtils.UnitScale.MICRO);
- theScale = meterUnit * 1000000.0 * microScale * localPrefs.inputScale;
-
-// // round the scale
-// double shift = 1;
-// double roundedScale = theScale;
-// while (roundedScale < 1)
-// {
-// roundedScale *= 10;
-// shift *= 10;
-// }
-// roundedScale = DBMath.round(roundedScale) / shift;
-// theScale = roundedScale;
+ theScale = roundedScale * 1000000.0 * microScale * localPrefs.inputScale;
+
+ if (localPrefs.dumpReadable) printWriter.println("- Units: precision=" + TextUtils.formatDouble(precision, 0) +
+ " meter=" + TextUtils.formatDouble(meterUnit, 0) + " scale=" + TextUtils.formatDouble(theScale, 0));
}
private double scaleValue(double value)
@@ -1740,6 +1781,7 @@ public class GDS extends Input<Object>
getElement();
gdsRead.getToken();
}
+ if (localPrefs.dumpReadable) printWriter.println("- Done reading cell");
if (TALLYCONTENTS) showResultsOfCell();
if (localPrefs.mergeBoxes)
{
@@ -1792,6 +1834,11 @@ public class GDS extends Input<Object>
// look for this nodeproto
String name = gdsRead.getStringValue();
+ if (localPrefs.dumpReadable)
+ {
+ printWriter.println();
+ printWriter.println("- Cell: " + name);
+ }
if (localPrefs.skeletonize) name += "{lay.sk}"; else
name += "{lay}";
Cell cell = findCell(name);
@@ -1802,7 +1849,6 @@ public class GDS extends Input<Object>
if (curTech != null)
cell.setTechnology(curTech);
if (cell == null) gdsRead.handleError("Failed to create structure");
- System.out.println("Reading " + name);
if (!currentCells.containsKey(theLibrary))
currentCells.put(theLibrary, cell);
} else
@@ -1952,7 +1998,7 @@ public class GDS extends Input<Object>
theCell.makeInstanceArray(theNodeProto, nCols, nRows, Orientation.fromJava(angle, mX, mY),
theVertices[0], rowInterval, colInterval);
- if (DEBUGALL) System.out.println("---- Array Reference: " + nCols + "x" + nRows + " of " + theNodeProto.describe(false));
+ if (localPrefs.dumpReadable) printWriter.println("-- Array Reference: " + nCols + "x" + nRows + " of " + theNodeProto.describe(false));
}
private class ReadOrientation
@@ -2030,8 +2076,8 @@ public class GDS extends Input<Object>
angle = (angle + 900) % 3600;
}
theCell.makeInstance(theNodeProto, loc, Orientation.fromJava(angle, false, mY), 0, 0, null, null);
- if (DEBUGALL) System.out.println("---- Instance of " + theNodeProto.describe(false) +
- " at (" + loc.getX() + "," + loc.getY() + ")");
+ if (localPrefs.dumpReadable) printWriter.println("-- Instance of " + theNodeProto.noLibDescribe() +
+ " at (" + TextUtils.formatDistance(loc.getX()) + "," + TextUtils.formatDistance(loc.getY()) + ")");
}
private void determineShape()
@@ -2051,8 +2097,27 @@ public class GDS extends Input<Object>
return;
}
determineBoundary();
- if (DEBUGALL) System.out.println("---- Shape on " + (layerIsPin ? "pin " : "") + "layer " + curLayerNum + "/" + curLayerType +
- " (" + layerNodeProto + ") has " + numVertices + " points");
+ if (localPrefs.dumpReadable)
+ {
+ double lx = theVertices[0].getX();
+ double hx = theVertices[0].getX();
+ double ly = theVertices[0].getY();
+ double hy = theVertices[0].getY();
+ for (int i=1; i<numVertices;i++)
+ {
+ if (lx > theVertices[i].getX()) lx = theVertices[i].getX();
+ if (hx < theVertices[i].getX()) hx = theVertices[i].getX();
+ if (ly > theVertices[i].getY()) ly = theVertices[i].getY();
+ if (hy < theVertices[i].getY()) hy = theVertices[i].getY();
+ }
+ double cX = (lx + hx) / 2, cY = (ly + hy) / 2;
+ printWriter.print("-- Shape on " + (layerIsPin ? "pin " : "") + "layer " + curLayerNum + "/" + curLayerType +
+ " (" + layerNodeProto.describe(false) + ") at (" + TextUtils.formatDistance(cX) + "," + TextUtils.formatDistance(cY) +
+ ") has " + numVertices + " points:");
+ for(int i=0; i<numVertices; i++) printWriter.print(" (" + TextUtils.formatDistance(theVertices[i].getX()) + "," +
+ TextUtils.formatDistance(theVertices[i].getX()) + ")");
+ printWriter.println();
+ }
}
private void determineBoundary()
@@ -2296,8 +2361,15 @@ public class GDS extends Input<Object>
{
gdsRead.handleError("Path element has no points");
}
- if (DEBUGALL) System.out.println("---- Path on " + (layerIsPin ? "pin " : "") + "layer " + curLayerNum + "/" + curLayerType +
- " (" + layerNodeProto + ") has " + numVertices + " points");
+
+ if (localPrefs.dumpReadable)
+ {
+ printWriter.print("-- Path on " + (layerIsPin ? "pin " : "") + "layer " + curLayerNum + "/" + curLayerType +
+ " (" + layerNodeProto.describe(false) + ") has " + numVertices + " points:");
+ for(int i=0; i<numVertices; i++) printWriter.print(" (" + TextUtils.formatDistance(theVertices[i].getX()) + "," +
+ TextUtils.formatDistance(theVertices[i].getX()) + ")");
+ printWriter.println();
+ }
}
private void determineNode()
@@ -2340,8 +2412,8 @@ public class GDS extends Input<Object>
theCell.makeInstance(layerNodeProto, new Point2D.Double(theVertices[0].getX(), theVertices[0].getY()),
Orientation.IDENT, 0, 0, null, currentUnknownLayerMessage);
}
- if (DEBUGALL) System.out.println("---- Node on " + (layerIsPin ? "pin " : "") + "layer " + curLayerNum + "/" + curLayerType +
- " (" + layerNodeProto + ") at (" + theVertices[0].getX() + "," + theVertices[0].getY() + ")");
+ if (localPrefs.dumpReadable) printWriter.println("-- Node on " + (layerIsPin ? "pin " : "") + "layer " + curLayerNum + "/" + curLayerType +
+ " (" + layerNodeProto.describe(false) + ") at (" + TextUtils.formatDistance(theVertices[0].getX()) + "," + TextUtils.formatDistance(theVertices[0].getY()) + ")");
}
private void determineText()
@@ -2424,8 +2496,8 @@ public class GDS extends Input<Object>
return;
}
readText(textString, vert_just, horiz_just, angle, trans, scale);
- if (DEBUGALL) System.out.println("---- Text " + (layerIsPin ? "(pin) " : "") + "'" + textString.replace('\n', '/') +
- "' at (" + theVertices[0].getX() + "," + theVertices[0].getY() + ")");
+ if (localPrefs.dumpReadable) printWriter.println("-- " + (layerIsPin ? "Pin" : "Text") + " '" + textString.replace('\n', '/') +
+ "' on layer " + curLayerNum + " at (" + TextUtils.formatDistance(theVertices[0].getX()) + "," + TextUtils.formatDistance(theVertices[0].getY()) + ")");
}
private void readText(String charstring, int vjust, int hjust, int angle, boolean trans, double scale)
@@ -2516,8 +2588,15 @@ public class GDS extends Input<Object>
theCell.makeInstance(layerNodeProto, new Point2D.Double(theVertices[0].getX(), theVertices[0].getY()),
Orientation.IDENT, 0, 0, null, currentUnknownLayerMessage);
}
- if (DEBUGALL) System.out.println("---- Box on " + (layerIsPin ? "pin " : "") + "layer " + curLayerNum + "/" + curLayerType +
- " (" + layerNodeProto + ") has " + numVertices + " points");
+
+ if (localPrefs.dumpReadable)
+ {
+ printWriter.print("-- Box on " + (layerIsPin ? "pin " : "") + "layer " + curLayerNum + "/" + curLayerType +
+ " (" + layerNodeProto.describe(false) + ") has " + numVertices + " points");
+ for(int i=0; i<numVertices; i++) printWriter.print(" (" + TextUtils.formatDistance(theVertices[i].getX()) + "," +
+ TextUtils.formatDistance(theVertices[i].getX()) + ")");
+ printWriter.println();
+ }
}
private static class UnknownLayerMessage
@@ -2762,6 +2841,7 @@ public class GDS extends Input<Object>
gdsRead.getToken();
if (gdsRead.getTokenType() != GDSReader.GDS_SHORT_NUMBER) gdsRead.handleError("Generations value is invalid");
gdsRead.getToken();
+ if (localPrefs.dumpReadable) printWriter.println("- Generations");
}
private boolean isMember(GSymbol tok, GSymbol [] set)
diff --git a/com/sun/electric/tool/io/input/GDSMap.java b/com/sun/electric/tool/io/input/GDSMap.java
index 5432fc2..f38e9ea 100644
--- a/com/sun/electric/tool/io/input/GDSMap.java
+++ b/com/sun/electric/tool/io/input/GDSMap.java
@@ -4,7 +4,7 @@
*
* File: GDSMap.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/Gerber.java b/com/sun/electric/tool/io/input/Gerber.java
index c62c300..e2a2d3b 100644
--- a/com/sun/electric/tool/io/input/Gerber.java
+++ b/com/sun/electric/tool/io/input/Gerber.java
@@ -4,9 +4,9 @@
*
* File: Gerber.java
* Input/output tool: Gerber input
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/HSpiceOut.java b/com/sun/electric/tool/io/input/HSpiceOut.java
index 8e89f5a..e8a537c 100644
--- a/com/sun/electric/tool/io/input/HSpiceOut.java
+++ b/com/sun/electric/tool/io/input/HSpiceOut.java
@@ -4,9 +4,9 @@
*
* File: HSpiceOut.java
* Input/output tool: reader for HSpice output (tr, pa, ac, sw, mt)
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -69,6 +69,7 @@ import java.util.List;
public class HSpiceOut extends Input<Stimuli>
{
private static final boolean DEBUGCONDITIONS = false;
+ private static final int BINARYBUFFERSIZE = 8192;
/** true if tr/ac/sw file is binary */ private boolean isTRACDCBinary;
/** true if binary tr/ac/sw file has bytes swapped */ private boolean isTRACDCBinarySwapped;
/** the raw file base */ private String fileBase;
@@ -966,10 +967,10 @@ public class HSpiceOut extends Input<Stimuli>
updateProgressDialog(4);
// now read the data
- if (bytes > 8192)
+ if (bytes > BINARYBUFFERSIZE)
{
- System.out.println("ERROR: block is " + bytes + " long, but limit is 8192");
- bytes = 8192;
+ System.out.println("ERROR: block is " + bytes + " long, but limit is " + BINARYBUFFERSIZE);
+ bytes = BINARYBUFFERSIZE;
}
int amtread = dataInputStream.read(binaryTRACDCBuffer, 0, bytes);
if (amtread != bytes)
@@ -1019,7 +1020,7 @@ public class HSpiceOut extends Input<Stimuli>
isTRACDCBinary = true;
isTRACDCBinarySwapped = false;
if (i == 4) isTRACDCBinarySwapped = true;
- binaryTRACDCBuffer = new byte[8192];
+ binaryTRACDCBuffer = new byte[BINARYBUFFERSIZE];
if (readBinaryTRACDCBlock(true)) return(-1);
} else
{
diff --git a/com/sun/electric/tool/io/input/Input.java b/com/sun/electric/tool/io/input/Input.java
index 706cc45..1b4bb23 100644
--- a/com/sun/electric/tool/io/input/Input.java
+++ b/com/sun/electric/tool/io/input/Input.java
@@ -4,7 +4,7 @@
*
* File: Input.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -157,6 +157,7 @@ public class Input<ResultType>
{
// clean up
stopProgressDialog();
+ if (prefs != null && prefs.disablePopups) errorLogger.disablePopups();
errorLogger.termLogging(true);
}
@@ -207,6 +208,8 @@ public class Input<ResultType>
public abstract static class InputPreferences implements Serializable
{
+ public boolean disablePopups = false;
+
protected InputPreferences(boolean factory)
{
if (!factory && !SwingUtilities.isEventDispatchThread() && !Main.isBatch())
diff --git a/com/sun/electric/tool/io/input/JELIB.java b/com/sun/electric/tool/io/input/JELIB.java
index be3d91d..7bc1823 100644
--- a/com/sun/electric/tool/io/input/JELIB.java
+++ b/com/sun/electric/tool/io/input/JELIB.java
@@ -4,9 +4,9 @@
*
* File: JELIB.java
* Input/output tool: JELIB Library input
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/JELIB2.java b/com/sun/electric/tool/io/input/JELIB2.java
index 301c2e4..99b87ed 100644
--- a/com/sun/electric/tool/io/input/JELIB2.java
+++ b/com/sun/electric/tool/io/input/JELIB2.java
@@ -4,9 +4,9 @@
*
* File: JELIB2.java
* Input/output tool: JELIB Library input
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/JelibParser.java b/com/sun/electric/tool/io/input/JelibParser.java
index 48a719c..7f4f913 100644
--- a/com/sun/electric/tool/io/input/JelibParser.java
+++ b/com/sun/electric/tool/io/input/JelibParser.java
@@ -4,9 +4,9 @@
*
* File: JelibParser.java
* Input/output tool: JELIB Library input
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/LEF.java b/com/sun/electric/tool/io/input/LEF.java
index cacde12..c8e49f8 100644
--- a/com/sun/electric/tool/io/input/LEF.java
+++ b/com/sun/electric/tool/io/input/LEF.java
@@ -4,9 +4,9 @@
*
* File: LEF.java
* Input/output tool: LEF (Library Exchange Format) reader
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/LEFDEF.java b/com/sun/electric/tool/io/input/LEFDEF.java
index 80cd218..9e5021b 100644
--- a/com/sun/electric/tool/io/input/LEFDEF.java
+++ b/com/sun/electric/tool/io/input/LEFDEF.java
@@ -4,9 +4,9 @@
*
* File: LEFDEF.java
* Input/output tool: LEF and DEF helpers
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -128,7 +128,7 @@ public class LEFDEF extends Input<Object>
* @param layer
* @param mask
* @param unknownLayerHandling instruction on what do if layer not found
- * @return
+ * @return GetLayerInformation for the layer.
*/
protected GetLayerInformation getLayerBasedOnNameAndMask(String layer, Integer mask, int unknownLayerHandling)
{
diff --git a/com/sun/electric/tool/io/input/LibDirs.java b/com/sun/electric/tool/io/input/LibDirs.java
index 717d8f5..ca0e128 100644
--- a/com/sun/electric/tool/io/input/LibDirs.java
+++ b/com/sun/electric/tool/io/input/LibDirs.java
@@ -4,7 +4,7 @@
*
* File: LibDirs.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/LibraryFiles.java b/com/sun/electric/tool/io/input/LibraryFiles.java
index fa3fcd9..5951a71 100644
--- a/com/sun/electric/tool/io/input/LibraryFiles.java
+++ b/com/sun/electric/tool/io/input/LibraryFiles.java
@@ -4,7 +4,7 @@
*
* File: LibraryFiles.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -210,7 +210,8 @@ public abstract class LibraryFiles extends Input
* @return the read Library, or null if an error occurred.
*/
public static Library readLibrary(EditingPreferences ep, URL fileURL, String libName, FileType type, boolean quick,
- Map<Setting,Object> projectSettings) {
+ Map<Setting,Object> projectSettings)
+ {
if (fileURL == null) return null;
long startTime = System.currentTimeMillis();
errorLogger = ErrorLogger.newInstance("Library Read");
@@ -275,6 +276,7 @@ public abstract class LibraryFiles extends Input
// if (CVS.isEnabled()) {
// Update.updateOpenLibraries(Update.UpdateEnum.STATUS);
// }
+ if (quick) errorLogger.disablePopups();
errorLogger.termLogging(true);
return lib;
diff --git a/com/sun/electric/tool/io/input/LibraryStatistics.java b/com/sun/electric/tool/io/input/LibraryStatistics.java
index 18326c7..f33e9ba 100644
--- a/com/sun/electric/tool/io/input/LibraryStatistics.java
+++ b/com/sun/electric/tool/io/input/LibraryStatistics.java
@@ -4,9 +4,9 @@
*
* File: LibraryStatistics.java
* Input/output tool: Statistics over a set of libraries.
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/PSpiceOut.java b/com/sun/electric/tool/io/input/PSpiceOut.java
index 907f68a..19eb584 100644
--- a/com/sun/electric/tool/io/input/PSpiceOut.java
+++ b/com/sun/electric/tool/io/input/PSpiceOut.java
@@ -4,9 +4,9 @@
*
* File: PSpiceOut.java
* Input/output tool: reader for PSpice text output (.txt)
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/RawSpiceOut.java b/com/sun/electric/tool/io/input/RawSpiceOut.java
index 62e9a9f..09400c7 100644
--- a/com/sun/electric/tool/io/input/RawSpiceOut.java
+++ b/com/sun/electric/tool/io/input/RawSpiceOut.java
@@ -4,9 +4,9 @@
*
* File: RawSpiceOut.java
* Input/output tool: reader for Raw Spice output (.raw)
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/ReadableDump.java b/com/sun/electric/tool/io/input/ReadableDump.java
index 59ba213..4dead15 100644
--- a/com/sun/electric/tool/io/input/ReadableDump.java
+++ b/com/sun/electric/tool/io/input/ReadableDump.java
@@ -4,9 +4,9 @@
*
* File: ReadableDump.java
* Input/output tool: "Readable Dump" Library input
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/SimulationData.java b/com/sun/electric/tool/io/input/SimulationData.java
index 34f6229..16d4c05 100644
--- a/com/sun/electric/tool/io/input/SimulationData.java
+++ b/com/sun/electric/tool/io/input/SimulationData.java
@@ -4,9 +4,9 @@
*
* File: Simulate.java
* Input/output tool: superclass for simulation-output formats that display their results in a waveform window.
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/SmartSpiceOut.java b/com/sun/electric/tool/io/input/SmartSpiceOut.java
index a617e3a..5376916 100644
--- a/com/sun/electric/tool/io/input/SmartSpiceOut.java
+++ b/com/sun/electric/tool/io/input/SmartSpiceOut.java
@@ -4,9 +4,9 @@
*
* File: SmartSpiceOut.java
* Input/output tool: reader for Smart Spice output (.dump)
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/Spice.java b/com/sun/electric/tool/io/input/Spice.java
index 4b626b3..c6e5c20 100644
--- a/com/sun/electric/tool/io/input/Spice.java
+++ b/com/sun/electric/tool/io/input/Spice.java
@@ -4,9 +4,9 @@
*
* File: Spice.java
* Input/output tool: reader for Spice netlists (.spi)
- * Inspired by Graham Petley, written by Steven M. Rubin, Sun Microsystems.
+ * Inspired by Graham Petley, written by Steven M. Rubin.
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/SpiceOut.java b/com/sun/electric/tool/io/input/SpiceOut.java
index e3faa00..0a861ab 100644
--- a/com/sun/electric/tool/io/input/SpiceOut.java
+++ b/com/sun/electric/tool/io/input/SpiceOut.java
@@ -4,9 +4,9 @@
*
* File: SpiceOut.java
* Input/output tool: reader for basic Spice2 or GNUCap output (.spo)
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/Sue.java b/com/sun/electric/tool/io/input/Sue.java
index 4bf4ac9..19cb1b5 100644
--- a/com/sun/electric/tool/io/input/Sue.java
+++ b/com/sun/electric/tool/io/input/Sue.java
@@ -4,9 +4,9 @@
*
* File: Sue.java
* Input/output tool: Sue input
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/bookshelf/Bookshelf.java b/com/sun/electric/tool/io/input/bookshelf/Bookshelf.java
index 186b0a3..ac5604e 100644
--- a/com/sun/electric/tool/io/input/bookshelf/Bookshelf.java
+++ b/com/sun/electric/tool/io/input/bookshelf/Bookshelf.java
@@ -4,7 +4,7 @@
*
* File: Bookshelf.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/bookshelf/BookshelfAux.java b/com/sun/electric/tool/io/input/bookshelf/BookshelfAux.java
index a1711bf..1578446 100644
--- a/com/sun/electric/tool/io/input/bookshelf/BookshelfAux.java
+++ b/com/sun/electric/tool/io/input/bookshelf/BookshelfAux.java
@@ -4,7 +4,7 @@
*
* File: BookshelfAux.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/bookshelf/BookshelfInputParser.java b/com/sun/electric/tool/io/input/bookshelf/BookshelfInputParser.java
index df36f98..c3ad5a5 100644
--- a/com/sun/electric/tool/io/input/bookshelf/BookshelfInputParser.java
+++ b/com/sun/electric/tool/io/input/bookshelf/BookshelfInputParser.java
@@ -4,7 +4,7 @@
*
* File: BookshelfInputParser.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/bookshelf/BookshelfNets.java b/com/sun/electric/tool/io/input/bookshelf/BookshelfNets.java
index 2d4502e..e18562d 100644
--- a/com/sun/electric/tool/io/input/bookshelf/BookshelfNets.java
+++ b/com/sun/electric/tool/io/input/bookshelf/BookshelfNets.java
@@ -4,7 +4,7 @@
*
* File: BookshelfNets.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/bookshelf/BookshelfNodes.java b/com/sun/electric/tool/io/input/bookshelf/BookshelfNodes.java
index c54a381..4384029 100644
--- a/com/sun/electric/tool/io/input/bookshelf/BookshelfNodes.java
+++ b/com/sun/electric/tool/io/input/bookshelf/BookshelfNodes.java
@@ -4,7 +4,7 @@
*
* File: BookshelfNodes.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/bookshelf/BookshelfPlacement.java b/com/sun/electric/tool/io/input/bookshelf/BookshelfPlacement.java
index 0ee8a72..6fb9f37 100644
--- a/com/sun/electric/tool/io/input/bookshelf/BookshelfPlacement.java
+++ b/com/sun/electric/tool/io/input/bookshelf/BookshelfPlacement.java
@@ -4,7 +4,7 @@
*
* File: BookshelfPlacement.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/bookshelf/BookshelfWeights.java b/com/sun/electric/tool/io/input/bookshelf/BookshelfWeights.java
index 10ae31c..c40564a 100644
--- a/com/sun/electric/tool/io/input/bookshelf/BookshelfWeights.java
+++ b/com/sun/electric/tool/io/input/bookshelf/BookshelfWeights.java
@@ -4,7 +4,7 @@
*
* File: BookshelfWeights.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/spicenetlist/SpiceInstance.java b/com/sun/electric/tool/io/input/spicenetlist/SpiceInstance.java
index 2540d82..99a2e9e 100644
--- a/com/sun/electric/tool/io/input/spicenetlist/SpiceInstance.java
+++ b/com/sun/electric/tool/io/input/spicenetlist/SpiceInstance.java
@@ -4,7 +4,7 @@
*
* File: SpiceNetlistReader.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/spicenetlist/SpiceNetlistReader.java b/com/sun/electric/tool/io/input/spicenetlist/SpiceNetlistReader.java
index 8348d41..b1b18a0 100644
--- a/com/sun/electric/tool/io/input/spicenetlist/SpiceNetlistReader.java
+++ b/com/sun/electric/tool/io/input/spicenetlist/SpiceNetlistReader.java
@@ -4,7 +4,7 @@
*
* File: SpiceNetlistReader.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/spicenetlist/SpiceSubckt.java b/com/sun/electric/tool/io/input/spicenetlist/SpiceSubckt.java
index f682012..e539878 100644
--- a/com/sun/electric/tool/io/input/spicenetlist/SpiceSubckt.java
+++ b/com/sun/electric/tool/io/input/spicenetlist/SpiceSubckt.java
@@ -4,7 +4,7 @@
*
* File: SpiceNetlistReader.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/verilog/VerilogOut.java b/com/sun/electric/tool/io/input/verilog/VerilogOut.java
index 5dfe974..14321e6 100644
--- a/com/sun/electric/tool/io/input/verilog/VerilogOut.java
+++ b/com/sun/electric/tool/io/input/verilog/VerilogOut.java
@@ -4,9 +4,9 @@
*
* File: VerilogOut.java
* Input/output tool: reader for Verilog output (.v)
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/input/verilog/VerilogReader.java b/com/sun/electric/tool/io/input/verilog/VerilogReader.java
index 11c8e00..9473b53 100644
--- a/com/sun/electric/tool/io/input/verilog/VerilogReader.java
+++ b/com/sun/electric/tool/io/input/verilog/VerilogReader.java
@@ -4,9 +4,9 @@
*
* File: VerilogReader.java
* Input/output tool: reader for Verilog output (.v)
- * Written by Gilda Garreton, Sun Microsystems.
+ * Written by Gilda Garreton.
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/CIF.java b/com/sun/electric/tool/io/output/CIF.java
index 0f3157b..21e4cdd 100644
--- a/com/sun/electric/tool/io/output/CIF.java
+++ b/com/sun/electric/tool/io/output/CIF.java
@@ -4,9 +4,9 @@
*
* File: CIF.java
* Input/output tool: CIF output
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -159,6 +159,9 @@ public class CIF extends Geometry
writeLine("C " + cellNumber + ";");
writeLine("E");
+ // if output disables popups, tell the error logger
+ if (localPrefs.isDisablePopups()) errorLogger.disablePopups();
+
// finish up CRC stuff
if (!crcPrevIsCharSep)
{
diff --git a/com/sun/electric/tool/io/output/CellModelPrefs.java b/com/sun/electric/tool/io/output/CellModelPrefs.java
index 0fcdf60..a5a5df7 100644
--- a/com/sun/electric/tool/io/output/CellModelPrefs.java
+++ b/com/sun/electric/tool/io/output/CellModelPrefs.java
@@ -4,7 +4,7 @@
*
* File: CellModelPrefs.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/DEF.java b/com/sun/electric/tool/io/output/DEF.java
index a1f60cc..acaa74b 100644
--- a/com/sun/electric/tool/io/output/DEF.java
+++ b/com/sun/electric/tool/io/output/DEF.java
@@ -6,7 +6,7 @@
* Input/output tool: DEF output
* Written by Steven M. Rubin.
*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/DELIB.java b/com/sun/electric/tool/io/output/DELIB.java
index 16d3778..ffa0750 100644
--- a/com/sun/electric/tool/io/output/DELIB.java
+++ b/com/sun/electric/tool/io/output/DELIB.java
@@ -4,7 +4,7 @@
*
* File: DELIB.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/DFTM.java b/com/sun/electric/tool/io/output/DFTM.java
index c91ac18..096a1b8 100644
--- a/com/sun/electric/tool/io/output/DFTM.java
+++ b/com/sun/electric/tool/io/output/DFTM.java
@@ -4,9 +4,9 @@
*
* File: DFTM.java
* Input/output tool: DFTM (Data flow/Transactional Memory) netlist output
- * Written by Steven M. Rubin, Oracle.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/DXF.java b/com/sun/electric/tool/io/output/DXF.java
index e62b433..a7d5c1f 100644
--- a/com/sun/electric/tool/io/output/DXF.java
+++ b/com/sun/electric/tool/io/output/DXF.java
@@ -4,9 +4,9 @@
*
* File: DXF.java
* Input/output tool: DXF output
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -174,8 +174,11 @@ public class DXF extends Output
*/
private String formatDoubleJavaVersion(double value)
{
- // Controlling migration to Java8 -> some rounding issues have been detected -> rounding to 2 digits.
- return (JavaCompatiblity.JAVA8) ? TextUtils.formatDouble(value, 2) : TextUtils.formatDouble(value);
+ // do rounding (in Java8, some rounding issues have been detected. round to 2 digits)
+ double scale = (JavaCompatiblity.JAVA8 ? 100 : 1000);
+ double rounded = Math.round(value * scale) / scale;
+ String str = TextUtils.formatDouble(rounded);
+ return str;
}
/**
diff --git a/com/sun/electric/tool/io/output/ECAD.java b/com/sun/electric/tool/io/output/ECAD.java
index 6b481d4..17fa89d 100644
--- a/com/sun/electric/tool/io/output/ECAD.java
+++ b/com/sun/electric/tool/io/output/ECAD.java
@@ -4,9 +4,9 @@
*
* File: ECAD.java
* Input/output tool: ECAD netlist output
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/EDIF.java b/com/sun/electric/tool/io/output/EDIF.java
index f10f8aa..7223d22 100644
--- a/com/sun/electric/tool/io/output/EDIF.java
+++ b/com/sun/electric/tool/io/output/EDIF.java
@@ -5,9 +5,9 @@
* File: EDIF.java
* Input/output tool: EDIF netlist generator
* Original C Code written by Steven M. Rubin, B G West and Glen M. Lawson
- * Translated to Java by Steven M. Rubin, Sun Microsystems.
+ * Translated to Java by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/EDIFEquiv.java b/com/sun/electric/tool/io/output/EDIFEquiv.java
index dd86dc4..4346376 100644
--- a/com/sun/electric/tool/io/output/EDIFEquiv.java
+++ b/com/sun/electric/tool/io/output/EDIFEquiv.java
@@ -4,7 +4,7 @@
*
* File: EDIFEquiv.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/ELIB.java b/com/sun/electric/tool/io/output/ELIB.java
index cb3764a..37aa8f2 100644
--- a/com/sun/electric/tool/io/output/ELIB.java
+++ b/com/sun/electric/tool/io/output/ELIB.java
@@ -4,9 +4,9 @@
*
* File: ELIB.java
* Input/output tool: ELIB Library output
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/Eagle.java b/com/sun/electric/tool/io/output/Eagle.java
index 5038d41..bb96503 100644
--- a/com/sun/electric/tool/io/output/Eagle.java
+++ b/com/sun/electric/tool/io/output/Eagle.java
@@ -4,9 +4,9 @@
*
* File: Eagle.java
* Input/output tool: Eagle netlist output
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/FastHenry.java b/com/sun/electric/tool/io/output/FastHenry.java
index a1e4795..8307c78 100644
--- a/com/sun/electric/tool/io/output/FastHenry.java
+++ b/com/sun/electric/tool/io/output/FastHenry.java
@@ -4,9 +4,9 @@
*
* File: FastHenry.java
* Input/output tool: FashHenry Netlist output
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/FlatRects.java b/com/sun/electric/tool/io/output/FlatRects.java
new file mode 100644
index 0000000..a7d79b2
--- /dev/null
+++ b/com/sun/electric/tool/io/output/FlatRects.java
@@ -0,0 +1,161 @@
+/* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: FlatRects.java
+ * Input/output tool: Rectangle text output
+ * Written by Steven M. Rubin.
+ *
+ * Copyright (c) 2016, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.io.output;
+
+import com.sun.electric.database.geometry.Poly;
+import com.sun.electric.database.geometry.PolyBase;
+import com.sun.electric.database.hierarchy.Cell;
+import com.sun.electric.database.hierarchy.HierarchyEnumerator;
+import com.sun.electric.database.hierarchy.Nodable;
+import com.sun.electric.database.text.TextUtils;
+import com.sun.electric.database.topology.ArcInst;
+import com.sun.electric.database.topology.NodeInst;
+import com.sun.electric.database.variable.VarContext;
+import com.sun.electric.technology.PrimitiveNode;
+import com.sun.electric.technology.Technology;
+import com.sun.electric.tool.Job;
+import com.sun.electric.util.math.FixpTransform;
+
+import java.awt.geom.Rectangle2D;
+import java.util.Iterator;
+
+/**
+ * This class writes cells as a flattened collection of rectangles.
+ */
+public class FlatRects extends Output
+{
+ public static class FlatRectPreferences extends OutputPreferences
+ {
+ String formatSpec;
+
+ public FlatRectPreferences(boolean factory)
+ {
+ super(factory);
+ formatSpec = Job.getUserInterface().askForInput("Specify format of rectangles:", "Rectangle Factors", "%l %x %y %w %h");
+ }
+
+ public Output doOutput(Cell cell, VarContext context, String filePath)
+ {
+ FlatRects out = new FlatRects();
+ if (out.openTextOutputStream(filePath)) return out.finishWrite();
+ out.printWriter.println("; Cell " + cell.noLibDescribe() + " from Library " + cell.getLibrary().getName());
+ out.printWriter.println("; Generated automatically by the Electric VLSI Design System");
+ out.printWriter.println("; Rectangles are described as: " + formatSpec);
+ out.printWriter.println("; Where %l is layer, %x is X of center, %y is Y of center, %w is width, %h is height");
+
+ // gather all geometry
+ FlatRectVisitor visitor = out.makeRectanglesVisitor(this);
+ out.start();
+ HierarchyEnumerator.enumerateCell(cell, context, visitor);
+ out.done(cell);
+
+ if (out.closeTextOutputStream()) return out.finishWrite();
+ System.out.println(filePath + " written");
+ return out.finishWrite();
+ }
+ }
+
+ /** Creates a new instance of Rectangles */
+ private FlatRects() {}
+
+ protected void start() {}
+
+ protected void done(Cell cell) {}
+
+ /****************************** VISITOR SUBCLASS ******************************/
+
+ private FlatRectVisitor makeRectanglesVisitor(FlatRectPreferences rp) { return new FlatRectVisitor(rp); }
+
+ /**
+ * Class to override the Geometry visitor.
+ */
+ private class FlatRectVisitor extends HierarchyEnumerator.Visitor
+ {
+ private FlatRectPreferences localPrefs;
+
+ FlatRectVisitor(FlatRectPreferences rp) { localPrefs = rp; }
+
+ public boolean visitNodeInst(Nodable no, HierarchyEnumerator.CellInfo info) { return true; }
+
+ public boolean enterCell(HierarchyEnumerator.CellInfo info) { return true; }
+
+ public void exitCell(HierarchyEnumerator.CellInfo info)
+ {
+ FixpTransform transToTop = info.getTransformToRoot();
+
+ for(Iterator<NodeInst> it = info.getCell().getNodes(); it.hasNext();)
+ {
+ NodeInst ni = it.next();
+ if (!ni.isCellInstance())
+ {
+ PrimitiveNode prim = (PrimitiveNode)ni.getProto();
+ Technology tech = prim.getTechnology();
+ Poly[] polys = tech.getShapeOfNode(ni);
+ FixpTransform nodeTrans = ni.rotateOut(transToTop);
+ for (int i=0; i<polys.length; i++)
+ {
+ Poly poly = polys[i];
+ poly.transform(nodeTrans);
+ emitPoly(poly);
+ }
+ }
+ }
+
+ for(Iterator<ArcInst> it = info.getCell().getArcs(); it.hasNext();)
+ {
+ ArcInst ai = it.next();
+ Technology tech = ai.getProto().getTechnology();
+ Poly[] polys = tech.getShapeOfArc(ai);
+ for (int i=0; i<polys.length; i++)
+ {
+ Poly poly = polys[i];
+ poly.transform(transToTop);
+ emitPoly(poly);
+ }
+ }
+ }
+
+ /**
+ * Method to write the polygon "poly"
+ */
+ private void emitPoly(PolyBase poly)
+ {
+ Poly.Type style = poly.getStyle();
+ if (style == Poly.Type.FILLED)
+ {
+ Rectangle2D box = poly.getBox();
+ if (box == null) return;
+ if (box.getWidth() == 0) return;
+ if (box.getHeight() == 0) return;
+ String replaceString = localPrefs.formatSpec;
+ replaceString = replaceString.replaceAll("%l", poly.getLayer().getName());
+ replaceString = replaceString.replaceAll("%x", TextUtils.formatDistance(box.getCenterX()));
+ replaceString = replaceString.replaceAll("%y", TextUtils.formatDistance(box.getCenterY()));
+ replaceString = replaceString.replaceAll("%w", TextUtils.formatDistance(box.getWidth()));
+ replaceString = replaceString.replaceAll("%h", TextUtils.formatDistance(box.getHeight()));
+ printWriter.println(replaceString);
+ }
+ }
+ }
+}
diff --git a/com/sun/electric/tool/io/output/GDS.java b/com/sun/electric/tool/io/output/GDS.java
index 6a27ff4..0839662 100644
--- a/com/sun/electric/tool/io/output/GDS.java
+++ b/com/sun/electric/tool/io/output/GDS.java
@@ -5,9 +5,9 @@
* File: GDS.java
* Input/output tool: GDS output
* Original C Code written by Sid Penstone, Queens University
- * Translated to Java by Steven M. Rubin, Sun Microsystems.
+ * Translated to Java by Steven M. Rubin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -31,23 +31,22 @@ import com.sun.electric.database.hierarchy.Export;
import com.sun.electric.database.hierarchy.Nodable;
import com.sun.electric.database.hierarchy.View;
import com.sun.electric.database.prototype.PortCharacteristic;
-import com.sun.electric.database.prototype.PortOriginal;
import com.sun.electric.database.prototype.PortProto;
import com.sun.electric.database.topology.ArcInst;
import com.sun.electric.database.topology.Geometric;
import com.sun.electric.database.topology.NodeInst;
-import com.sun.electric.database.topology.PortInst;
import com.sun.electric.database.variable.UserInterface;
import com.sun.electric.database.variable.VarContext;
import com.sun.electric.database.variable.Variable;
+import com.sun.electric.database.variable.Variable.Key;
import com.sun.electric.technology.ArcProto;
import com.sun.electric.technology.GDSLayers;
+import com.sun.electric.technology.GDSLayers.GDSLayerType;
import com.sun.electric.technology.Layer;
import com.sun.electric.technology.PrimitiveNode;
import com.sun.electric.technology.Technology;
-import com.sun.electric.technology.GDSLayers.GDSLayerType;
-import com.sun.electric.technology.technologies.Generic;
import com.sun.electric.technology.technologies.Artwork;
+import com.sun.electric.technology.technologies.Generic;
import com.sun.electric.tool.Job;
import com.sun.electric.tool.io.GDSReader;
import com.sun.electric.tool.io.IOTool;
@@ -88,7 +87,13 @@ import java.util.TreeSet;
*/
public class GDS extends Geometry
{
- /** key of Variable holding high voltage to use. */ public static final Variable.Key HIGH_VOLTAGE_KEY = Variable.newKey("ATTR_high_voltage");
+ private static final boolean NEWUNITS = true;
+
+ /** key of Variable with high voltage text. */ public static final Variable.Key GDS_TEXT_HV_KEY = Variable.newKey("ATTR_GDS_text_HV");
+ /** key of Variable with GDS text text. */ public static final Variable.Key GDS_TEXT_KEY = Variable.newKey("ATTR_GDS_text");
+
+ /** old key of Variable with high voltage text. */ public static final Variable.Key OLD_HIGH_VOLTAGE_KEY = Variable.newKey("ATTR_high_voltage");
+ /** old key of Variable with GDS text text. */ public static final Variable.Key OLD_GDS_TEXT_KEY = Variable.newKey("GDS_text");
private static final int GDSVERSION = 3;
private static final int BYTEMASK = 0xFF;
@@ -137,8 +142,6 @@ public class GDS extends Geometry
private static final short HDR_N_MAG = 12;
// Maximum string sizes
- //private static final int HDR_M_SNAME = 32;
- //private static final int HDR_M_STRNAME = 32; // replace by preference IOTool.getGDSCellNameMaxLen
private static final int HDR_M_ASCII = 256;
/** for buffering output data */ private static byte [] dataBufferGDS = new byte[DSIZE];
@@ -147,6 +150,7 @@ public class GDS extends Geometry
/** Position of next byte in the buffer */ private static int bufferPosition;
/** Number data buffers output so far */ private static int blockCount;
/** constant for GDS units */ private double scaleFactor;
+ /** true if rounding caused inaccuracies */ private int inaccurate;
/** cell naming map */ private Map<Cell,String> cellNames;
/** cells that have been written */ private Set<Cell> writtenCells;
/** cell names that have been written */ private Set<String> writtenCellNames;
@@ -168,7 +172,6 @@ public class GDS extends Geometry
boolean outMergesBoxes = IOTool.isGDSOutMergesBoxes();
public int cellNameLenMax = IOTool.getGDSCellNameLenMax();
public boolean outUpperCase = IOTool.isGDSOutUpperCase();
- double outputScale = IOTool.getGDSOutputScale();
boolean includeText;
boolean convertNCCExportsConnectedByParentPins;
@@ -176,6 +179,7 @@ public class GDS extends Geometry
public boolean flatDesign;
boolean onlyVisibleLayers;
boolean[] visibility;
+ double precision, unitsPerMeter;
public GDSPreferences(boolean factory, Cell cell)
{
@@ -185,6 +189,8 @@ public class GDS extends Geometry
writeAllCells = IOTool.isFactoryGDSWritesEntireLibrary();
flatDesign = IOTool.isFactoryGDSFlatDesign();
includeText = IOTool.isFactoryGDSIncludesText();
+ precision = IOTool.getFactoryGDSOutputPrecision();
+ unitsPerMeter = IOTool.getFactoryGDSOutputUnitsPerMeter();
convertNCCExportsConnectedByParentPins = IOTool.getFactoryGDSConvertNCCExportsConnectedByParentPins();
onlyVisibleLayers = IOTool.isFactoryGDSOnlyInvisibleLayers();
} else
@@ -192,6 +198,8 @@ public class GDS extends Geometry
writeAllCells = IOTool.isGDSWritesEntireLibrary();
flatDesign = IOTool.isGDSFlatDesign();
includeText = IOTool.isGDSIncludesText();
+ precision = IOTool.getGDSOutputPrecision();
+ unitsPerMeter = IOTool.getGDSOutputUnitsPerMeter();
convertNCCExportsConnectedByParentPins = IOTool.getGDSConvertNCCExportsConnectedByParentPins();
onlyVisibleLayers = IOTool.isGDSOnlyInvisibleLayers();
}
@@ -268,6 +276,12 @@ public class GDS extends Geometry
protected void done()
{
+ if (inaccurate > 0)
+ {
+ String msg = "WARNING: GDS Export encountered problems because of small feature sizes and coarse accuracy settings.";
+ msg += " It is recommended that the 'Units/meter' GDS preference be increased by a factor of " + inaccurate;
+ Job.getUserInterface().showInformationMessage(msg, "Potential GDS Export Problem");
+ }
}
/** Method to write cellGeom */
@@ -391,7 +405,7 @@ public class GDS extends Geometry
for(Technology.ArcLayer al : ap.getArcLayers())
{
Layer layer = al.getLayer();
- // skip the export if main layer in not visible
+ // skip the export if main layer is not visible
if (skipLayer(layer, false)) continue;
selectLayer(layer);
writeExport(pp, portName, portPoly.getCenterX(), portPoly.getCenterY());
@@ -455,18 +469,21 @@ public class GDS extends Geometry
// include voltage for nodes and arcs
for (Iterator<NodeInst> it = cell.getNodes(); it.hasNext(); ) {
NodeInst ni = it.next();
- writeHighVoltageText(ni, ni.getAnchorCenterX(), ni.getAnchorCenterY());
+ writeSpecialText(ni, ni.getAnchorCenterX(), ni.getAnchorCenterY(), GDS_TEXT_HV_KEY, OLD_HIGH_VOLTAGE_KEY, GDSLayerType.HIGHVOLTAGE);
+ writeSpecialText(ni, ni.getAnchorCenterX(), ni.getAnchorCenterY(), GDS_TEXT_KEY, OLD_GDS_TEXT_KEY, GDSLayerType.TEXT);
}
for (Iterator<ArcInst> it = cell.getArcs(); it.hasNext(); ) {
ArcInst ai = it.next();
- writeHighVoltageText(ai, ai.getTrueCenterX(), ai.getTrueCenterY());
+ writeSpecialText(ai, ai.getTrueCenterX(), ai.getTrueCenterY(), GDS_TEXT_HV_KEY, OLD_HIGH_VOLTAGE_KEY, GDSLayerType.HIGHVOLTAGE);
+ writeSpecialText(ai, ai.getTrueCenterX(), ai.getTrueCenterY(), GDS_TEXT_KEY, OLD_GDS_TEXT_KEY, GDSLayerType.TEXT);
}
outputHeader(HDR_ENDSTR, 0);
}
- private void writeHighVoltageText(Geometric geom, double x, double y)
+ private void writeSpecialText(Geometric geom, double x, double y, Key key, Key keyOld, GDSLayerType type)
{
- Variable var = geom.getVar(HIGH_VOLTAGE_KEY);
+ Variable var = geom.getVar(key);
+ if (var == null) var = geom.getVar(keyOld);
if (var != null)
{
List<Layer> layers = new ArrayList<Layer>();
@@ -493,10 +510,10 @@ public class GDS extends Geometry
continue;
}
int layerNum = -1, layerType = -1;
- if (currentLayerNumbers.hasLayerType(GDSLayerType.HIGHVOLTAGE))
+ if (currentLayerNumbers.hasLayerType(type))
{
- layerNum = currentLayerNumbers.getLayerNumber(GDSLayerType.HIGHVOLTAGE);
- layerType = currentLayerNumbers.getLayerType(GDSLayerType.HIGHVOLTAGE);
+ layerNum = currentLayerNumbers.getLayerNumber(type);
+ layerType = currentLayerNumbers.getLayerType(type);
} else
{
System.out.println("Skipping voltage variable " + layer + " in GDS output");
@@ -545,7 +562,8 @@ public class GDS extends Geometry
Point2D pt = new Point2D.Double(0, 0);
trans.transform(ni.getAnchorCenter(), pt);
- writeHighVoltageText(ni, pt.getX(), pt.getY());
+ writeSpecialText(ni, pt.getX(), pt.getY(), GDS_TEXT_HV_KEY, OLD_HIGH_VOLTAGE_KEY, GDSLayerType.HIGHVOLTAGE);
+ writeSpecialText(ni, pt.getX(), pt.getY(), GDS_TEXT_KEY, OLD_GDS_TEXT_KEY, GDSLayerType.TEXT);
}
}
for(Iterator<ArcInst> it = cell.getArcs(); it.hasNext(); )
@@ -569,7 +587,8 @@ public class GDS extends Geometry
Point2D pt = new Point2D.Double(0, 0);
trans.transform(ai.getTrueCenter(), pt);
- writeHighVoltageText(ai, pt.getX(), pt.getY());
+ writeSpecialText(ai, pt.getX(), pt.getY(), GDS_TEXT_HV_KEY, OLD_HIGH_VOLTAGE_KEY, GDSLayerType.HIGHVOLTAGE);
+ writeSpecialText(ai, pt.getX(), pt.getY(), GDS_TEXT_KEY, OLD_GDS_TEXT_KEY, GDSLayerType.TEXT);
}
// write exports
@@ -579,11 +598,11 @@ public class GDS extends Geometry
{
Export pp = eIt.next();
- // find the node at the bottom of this export
- PortOriginal fp = new PortOriginal(pp.getOriginalPort());
- PortInst bottomPort = fp.getBottomPort();
- NodeInst bottomNi = bottomPort.getNodeInst();
-
+// // find the node at the bottom of this export
+// PortOriginal fp = new PortOriginal(pp.getOriginalPort());
+// PortInst bottomPort = fp.getBottomPort();
+// NodeInst bottomNi = bottomPort.getNodeInst();
+//
// // find the layer associated with this node
// PrimitiveNode pNp = (PrimitiveNode)bottomNi.getProto();
// Technology.NodeLayer [] nLay = pNp.getNodeLayers();
@@ -1104,7 +1123,13 @@ public class GDS extends Geometry
for (int i=0; i<DSIZE; i++) emptyBuffer[i] = 0;
Technology tech = topCell.getTechnology();
- scaleFactor = tech.getScale() * localPrefs.outputScale;
+ scaleFactor = tech.getScale() * localPrefs.unitsPerMeter / 1000000000.0;
+ inaccurate = 0;
+// tech.getScale() = 10 (measured in nanometers)
+// so 210nm is 21 lambda
+// localPrefs.precision = 1000;
+// localPrefs.unitsPerMeter = 1,000,000,000
+// sp 210nm is 21 lambda, so write 21 * unitsPerMeter / 1,000,000,000
layerNumbers = new HashMap<Layer,GDSLayers>();
nameRemapping = new HashMap<String,Set<String>>();
@@ -1281,10 +1306,18 @@ public class GDS extends Geometry
* 0x3F28F5C2,0x8F5C28F6 = 0.01
* 0x3A2AF31D,0xC4611874 = 1e-8
*/
-
// set units
- outputDouble(1e-3);
- outputDouble(1.0e-9);
+ if (NEWUNITS)
+ {
+ double userUnitsPerDBUnit = 1.0 / localPrefs.precision;
+ double dbUnitsInMeters = 1.0 / localPrefs.unitsPerMeter;
+ outputDouble(userUnitsPerDBUnit);
+ outputDouble(dbUnitsInMeters);
+ } else
+ {
+ outputDouble(1e-3);
+ outputDouble(1.0e-9);
+ }
}
boolean outputBeginStruct(Cell cell)
@@ -1571,6 +1604,18 @@ public class GDS extends Geometry
// round to nearest nanometer
int unit = (int)Math.round(scaled);
+ if (unit != scaled)
+ {
+ int accurateScale = 10;
+ for(int i=0; i<10; i++)
+ {
+ double scaledScale = scaled * accurateScale;
+ long scaledUnit = (long)Math.round(scaledScale);
+ if (scaledUnit == scaledScale) break;
+ accurateScale *= 10;
+ }
+ if (accurateScale > inaccurate) inaccurate = accurateScale;
+ }
return unit;
}
diff --git a/com/sun/electric/tool/io/output/GenerateVHDL.java b/com/sun/electric/tool/io/output/GenerateVHDL.java
index ba06831..cac7076 100644
--- a/com/sun/electric/tool/io/output/GenerateVHDL.java
+++ b/com/sun/electric/tool/io/output/GenerateVHDL.java
@@ -4,9 +4,9 @@
*
* File: Generate.java
* Generate VHDL from a circuit
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/Geometry.java b/com/sun/electric/tool/io/output/Geometry.java
index b79f7d9..57c7c61 100644
--- a/com/sun/electric/tool/io/output/Geometry.java
+++ b/com/sun/electric/tool/io/output/Geometry.java
@@ -4,9 +4,9 @@
*
* File: Geometry.java
* Input/output tool: superclass for output modules that write pure geometry.
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/Gerber.java b/com/sun/electric/tool/io/output/Gerber.java
index f7d71d5..d7862e2 100644
--- a/com/sun/electric/tool/io/output/Gerber.java
+++ b/com/sun/electric/tool/io/output/Gerber.java
@@ -6,7 +6,7 @@
* Input/output tool: Gerber output
* Written by Steven M. Rubin.
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/HPGL.java b/com/sun/electric/tool/io/output/HPGL.java
index 408cbcf..e713439 100644
--- a/com/sun/electric/tool/io/output/HPGL.java
+++ b/com/sun/electric/tool/io/output/HPGL.java
@@ -4,9 +4,9 @@
*
* File: HPGL.java
* Input/output tool: HPGL output
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/IRSIM.java b/com/sun/electric/tool/io/output/IRSIM.java
index fa88b36..be283b0 100644
--- a/com/sun/electric/tool/io/output/IRSIM.java
+++ b/com/sun/electric/tool/io/output/IRSIM.java
@@ -4,9 +4,9 @@
*
* File: IRSIM.java
* Input/output tool: IRSIM Netlist output
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/JELIB.java b/com/sun/electric/tool/io/output/JELIB.java
index 482da3b..4381516 100644
--- a/com/sun/electric/tool/io/output/JELIB.java
+++ b/com/sun/electric/tool/io/output/JELIB.java
@@ -4,9 +4,9 @@
*
* File: JELIB.java
* Input/output tool: JELIB Library output
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/L.java b/com/sun/electric/tool/io/output/L.java
index 09ecffd..6698ea5 100644
--- a/com/sun/electric/tool/io/output/L.java
+++ b/com/sun/electric/tool/io/output/L.java
@@ -4,9 +4,9 @@
*
* File: L.java
* Input/output tool: L Netlist output
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/LEF.java b/com/sun/electric/tool/io/output/LEF.java
index 383d44d..945cd1d 100644
--- a/com/sun/electric/tool/io/output/LEF.java
+++ b/com/sun/electric/tool/io/output/LEF.java
@@ -4,9 +4,9 @@
*
* File: LEF.java
* Input/output tool: LEF output
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/MOSSIM.java b/com/sun/electric/tool/io/output/MOSSIM.java
index eb3be30..92d8acc 100644
--- a/com/sun/electric/tool/io/output/MOSSIM.java
+++ b/com/sun/electric/tool/io/output/MOSSIM.java
@@ -4,9 +4,9 @@
*
* File: MOSSIM.java
* Input/output tool: MOSSIM net list generator
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/Maxwell.java b/com/sun/electric/tool/io/output/Maxwell.java
index 06fc786..c04f955 100644
--- a/com/sun/electric/tool/io/output/Maxwell.java
+++ b/com/sun/electric/tool/io/output/Maxwell.java
@@ -4,9 +4,9 @@
*
* File: Maxwell.java
* Input/output tool: Maxwell output
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/Output.java b/com/sun/electric/tool/io/output/Output.java
index 00188d8..2af6de8 100644
--- a/com/sun/electric/tool/io/output/Output.java
+++ b/com/sun/electric/tool/io/output/Output.java
@@ -4,7 +4,7 @@
*
* File: Output.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -141,6 +141,7 @@ public class Output
if (type == FileType.ECAD) return new ECAD.ECADPreferences(factory);
if (type == FileType.EDIF) return new EDIF.EDIFPreferences(factory);
if (type == FileType.FASTHENRY) return new FastHenry.FastHenryPreferences(factory);
+ if (type == FileType.FLATRECT) return new FlatRects.FlatRectPreferences(factory);
if (type == FileType.GERBER) return new Gerber.GerberPreferences(factory);
if (type == FileType.HPGL) return new HPGL.HPGLPreferences(factory, cell);
if (type == FileType.GDS) return new GDS.GDSPreferences(factory, cell);
@@ -205,9 +206,12 @@ public class Output
// IO Settings
public boolean useCopyrightMessage = IOTool.isUseCopyrightMessage();
public boolean includeDateAndVersionInOutput = User.isIncludeDateAndVersionInOutput();
- public int unitsPrecision = EditingPreferences.getInstance().getUnitsPrecision();
+ private int unitsPrecision = EditingPreferences.getInstance().getUnitsPrecision();
+ private double unitsScale = 0;
+ private boolean disablePopups = false;
protected OutputPreferences() { this(false); }
+
protected OutputPreferences(boolean factory) {
if (!factory && !SwingUtilities.isEventDispatchThread() && !Main.isBatch())
throw new IllegalStateException("Current default Prefs can be accessed only from client thread");
@@ -217,15 +221,27 @@ public class Output
return doOutput(cell, context, filePath);
}
+ public int getUnitsOfPrecision() { return unitsPrecision; }
+
public abstract Output doOutput(Cell cell, VarContext context, String filePath);
public String formatDouble(double v) {
- return TextUtils.formatDouble(v, unitsPrecision);
+ if (unitsScale == 0)
+ {
+ unitsScale = 10;
+ for(int i=1; i<unitsPrecision; i++) unitsScale *= 10;
+ }
+ double rounded = Math.round(v * unitsScale) / unitsScale;
+ return TextUtils.formatDouble(rounded, unitsPrecision);
}
public String formatDoublePostFix(double v) {
return TextUtils.formatDoublePostFix(v, unitsPrecision);
}
+
+ public boolean isDisablePopups() { return disablePopups; }
+
+ public void disablePopups() { disablePopups = true; }
}
/** file path */ protected String filePath;
diff --git a/com/sun/electric/tool/io/output/PAL.java b/com/sun/electric/tool/io/output/PAL.java
index 7e58c1d..c26a16d 100644
--- a/com/sun/electric/tool/io/output/PAL.java
+++ b/com/sun/electric/tool/io/output/PAL.java
@@ -4,9 +4,9 @@
*
* File: PAL.java
* Input/output tool: PAL Netlist output
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/PNG.java b/com/sun/electric/tool/io/output/PNG.java
index aa2d536..648689f 100644
--- a/com/sun/electric/tool/io/output/PNG.java
+++ b/com/sun/electric/tool/io/output/PNG.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: PNG.java
- * Written by Gilda Garreton, Sun Microsystems.
+ * Written by Gilda Garreton.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/Pads.java b/com/sun/electric/tool/io/output/Pads.java
index 3afef75..bed5e52 100644
--- a/com/sun/electric/tool/io/output/Pads.java
+++ b/com/sun/electric/tool/io/output/Pads.java
@@ -5,9 +5,9 @@
* File: Pads.java
* Input/output tool: Pads netlist output
* Original C Code written by Neil Levine, NAL Consulting for Intel Corp.
- * Translated to Java by Steven M. Rubin, Sun Microsystems.
+ * Translated to Java by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/PostScript.java b/com/sun/electric/tool/io/output/PostScript.java
index bfaa92b..d00412b 100644
--- a/com/sun/electric/tool/io/output/PostScript.java
+++ b/com/sun/electric/tool/io/output/PostScript.java
@@ -4,9 +4,9 @@
*
* File: PostScript.java
* Input/output tool: PostScript output
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/PostScriptColor.java b/com/sun/electric/tool/io/output/PostScriptColor.java
index df9afd6..52c9397 100644
--- a/com/sun/electric/tool/io/output/PostScriptColor.java
+++ b/com/sun/electric/tool/io/output/PostScriptColor.java
@@ -6,7 +6,7 @@
* Written by: David Harris, 4/20/01 (David_Harris at hmc.edu)
* Translated to Java by Steven Rubin: 12/05
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/ReadableDump.java b/com/sun/electric/tool/io/output/ReadableDump.java
index c0dc96d..3b0bce0 100644
--- a/com/sun/electric/tool/io/output/ReadableDump.java
+++ b/com/sun/electric/tool/io/output/ReadableDump.java
@@ -4,9 +4,9 @@
*
* File: ReadableDump.java
* Input/output tool: "Readable-Dump" Library output
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/STL.java b/com/sun/electric/tool/io/output/STL.java
index 03ee5fd..69bafed 100644
--- a/com/sun/electric/tool/io/output/STL.java
+++ b/com/sun/electric/tool/io/output/STL.java
@@ -4,9 +4,9 @@
*
* File: STL.java
* Input/output tool: STL output
- * Written by Gilda Garreton, Oracle
+ * Written by Gilda Garreton
*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/SVG.java b/com/sun/electric/tool/io/output/SVG.java
index 9761400..4131eb2 100644
--- a/com/sun/electric/tool/io/output/SVG.java
+++ b/com/sun/electric/tool/io/output/SVG.java
@@ -4,9 +4,9 @@
*
* File: SVG.java
* Input/output tool: Scalable Vector Graphics output
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/ScanChainXML.java b/com/sun/electric/tool/io/output/ScanChainXML.java
index 7d9a67f..824c0cb 100644
--- a/com/sun/electric/tool/io/output/ScanChainXML.java
+++ b/com/sun/electric/tool/io/output/ScanChainXML.java
@@ -4,7 +4,7 @@
*
* File: ScanChainXML.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/Silos.java b/com/sun/electric/tool/io/output/Silos.java
index e553cc7..9c2fc01 100644
--- a/com/sun/electric/tool/io/output/Silos.java
+++ b/com/sun/electric/tool/io/output/Silos.java
@@ -4,9 +4,9 @@
*
* File: Silos.java
* Input/output tool: Silos netlist output
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/Sim.java b/com/sun/electric/tool/io/output/Sim.java
index 5cfdcb9..d74196b 100644
--- a/com/sun/electric/tool/io/output/Sim.java
+++ b/com/sun/electric/tool/io/output/Sim.java
@@ -4,9 +4,9 @@
*
* File: Sim.java
* Input/output tool: ESIM, RSIM, RNL, and COSMOS output
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/Spice.java b/com/sun/electric/tool/io/output/Spice.java
index 58c3045..aec371b 100644
--- a/com/sun/electric/tool/io/output/Spice.java
+++ b/com/sun/electric/tool/io/output/Spice.java
@@ -4,9 +4,9 @@
*
* File: Spice.java
* Original C Code written by Steven M. Rubin and Sid Penstone
- * Translated to Java by Steven M. Rubin, Sun Microsystems.
+ * Translated to Java by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -1714,7 +1714,7 @@ public class Spice extends Topology
{
CodeExpression ce = getCodeExpression(eObj, var);
if (ce == null) return true;
- if (ce.getHSpiceText(localPrefs.unitsPrecision, false) != null) return true;
+ if (ce.getHSpiceText(localPrefs.getUnitsOfPrecision(), false) != null) return true;
return false;
}
if (var.isJava()) return false;
@@ -1755,7 +1755,7 @@ public class Spice extends Topology
if (!forceEval) {
CodeExpression ce = getCodeExpression(no.getNodeInst(), instParam);
if (ce != null)
- obj = ce.getHSpiceText(localPrefs.unitsPrecision, inPars);
+ obj = ce.getHSpiceText(localPrefs.getUnitsOfPrecision(), inPars);
}
if (obj == null)
obj = context.evalVar(instParam, no);
diff --git a/com/sun/electric/tool/io/output/SpiceExemptedNets.java b/com/sun/electric/tool/io/output/SpiceExemptedNets.java
index df1e398..3083d66 100644
--- a/com/sun/electric/tool/io/output/SpiceExemptedNets.java
+++ b/com/sun/electric/tool/io/output/SpiceExemptedNets.java
@@ -4,7 +4,7 @@
*
* File: Spice.java
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/SpiceParasitic.java b/com/sun/electric/tool/io/output/SpiceParasitic.java
index 6084c80..6c66b6f 100644
--- a/com/sun/electric/tool/io/output/SpiceParasitic.java
+++ b/com/sun/electric/tool/io/output/SpiceParasitic.java
@@ -4,7 +4,7 @@
*
* File: SpiceRCSimple.java
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/SpiceRCSimple.java b/com/sun/electric/tool/io/output/SpiceRCSimple.java
index 621e785..97d9b8a 100644
--- a/com/sun/electric/tool/io/output/SpiceRCSimple.java
+++ b/com/sun/electric/tool/io/output/SpiceRCSimple.java
@@ -4,7 +4,7 @@
*
* File: SpiceRCSimple.java
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/SpiceSegmentedNets.java b/com/sun/electric/tool/io/output/SpiceSegmentedNets.java
index d9d3428..3d49e2a 100644
--- a/com/sun/electric/tool/io/output/SpiceSegmentedNets.java
+++ b/com/sun/electric/tool/io/output/SpiceSegmentedNets.java
@@ -4,7 +4,7 @@
*
* File: SpiceSegmentedNets.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/Tegas.java b/com/sun/electric/tool/io/output/Tegas.java
index dfbebc9..3a01aeb 100644
--- a/com/sun/electric/tool/io/output/Tegas.java
+++ b/com/sun/electric/tool/io/output/Tegas.java
@@ -4,9 +4,9 @@
*
* File: Tegas.java
* Original C Code written by T.J.Goodman, University of Canterbury, N.Z.
- * Translated to Java by Steven M. Rubin, Sun Microsystems.
+ * Translated to Java by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/Telesis.java b/com/sun/electric/tool/io/output/Telesis.java
index 146f818..6f14dd2 100644
--- a/com/sun/electric/tool/io/output/Telesis.java
+++ b/com/sun/electric/tool/io/output/Telesis.java
@@ -4,9 +4,9 @@
*
* File: Telesis.java
* Input/output tool: Telesis output
- * Written by Gilda Garreton, Oracle Inc.
+ * Written by Gilda Garreton
*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -42,14 +42,13 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import java.util.Map.Entry;
+import java.util.Set;
import java.util.StringTokenizer;
-import scala.Array;
-
public class Telesis extends Geometry {
// private TelesisPreferences localPrefs;
@@ -95,7 +94,7 @@ public class Telesis extends Geometry {
* @param name
* @param f
* @param l
- * @return
+ * @return root name.
*/
private static String extractRootNameAndArrayIndices(String name, MutableInteger f, MutableInteger l,
List<String> secondArray)
@@ -329,7 +328,6 @@ public class Telesis extends Geometry {
return finalName;
}
System.out.println("Error: it should not reach this level extracting port name: " + rootName + ", " + matchingName);
- //assert(false); // should it reach this level?
return finalName;
}
@@ -364,7 +362,7 @@ public class Telesis extends Geometry {
if (values.length > 1) // array, single or double
{
numbers = new String[values.length-1];
- Array.copy(values, 1, numbers, 0, values.length-1);
+ System.arraycopy(values, 1, numbers, 0, values.length-1);
}
}
}
@@ -431,14 +429,21 @@ public class Telesis extends Geometry {
{
printWriter.println("$PACKAGES");
// list of instances
- for (Entry<Cell,List<NodeInst>> e : subCellsMap.entrySet())
+ // Get the keys first and sort them so the output will be deterministic.
+ List<Cell> keysList = new ArrayList<Cell>(subCellsMap.keySet());
+ Collections.sort(keysList); // it should sort by cell names;
+
+ for (Cell c : keysList)
{
- printWriter.print("! " + e.getKey().getName() + " ; ");
- for (NodeInst ni : e.getValue())
+ List<NodeInst> nlist = subCellsMap.get(c);
+ assert(nlist != null);
+ printWriter.print("! " + c.getName() + " ; ");
+ for (NodeInst ni : nlist)
printWriter.print(correctTelesisName(ni.getName()) + " ");
- printWriter.println(" (# instances " + e.getValue().size() + ")");
+ printWriter.println(" (# instances " + nlist.size() + ")");
}
printWriter.println();
+
// nets
printWriter.println("$NETS");
Netlist netlist = cell.getNetlist();
@@ -458,13 +463,13 @@ public class Telesis extends Geometry {
String s = sIt.next(); // .nextToken();
listConnect.add(new NetBusMatching(s));
}
-
+
int count = 0;
StringBuffer netString = new StringBuffer("'" + newString + "' ; ");
// iterate along list connect
// Old code
count = 0;
- List<PortInst> portsVisited = new ArrayList<PortInst>();
+ Set<PortInst> portsVisited = new HashSet<PortInst>();
for (NetBusMatching nbl : listConnect)
{
@@ -474,7 +479,7 @@ public class Telesis extends Geometry {
{
PortInst p = itP.next();
if (portsVisited.contains(p)) continue; // already analyzed
- portsVisited.add(p);
+// portsVisited.add(p);
NodeInst pi = p.getNodeInst();
if (!pi.isCellInstance()) continue; // skipping non-subcell instances
@@ -553,7 +558,7 @@ public class Telesis extends Geometry {
else
{
// check that they match in index. Consider single digits or set like p,n
- if (!values[i].contains(nbl.numbers[i-1]))
+ if (i > nbl.numbers.length || !values[i].contains(nbl.numbers[i-1]))
{
noMatching = true;
break;
@@ -615,6 +620,7 @@ public class Telesis extends Geometry {
}
netString.append(theFinalName);
count += portCount.intValue();
+ portsVisited.add(p);
break; // done with this array
}
}
@@ -634,6 +640,7 @@ public class Telesis extends Geometry {
}
netString.append(theFinalName);
count += portCount.intValue();
+ portsVisited.add(p);
}
foundPortMatch = true;
// if there is only 1 element in listConnect -> forcing to check more connections
@@ -797,9 +804,7 @@ public class Telesis extends Geometry {
int totalNumberOfPins = 0;
if (iconCell == null)
- {
System.out.println("No icon cell found for cell '" + cellName + "'");
- }
else
{
// check if cell has any Allegro variable. If not, it is considered as the top cell
diff --git a/com/sun/electric/tool/io/output/Topology.java b/com/sun/electric/tool/io/output/Topology.java
index c3e3558..b375da3 100644
--- a/com/sun/electric/tool/io/output/Topology.java
+++ b/com/sun/electric/tool/io/output/Topology.java
@@ -4,9 +4,9 @@
*
* File: Topology.java
* Input/output tool: superclass for output modules that write connectivity.
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -540,11 +540,58 @@ public abstract class Topology extends Output
CellSignal cs = new CellSignal();
cs.pp = null;
- cs.descending = !NetworkTool.isBusAscending();
cs.power = false;
cs.ground = false;
cs.net = net;
+ // determine ascending/descending nature of this network
+ cs.descending = !NetworkTool.isBusAscending();
+ boolean foundDirection = false;
+ if (net.isExported())
+ {
+ // determine ascending/descending from export
+ for(Iterator<Export> eIt = net.getExports(); eIt.hasNext(); )
+ {
+ Export e = eIt.next();
+ Boolean ascending = isArrayAscending(e.getName());
+ if (ascending != null)
+ {
+ cs.descending = ascending.booleanValue();
+ foundDirection = true;
+ break;
+ }
+ }
+ }
+ if (!foundDirection)
+ {
+ for(Iterator<ArcInst> aIt = net.getArcs(); aIt.hasNext(); )
+ {
+ ArcInst ai = aIt.next();
+ if (!ai.isUsernamed()) continue;
+ Boolean ascending = isArrayAscending(ai.getName());
+ if (ascending != null)
+ {
+ cs.descending = ascending.booleanValue();
+ foundDirection = true;
+ break;
+ }
+ }
+ }
+ if (!foundDirection)
+ {
+ for(Iterator<PortInst> pIt = net.getPorts(); pIt.hasNext(); )
+ {
+ PortInst pi = pIt.next();
+ Boolean ascending = isArrayAscending(pi.getPortProto().getName());
+ if (ascending != null)
+ {
+ cs.descending = ascending.booleanValue();
+ foundDirection = true;
+ break;
+ }
+ }
+ }
+
// see if it is global
cs.globalSignal = null;
for(int j=0; j<globalSize; j++)
@@ -1010,6 +1057,31 @@ public abstract class Topology extends Output
return name.substring(0, i);
}
+ /**
+ * Method to analyze a name and determine if there are ascending or descending busses in it.
+ * @param name the name.
+ * @return TRUE if ascending busses found, FALSE if descending busses found, null if no busses found.
+ */
+ private static Boolean isArrayAscending(String name)
+ {
+ int startPos = 0;
+ for(;;)
+ {
+ int colonPos = name.indexOf(':', startPos);
+ if (colonPos < 0) break;
+ startPos = colonPos+1;
+ int firstNumPos = colonPos;
+ while (firstNumPos > 0 && Character.isDigit(name.charAt(firstNumPos-1))) firstNumPos--;
+ if (firstNumPos >= colonPos) continue;
+ int firstNum = TextUtils.atoi(name.substring(firstNumPos));
+ if (colonPos+1 >= name.length()) continue;
+ int secondNum = TextUtils.atoi(name.substring(colonPos+1));
+ if (firstNum <= secondNum) return Boolean.FALSE;
+ return Boolean.TRUE;
+ }
+ return null;
+ }
+
private static class SortNetsByName implements Comparator<CellSignal>
{
private boolean separateInputAndOutput, aggregateNamesSupported, caseSensitive, descendingAscendingSupported;
diff --git a/com/sun/electric/tool/io/output/Verilog.java b/com/sun/electric/tool/io/output/Verilog.java
index 12f4ae0..01c6c68 100644
--- a/com/sun/electric/tool/io/output/Verilog.java
+++ b/com/sun/electric/tool/io/output/Verilog.java
@@ -4,10 +4,10 @@
*
* File: Verilog.java
* Input/output tool: Verilog Netlist output
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
* VerilogA by Min Hao Zhu, Villanova University.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -86,8 +86,7 @@ public class Verilog extends Topology
/** key of Variable holding file name with Verilog. */ public static final Variable.Key VERILOG_BEHAVE_FILE_KEY = Variable.newKey("SIM_verilog_behave_file");
/** those cells that have overridden models */ private Set<Cell> modelOverrides = new HashSet<Cell>();
/** those cells that have modules defined */ private Map<String,String> definedModules = new HashMap<String,String>(); // key: module name, value: source description
-// /** those cells that have primitives defined */ private Map<Cell,VerilogData.VerilogModule> definedPrimitives = new HashMap<Cell,VerilogData.VerilogModule>(); // key: module name, value: VerilogModule
- /** those cells that have primitives defined (new) */ private Map<Cell,CompileVerilogStruct.VModule> definedPrimitivesNew = new HashMap<Cell,CompileVerilogStruct.VModule>(); // key: module name, value: VerilogModule
+ /** those cells that have primitives defined */ private Map<Cell,CompileVerilogStruct.VModule> definedPrimitives = new HashMap<Cell,CompileVerilogStruct.VModule>(); // key: module name, value: VerilogModule
/** those cells which are empty */ private Map<Cell,Cell> emptyModules = new HashMap<Cell,Cell>();
/** map of cells that are or contain standard cells */ private SCLibraryGen.StandardCellHierarchy standardCells = new SCLibraryGen.StandardCellHierarchy();
/** file we are writing to */ private String filePath;
@@ -263,12 +262,6 @@ public class Verilog extends Topology
if (localPrefs.useVerilogA) reservedWords.add("NCNFET");
}
-// public static String getVerilogSafeName(String name, boolean isNode, boolean isBus) {
-// Verilog v = new Verilog(new VerilogPreferences());
-// if (isNode) return v.getSafeCellName(name);
-// return v.getSafeNetName(name, isBus);
-// }
-
protected void start()
{
// parameters to the output-line-length limit and how to break long lines
@@ -778,7 +771,6 @@ public class Verilog extends Topology
if (localPrefs.stopAtStandardCells)
{
if (SCLibraryGen.isStandardCell(cell)) {
-// printWriter.println("endmodule /* " + cellName + " */");
writeLine("endmodule /* " + cellName + " */", moduleStr);
return;
}
@@ -795,19 +787,6 @@ public class Verilog extends Topology
if (cni.getGroundNet() != null) writeLine(" supply0 gnd;", moduleStr); // printWriter.println(" supply0 gnd;");
}
- previouslyDeclared = new HashSet<String>();
-// // add in any user-specified declarations and code
-// if (!localPrefs.stopAtStandardCells || localPrefs.netlistNonstandardCells) {
-// // STA does not like general verilog code (like and #delay out InA InB etc)
-// first = includeTypedCode(cell, VERILOG_DECLARATION_KEY, "declarations", moduleStr);
-// first |= includeTypedCode(cell, VERILOG_CODE_KEY, "code", moduleStr);
-// if (!first)
-// {
-// String verilogType = localPrefs.useVerilogA ? "VerilogA" : "Verilog";
-// writeLine(" /* automatically generated " + verilogType + " */", moduleStr); // printWriter.println(" /* automatically generated " + verilogType + " */");
-// }
-// }
-
// determine whether to use "wire" or "trireg" for networks
String wireType;
if (localPrefs.useVerilogA)
@@ -821,45 +800,46 @@ public class Verilog extends Topology
// write "wire/trireg" declarations for internal single-wide signals
int localWires = 0;
- for(int wt=0; wt<2; wt++)
+ Map<String,List<String>> internalSignals = new HashMap<String,List<String>>();
+ for(Iterator<CellAggregateSignal> it = cni.getCellAggregateSignals(); it.hasNext(); )
{
- first = true;
- for(Iterator<CellAggregateSignal> it = cni.getCellAggregateSignals(); it.hasNext(); )
- {
- CellAggregateSignal cas = it.next();
- if (cas.getExport() != null) continue;
- if (cas.isSupply()) continue;
- if (cas.getLowIndex() <= cas.getHighIndex()) continue;
- if (cas.isGlobal()) continue;
+ CellAggregateSignal cas = it.next();
+ if (cas.getExport() != null) continue;
+ if (cas.isSupply()) continue;
+ if (cas.getLowIndex() <= cas.getHighIndex()) continue;
+ if (cas.isGlobal()) continue;
- String impSigName = wireType;
- if (cas.getFlags() != 0)
+ String impSigName = wireType;
+ if (cas.getFlags() != 0)
+ {
+ if (localPrefs.useVerilogA)
{
- if (localPrefs.useVerilogA)
- {
- impSigName = "electrical";
- } else
- {
- if (cas.getFlags() == 1) impSigName = "wire"; else
- impSigName = "trireg";
- }
- }
- if ((wt == 0) ^ !wireType.equals(impSigName))
+ impSigName = "electrical";
+ } else
{
- if (previouslyDeclared.contains(cas.getName())) continue;
- if (first)
- {
- initDeclaration(" " + impSigName);
- }
- addDeclaration(cas.getName(), moduleStr);
- localWires++;
- first = false;
+ if (cas.getFlags() == 1) impSigName = "wire"; else
+ impSigName = "trireg";
}
}
- if (!first) termDeclaration(moduleStr);
+ List<String> sigs = internalSignals.get(impSigName);
+ if (sigs == null) internalSignals.put(impSigName, sigs = new ArrayList<String>());
+ if (!sigs.contains(cas.getName()))
+ sigs.add(cas.getName());
+ localWires++;
+ }
+ for(String decType : internalSignals.keySet())
+ {
+ List<String> sigs = internalSignals.get(decType);
+ if (sigs.size() == 0) continue;
+ Collections.sort(sigs, TextUtils.STRING_NUMBER_ORDER);
+ initDeclaration(" " + decType);
+ for(String st : sigs) addDeclaration(st, moduleStr);
+ termDeclaration(moduleStr);
}
// write "wire/trireg" declarations for internal busses
+ previouslyDeclared = new HashSet<String>();
+ List<String> intBusses = new ArrayList<String>();
for(Iterator<CellAggregateSignal> it = cni.getCellAggregateSignals(); it.hasNext(); )
{
CellAggregateSignal cas = it.next();
@@ -876,21 +856,26 @@ public class Verilog extends Topology
{
int ind = i;
if (cas.isDescending()) ind = indices.length - i - 1;
- writeLine(" " + wireType + " \\" + cas.getName() + "[" + indices[ind] + "] ;", moduleStr); // printWriter.println(" " + wireType + " \\" + cas.getName() + "[" + indices[ind] + "] ;");
+ intBusses.add(" " + wireType + " \\" + cas.getName() + "[" + indices[ind] + "] ;");
}
} else
{
if (cas.isDescending())
{
- writeLine(" " + wireType + " [" + cas.getHighIndex() + ":" + cas.getLowIndex() + "] " + cas.getName() + ";", moduleStr); // printWriter.println(" " + wireType + " [" + cas.getHighIndex() + ":" + cas.getLowIndex() + "] " + cas.getName() + ";");
+ intBusses.add(" " + wireType + " [" + cas.getHighIndex() + ":" + cas.getLowIndex() + "] " + cas.getName() + ";");
} else
{
- writeLine(" " + wireType + " [" + cas.getLowIndex() + ":" + cas.getHighIndex() + "] " + cas.getName() + ";", moduleStr); // printWriter.println(" " + wireType + " [" + cas.getLowIndex() + ":" + cas.getHighIndex() + "] " + cas.getName() + ";");
+ intBusses.add(" " + wireType + " [" + cas.getLowIndex() + ":" + cas.getHighIndex() + "] " + cas.getName() + ";");
}
}
localWires++;
}
- if (localWires != 0) writeLine("", moduleStr); // printWriter.println();
+ if (intBusses.size() > 0)
+ {
+ Collections.sort(intBusses, TextUtils.STRING_NUMBER_ORDER);
+ for(String st : intBusses) writeLine(st, moduleStr);
+ }
+ if (localWires != 0) writeLine("", moduleStr);
// add "wire" declarations for implicit inverters
if (impInvCount > 0)
@@ -1135,15 +1120,8 @@ public class Verilog extends Topology
}
// cells defined as "primitives" in Verilog View must have implicit port ordering
-// if (VerilogReader.NEWVERILOGPARSER)
-// {
- if (definedPrimitivesNew.containsKey(niProto))
- implicitPorts = 3;
-// } else
-// {
-// if (definedPrimitives.containsKey(niProto))
-// implicitPorts = 3;
-// }
+ if (definedPrimitives.containsKey(niProto))
+ implicitPorts = 3;
} else
{
// convert 4-port transistors to 3-port
@@ -1325,19 +1303,6 @@ public class Verilog extends Topology
{
System.out.println("Warning: Cell " + e.getParent().describe(false) + ", entry " + ind +
" of port " + e.getName() + " has no equivalent in cell " + altCell.describe(false));
-//System.out.print(" Ports are:");
-//String lastName = "";
-//for(Iterator<CellAggregateSignal> eIt = subCni.getCellAggregateSignals(); eIt.hasNext(); )
-//{
-// CellAggregateSignal casE = eIt.next();
-// Export ppE = casE.getExport();
-// if (ppE == null) continue;
-// String thisName = ppE.getName();
-// if (thisName.equals(lastName)) continue;
-// System.out.print(" " + thisName);
-// lastName = thisName;
-//}
-//System.out.println();
continue;
}
e = altE;
@@ -1433,54 +1398,26 @@ public class Verilog extends Topology
break;
case 3: // implicit ports ordering for cells defined as primitives in Verilog View
ni = no.getNodeInst();
-// if (VerilogReader.NEWVERILOGPARSER)
-// {
- CompileVerilogStruct.VModule module = definedPrimitivesNew.get(niProto);
- if (module == null) break;
- System.out.print(cell.getName()+" ports: ");
- for (CompileVerilogStruct.VExport port : module.getPorts()) {
- if (port.isBus()) {
- // Bill thinks bussed ports are not allowed for primitives
- reportError("Error: bussed ports not allowed on Verilog primitives: "+niProto.getName());
- } else {
- String portName = port.getName();
- PortInst pi = ni.findPortInst(portName);
- Network net = netList.getNetwork(no, pi.getPortProto().getNameKey().subname(0));
- CellSignal cs = cni.getCellSignal(net);
- String sigName = getSignalName(cs);
-
- if (first) first = false; else
- infstr.append(", ");
- infstr.append(sigName);
- System.out.print(portName+" ");
- }
+ CompileVerilogStruct.VModule module = definedPrimitives.get(niProto);
+ if (module == null) break;
+ System.out.print(cell.getName()+" ports: ");
+ for (CompileVerilogStruct.VExport port : module.getPorts()) {
+ if (port.isBus()) {
+ // Bill thinks bussed ports are not allowed for primitives
+ reportError("Error: bussed ports not allowed on Verilog primitives: "+niProto.getName());
+ } else {
+ String portName = port.getName();
+ PortInst pi = ni.findPortInst(portName);
+ Network net = netList.getNetwork(no, pi.getPortProto().getNameKey().subname(0));
+ CellSignal cs = cni.getCellSignal(net);
+ String sigName = getSignalName(cs);
+
+ if (first) first = false; else
+ infstr.append(", ");
+ infstr.append(sigName);
+ System.out.print(portName+" ");
}
-// } else
-// {
-// VerilogData.VerilogModule module = definedPrimitives.get(niProto);
-// if (module == null) break;
-// System.out.print(cell.getName()+" ports: ");
-// for (VerilogData.VerilogPort port : module.getPorts()) {
-// List<String> portnames = port.getPinNames(true);
-// if (portnames.size() == 0) {
-// // continue
-// } else if (portnames.size() > 1) {
-// // Bill thinks bussed ports are not allowed for primitives
-// reportError("Error: bussed ports not allowed on Verilog primitives: "+niProto.getName());
-// } else {
-// String portname = portnames.get(0);
-// PortInst pi = ni.findPortInst(portname);
-// Network net = netList.getNetwork(no, pi.getPortProto().getNameKey().subname(0));
-// CellSignal cs = cni.getCellSignal(net);
-// String sigName = getSignalName(cs);
-//
-// if (first) first = false; else
-// infstr.append(", ");
-// infstr.append(sigName);
-// System.out.print(portname+" ");
-// }
-// }
-// }
+ }
System.out.println();
infstr.append(");");
break;
@@ -1707,7 +1644,7 @@ public class Verilog extends Topology
* @param line
* @param no
* @param context
- * @return
+ * @return the parameter string.
*/
private String writeDefparam(String line, Nodable no, VarContext context)
{
@@ -1751,7 +1688,6 @@ public class Verilog extends Topology
infstr.append(";");
}
infstr.append("\n");
- // writeWidthLimited(infstr.toString());
return infstr.toString();
}
@@ -1768,7 +1704,7 @@ public class Verilog extends Topology
* @param varName
* @param no
* @param context
- * @return
+ * @return the Variable string.
*/
private String replaceVariable(String varName, Nodable no, VarContext context)
{
@@ -1801,7 +1737,7 @@ public class Verilog extends Topology
*
* @param varName
* @param cell
- * @return
+ * @return the Variable string.
*/
private String replaceVariable(String varName, Cell cell)
{
@@ -1836,7 +1772,7 @@ public class Verilog extends Topology
*
* @param line
* @param cell
- * @return
+ * @return the Variable string.
*/
private String replaceVarInString(String line, Cell cell)
{
@@ -1995,12 +1931,14 @@ public class Verilog extends Topology
{
int first = TextUtils.atoi(netName.substring(i+1));
int second = TextUtils.atoi(lastNetName.substring(openSquare+1));
- infstr.append("[" + first + ":" + second + "]");
+// if (first == second) infstr.append("[" + first + "]"); else
+ infstr.append("[" + first + ":" + second + "]");
} else
{
int first = TextUtils.atoi(netName.substring(i+1));
int second = TextUtils.atoi(lastNetName.substring(openSquare+1));
- infstr.append("[" + second + ":" + first + "]");
+// if (first == second) infstr.append("[" + first + "]"); else
+ infstr.append("[" + second + ":" + first + "]");
}
}
if (name != null) infstr.append(")");
@@ -2111,7 +2049,6 @@ public class Verilog extends Topology
if (sim_verDeclarationLine.length() + signame.length() + 3 > MAXDECLARATIONWIDTH)
{
writeLine(sim_verDeclarationLine.toString() + ";", buffer);
-// printWriter.println(sim_verDeclarationLine.toString() + ";");
sim_verDeclarationLine.delete(sim_verdeclarationprefix, sim_verDeclarationLine.length());
}
if (sim_verDeclarationLine.length() != sim_verdeclarationprefix)
@@ -2164,7 +2101,6 @@ public class Verilog extends Topology
}
/** Method to return the proper name of Power */
-// protected String getPowerName(Network net) { return "vdd"; }
protected String getPowerName(Network net)
{
if (net != null)
@@ -2180,7 +2116,6 @@ public class Verilog extends Topology
}
/** Method to return the proper name of Ground */
-// protected String getGroundName(Network net) { return "gnd"; }
protected String getGroundName(Network net)
{
if (net != null)
@@ -2331,92 +2266,6 @@ public class Verilog extends Topology
"rtranif1",
};
-// /**
-// * Perform some checks on parsed Verilog data, including the
-// * check that module is defined for the cell it is replacing.
-// * Some checks are different depending upon if the source is
-// * a Verilog View or an included external file.
-// * @param data the parsed Verilog data
-// * @param cell the cell to be replaced (must be verilog view if replacing Verilog View)
-// * @param includeFile the included file (null if replacing Verilog View)
-// * @return false if there was an error
-// */
-// private boolean checkIncludedData(VerilogData data, Cell cell, String includeFile) {
-// // make sure there is module for current cell
-// Collection<VerilogData.VerilogModule> modules = data.getModules();
-// VerilogData.VerilogModule main = null, alternative = null;
-// for (VerilogData.VerilogModule mod : modules) {
-// if (mod.getName().equals(getVerilogName(cell)))
-// main = mod;
-// else {
-// Cell.CellGroup grp = cell.getCellGroup(); // if cell group is available
-// if (grp != null && mod.getName().equals(grp.getName()))
-// alternative = mod;
-// }
-// }
-// if (main == null) main = alternative;
-// if (main == null) {
-// reportError("Error! Expected Verilog module definition '"+getVerilogName(cell)+
-// " in Verilog View: "+cell.libDescribe());
-// return false;
-// }
-// if (main.isPrimitive())
-// definedPrimitives.put(cell, main);
-//
-// String source = includeFile == null ? "Verilog View for "+cell.libDescribe() :
-// "Include file: "+includeFile;
-// // check that modules have not already been defined
-// for (VerilogData.VerilogModule mod : modules) {
-// String prevSource = definedModules.get(mod.getName());
-// if (mod.isValid()) {
-// if (prevSource != null) {
-// reportError("Error, module "+mod.getName()+" already defined from: "+prevSource);
-// }
-// else
-// definedModules.put(mod.getName(), source);
-// }
-// }
-//
-// // make sure ports for module match ports for cell
-//// Collection<VerilogData.VerilogPort> ports = main.getPorts();
-// // not sure how to do this right now
-//
-// // check for undefined instances, search libraries for them
-// for (VerilogData.VerilogModule mod : modules) {
-// for (VerilogData.VerilogInstance inst : mod.getInstances()) {
-// VerilogData.VerilogModule instMod = inst.getModule();
-// if (instMod.isValid())
-// continue; // found in file, continue
-// // check if primitive
-// boolean primitiveGate = false;
-// for (String s : verilogGates) {
-// if (s.equals(instMod.getName().toLowerCase())) {
-// primitiveGate = true;
-// break;
-// }
-// }
-// if (primitiveGate) continue;
-//
-// // undefined, look in modules already written
-// String moduleName = instMod.getName();
-// String found = definedModules.get(moduleName);
-// if (found == null && includeFile == null) {
-// // search libraries for it
-// Cell missingCell = findCell(moduleName, View.VERILOG);
-// if (missingCell == null) {
-// reportError("Error: Undefined reference to module "+moduleName+", and no matching cell found");
-// continue;
-// }
-// // hmm...name map might be wrong at for this new enumeration
-// System.out.println("Info: Netlisting cell "+missingCell.libDescribe()+" as instanced in: "+source);
-// HierarchyEnumerator.enumerateCell(missingCell, VarContext.globalContext,
-// new Visitor(this), getShortResistors());
-// }
-// }
-// }
-// return true;
-// }
-
/**
* Perform some checks on parsed Verilog data, including the
* check that module is defined for the cell it is replacing.
@@ -2448,7 +2297,7 @@ public class Verilog extends Topology
return false;
}
if (main.isPrimitive())
- definedPrimitivesNew.put(cell, main);
+ definedPrimitives.put(cell, main);
String source = includeFile == null ? "Verilog View for " + cell.libDescribe() :
"Include file: " + includeFile;
diff --git a/com/sun/electric/tool/io/output/bookshelf/BookshelfOutput.java b/com/sun/electric/tool/io/output/bookshelf/BookshelfOutput.java
index dd8a696..7865574 100644
--- a/com/sun/electric/tool/io/output/bookshelf/BookshelfOutput.java
+++ b/com/sun/electric/tool/io/output/bookshelf/BookshelfOutput.java
@@ -4,7 +4,7 @@
*
* File: BookshelfOutput.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/bookshelf/BookshelfOutputAux.java b/com/sun/electric/tool/io/output/bookshelf/BookshelfOutputAux.java
index f68e201..83f8305 100644
--- a/com/sun/electric/tool/io/output/bookshelf/BookshelfOutputAux.java
+++ b/com/sun/electric/tool/io/output/bookshelf/BookshelfOutputAux.java
@@ -4,7 +4,7 @@
*
* File: BookshelfOutputAux.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/bookshelf/BookshelfOutputNets.java b/com/sun/electric/tool/io/output/bookshelf/BookshelfOutputNets.java
index 730b947..84574f2 100644
--- a/com/sun/electric/tool/io/output/bookshelf/BookshelfOutputNets.java
+++ b/com/sun/electric/tool/io/output/bookshelf/BookshelfOutputNets.java
@@ -4,7 +4,7 @@
*
* File: BookshelfOutputNets.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/bookshelf/BookshelfOutputNodes.java b/com/sun/electric/tool/io/output/bookshelf/BookshelfOutputNodes.java
index 3eb106e..7daeab2 100644
--- a/com/sun/electric/tool/io/output/bookshelf/BookshelfOutputNodes.java
+++ b/com/sun/electric/tool/io/output/bookshelf/BookshelfOutputNodes.java
@@ -4,7 +4,7 @@
*
* File: BookshelfOutputNodes.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/bookshelf/BookshelfOutputPlacement.java b/com/sun/electric/tool/io/output/bookshelf/BookshelfOutputPlacement.java
index 462d61c..f1ef1b0 100644
--- a/com/sun/electric/tool/io/output/bookshelf/BookshelfOutputPlacement.java
+++ b/com/sun/electric/tool/io/output/bookshelf/BookshelfOutputPlacement.java
@@ -4,7 +4,7 @@
*
* File: BookshelfOutputPlacement.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/bookshelf/BookshelfOutputWeights.java b/com/sun/electric/tool/io/output/bookshelf/BookshelfOutputWeights.java
index 42cbb11..200df0e 100644
--- a/com/sun/electric/tool/io/output/bookshelf/BookshelfOutputWeights.java
+++ b/com/sun/electric/tool/io/output/bookshelf/BookshelfOutputWeights.java
@@ -4,7 +4,7 @@
*
* File: BookshelfOutputWeights.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/io/output/bookshelf/BookshelfOutputWriter.java b/com/sun/electric/tool/io/output/bookshelf/BookshelfOutputWriter.java
index 1562178..af5d41c 100644
--- a/com/sun/electric/tool/io/output/bookshelf/BookshelfOutputWriter.java
+++ b/com/sun/electric/tool/io/output/bookshelf/BookshelfOutputWriter.java
@@ -4,7 +4,7 @@
*
* File: BookshelfOutputWriter.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/lang/EvalJavaBsh.java b/com/sun/electric/tool/lang/EvalJavaBsh.java
index 1be2420..169ba63 100644
--- a/com/sun/electric/tool/lang/EvalJavaBsh.java
+++ b/com/sun/electric/tool/lang/EvalJavaBsh.java
@@ -4,7 +4,7 @@
*
* File: EvalJavaBsh.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -38,6 +38,7 @@ import com.sun.electric.database.variable.VarContext;
import com.sun.electric.tool.Job;
import com.sun.electric.tool.JobException;
import com.sun.electric.tool.user.Highlighter;
+import com.sun.electric.tool.user.Resources;
import com.sun.electric.tool.user.User;
import com.sun.electric.tool.user.ui.WindowFrame;
@@ -66,6 +67,8 @@ public class EvalJavaBsh {
private static Method getMethod;
/** The bean shell TargetError getTarget method */
private static Method getTargetMethod;
+ /** true if reflection has already been done to find the Bean Shell */
+ private static boolean beanShellChecked = false;
/** The bean shell interpreter class */
private static Class<?> interpreterClass = null;
/** The bean shell TargetError class */
@@ -96,12 +99,7 @@ public class EvalJavaBsh {
public EvalJavaBsh() {
envObject = null;
- initBSH();
-
- // if interpreter class is null, we cannot create a new bean shell object
- if (interpreterClass == null) {
- return;
- }
+ if (!hasBeanShell()) return;
// create the BSH object
try {
@@ -366,36 +364,70 @@ public class EvalJavaBsh {
}
// ****************************** REFLECTION FOR ACCESSING THE BEAN SHELL ******************************
- private void initBSH() {
- // if already initialized, return
- if (interpreterClass != null) {
- return;
- }
+
+ public static boolean hasBeanShell() {
+ if (!beanShellChecked) {
+ beanShellChecked = true;
- // find the BSH classes
- try {
- interpreterClass = Class.forName("bsh.Interpreter");
- targetErrorClass = Class.forName("bsh.TargetError");
- evalErrorClass = Class.forName("bsh.EvalError");
- } catch (ClassNotFoundException e) {
- TextUtils.recordMissingComponent("Bean Shell");
- interpreterClass = null;
- return;
- }
+ // find the BSH classes
+ try {
+ interpreterClass = Class.forName("bsh.Interpreter");
+ targetErrorClass = Class.forName("bsh.TargetError");
+ evalErrorClass = Class.forName("bsh.EvalError");
+ } catch (ClassNotFoundException e) {
+ TextUtils.recordMissingComponent("Bean Shell");
+ interpreterClass = null;
+ return false;
+ }
- // find the necessary methods on the BSH class
- try {
- evalMethod = interpreterClass.getMethod("eval", new Class[]{String.class});
- sourceMethod = interpreterClass.getMethod("source", new Class[]{String.class});
- setMethod = interpreterClass.getMethod("set", new Class[]{String.class, Object.class});
- getMethod = interpreterClass.getMethod("get", new Class[]{String.class});
- getTargetMethod = targetErrorClass.getMethod("getTarget", (Class[]) null);
- } catch (NoSuchMethodException e) {
- System.out.println("Can't find methods in the Bean Shell: " + e.getMessage());
- interpreterClass = null;
- return;
+ // find the necessary methods on the BSH class
+ try {
+ evalMethod = interpreterClass.getMethod("eval", new Class[]{String.class});
+ sourceMethod = interpreterClass.getMethod("source", new Class[]{String.class});
+ setMethod = interpreterClass.getMethod("set", new Class[]{String.class, Object.class});
+ getMethod = interpreterClass.getMethod("get", new Class[]{String.class});
+ getTargetMethod = targetErrorClass.getMethod("getTarget", (Class[]) null);
+ } catch (NoSuchMethodException e) {
+ System.out.println("Can't find methods in the Bean Shell: " + e.getMessage());
+ interpreterClass = null;
+ return false;
+ }
}
+
+ // if already initialized, return state
+ return interpreterClass != null;
}
+
+// private void initBSH() {
+// // if already initialized, return
+// if (interpreterClass != null) {
+// return;
+// }
+//
+// // find the BSH classes
+// try {
+// interpreterClass = Class.forName("bsh.Interpreter");
+// targetErrorClass = Class.forName("bsh.TargetError");
+// evalErrorClass = Class.forName("bsh.EvalError");
+// } catch (ClassNotFoundException e) {
+// TextUtils.recordMissingComponent("Bean Shell");
+// interpreterClass = null;
+// return;
+// }
+//
+// // find the necessary methods on the BSH class
+// try {
+// evalMethod = interpreterClass.getMethod("eval", new Class[]{String.class});
+// sourceMethod = interpreterClass.getMethod("source", new Class[]{String.class});
+// setMethod = interpreterClass.getMethod("set", new Class[]{String.class, Object.class});
+// getMethod = interpreterClass.getMethod("get", new Class[]{String.class});
+// getTargetMethod = targetErrorClass.getMethod("getTarget", (Class[]) null);
+// } catch (NoSuchMethodException e) {
+// System.out.println("Can't find methods in the Bean Shell: " + e.getMessage());
+// interpreterClass = null;
+// return;
+// }
+// }
/**
* Set a variable in the Java Bean Shell
diff --git a/com/sun/electric/tool/lang/EvalJython.java b/com/sun/electric/tool/lang/EvalJython.java
index c8cc741..e2e4b50 100644
--- a/com/sun/electric/tool/lang/EvalJython.java
+++ b/com/sun/electric/tool/lang/EvalJython.java
@@ -4,7 +4,7 @@
*
* File: EvalJython.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/lang/EvalSpice.java b/com/sun/electric/tool/lang/EvalSpice.java
index 2480ff1..13870c6 100644
--- a/com/sun/electric/tool/lang/EvalSpice.java
+++ b/com/sun/electric/tool/lang/EvalSpice.java
@@ -4,7 +4,7 @@
*
* File: EvalSpice.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -258,7 +258,7 @@ public class EvalSpice {
* number[g|meg|k|m|u|n|p|f]
* <p>
* number(e)[-]number
- * @return
+ * @return the parsed number.
* @throws IOException
* @throws ParseException
*/
diff --git a/com/sun/electric/tool/logicaleffort/CachedCell.java b/com/sun/electric/tool/logicaleffort/CachedCell.java
index 562a74a..5db202f 100644
--- a/com/sun/electric/tool/logicaleffort/CachedCell.java
+++ b/com/sun/electric/tool/logicaleffort/CachedCell.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: CachedCell.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/logicaleffort/Instance.java b/com/sun/electric/tool/logicaleffort/Instance.java
index ac7434c..e9114e0 100644
--- a/com/sun/electric/tool/logicaleffort/Instance.java
+++ b/com/sun/electric/tool/logicaleffort/Instance.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: Instance.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/logicaleffort/LEInst.java b/com/sun/electric/tool/logicaleffort/LEInst.java
index 72c0535..159de3a 100644
--- a/com/sun/electric/tool/logicaleffort/LEInst.java
+++ b/com/sun/electric/tool/logicaleffort/LEInst.java
@@ -4,7 +4,7 @@
*
* File: LEInst.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/logicaleffort/LENetlister.java b/com/sun/electric/tool/logicaleffort/LENetlister.java
index bb6b506..f4d87f2 100644
--- a/com/sun/electric/tool/logicaleffort/LENetlister.java
+++ b/com/sun/electric/tool/logicaleffort/LENetlister.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: LENetlister.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/logicaleffort/LENetlister1.java b/com/sun/electric/tool/logicaleffort/LENetlister1.java
index eaecfef..2c28e55 100644
--- a/com/sun/electric/tool/logicaleffort/LENetlister1.java
+++ b/com/sun/electric/tool/logicaleffort/LENetlister1.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: LENetlister1.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/logicaleffort/LENetlister2.java b/com/sun/electric/tool/logicaleffort/LENetlister2.java
index 1df0efb..dc91456 100644
--- a/com/sun/electric/tool/logicaleffort/LENetlister2.java
+++ b/com/sun/electric/tool/logicaleffort/LENetlister2.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: LENetlister2.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/logicaleffort/LENetwork.java b/com/sun/electric/tool/logicaleffort/LENetwork.java
index fe9a91d..fce79da 100644
--- a/com/sun/electric/tool/logicaleffort/LENetwork.java
+++ b/com/sun/electric/tool/logicaleffort/LENetwork.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: LENetwork.java
- * Written by: Jonathan Gainsley, Sun Microsystems.
+ * Written by: Jonathan Gainsley.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/logicaleffort/LENodable.java b/com/sun/electric/tool/logicaleffort/LENodable.java
index 68200e5..fa98353 100644
--- a/com/sun/electric/tool/logicaleffort/LENodable.java
+++ b/com/sun/electric/tool/logicaleffort/LENodable.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: LENodable.java
- * Written by: Jonathan Gainsley, Sun Microsystems.
+ * Written by: Jonathan Gainsley.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/logicaleffort/LEPin.java b/com/sun/electric/tool/logicaleffort/LEPin.java
index e03e287..1c08474 100644
--- a/com/sun/electric/tool/logicaleffort/LEPin.java
+++ b/com/sun/electric/tool/logicaleffort/LEPin.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: LEPin.java
- * Written by: Jonathan Gainsley, Sun Microsystems.
+ * Written by: Jonathan Gainsley.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/logicaleffort/LESizer.java b/com/sun/electric/tool/logicaleffort/LESizer.java
index 975271b..76bdde8 100644
--- a/com/sun/electric/tool/logicaleffort/LESizer.java
+++ b/com/sun/electric/tool/logicaleffort/LESizer.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: LESizer.java
- * Written by: Jonathan Gainsley, Sun Microsystems.
+ * Written by: Jonathan Gainsley.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/logicaleffort/LESizer2.java b/com/sun/electric/tool/logicaleffort/LESizer2.java
index dae8890..fcd79f1 100644
--- a/com/sun/electric/tool/logicaleffort/LESizer2.java
+++ b/com/sun/electric/tool/logicaleffort/LESizer2.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: LESizer2.java
- * Written by: Jonathan Gainsley, Sun Microsystems.
+ * Written by: Jonathan Gainsley.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/logicaleffort/LETool.java b/com/sun/electric/tool/logicaleffort/LETool.java
index 2cf46dd..f5f70ab 100644
--- a/com/sun/electric/tool/logicaleffort/LETool.java
+++ b/com/sun/electric/tool/logicaleffort/LETool.java
@@ -4,7 +4,7 @@
*
* File: LETool.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -18,8 +18,6 @@
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
- *
- * Created on November 17, 2003, 10:16 AM
*/
package com.sun.electric.tool.logicaleffort;
@@ -43,11 +41,16 @@ import com.sun.electric.tool.Tool;
import com.sun.electric.tool.ToolSettings;
import com.sun.electric.tool.generator.sclibrary.SCLibraryGen;
import com.sun.electric.tool.lang.EvalJavaBsh;
-import com.sun.electric.tool.user.ui.EditWindow;
import com.sun.electric.tool.simulation.SimulationTool;
+import com.sun.electric.tool.user.ui.EditWindow;
import com.sun.electric.util.TextUtils;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -178,7 +181,7 @@ public class LETool extends Tool {
}
/**
- * Grab a paramter 'parName' from a nodeInst 'nodeName' in a sub cell.
+ * Grab a parameter 'parName' from a nodeInst 'nodeName' in a sub cell.
* @param nodeName name of the nodeInst
* @param parName name of parameter to evaluate
* @return the parameter.
@@ -188,7 +191,7 @@ public class LETool extends Tool {
// info should be the node on which there is the variable with the subDrive() call
Object info = EvalJavaBsh.evalJavaBsh.getCurrentInfo();
if (!(info instanceof Nodable)) throw new VarContext.EvalException("subdrive(): Not enough hierarchy information");
- Nodable no = (Nodable)info; // this inst has LE.subdrive(...) on it
+ Nodable no = (Nodable)info; // this instance has LE.subdrive(...) on it
if (no == null)
throw new VarContext.EvalException("subdrive(): Not enough hierarchy");
@@ -197,7 +200,7 @@ public class LETool extends Tool {
// is going to give us icon cell, not equivalent schematic cell
// We need to re-evaluate networks to get equivalent schematic cell
NodeInst ni = (NodeInst)no;
- Cell parent = no.getParent(); // Cell in which inst which has LE.subdrive is
+ Cell parent = no.getParent(); // Cell in which instance which has LE.subdrive is
if (parent == null)
throw new VarContext.EvalException("subdrive(): null parent");
int arrayIndex = 0; // just use first index
@@ -226,7 +229,6 @@ public class LETool extends Tool {
}
Variable var = ni.getParameterOrVariable(parName); // find variable on nodeinst
- //if (var == null) return "subdrive(): no variable of name "+parName.replaceFirst("ATTR_", "");
if (var == null)
throw new VarContext.EvalException(parName.replaceFirst("ATTR_", "")+" not found");
return context.push(no).evalVarRecurse(var, ni); // evaluate variable and return it
@@ -235,7 +237,7 @@ public class LETool extends Tool {
/**
* Attempt to get old style LEDRIVE off of <CODE>no</CODE> based
* on the VarContext <CODE>context</CODE>.
- * Attemps to compensate for the situation when the user
+ * Attempts to compensate for the situation when the user
* had added extra hierarchy to the top of the hierarchy.
* It cannot compensate for the user has less hierarchy than
* is required to create the correct Variable name.
@@ -339,26 +341,26 @@ public class LETool extends Tool {
return null;
}
- /**
- * Makes a string denoting hierarchy path.
- * @param context var context of node
- * @return a string denoting hierarchical path of node
- */
- private static String makeDriveStr(VarContext context) {
- return "LEDRIVE_" + context.getInstPath(".");
- }
-
- /**
- * Makes a string denoting hierarchy path.
- * This is the old version compatible with Java Electric.
- * @param context var context of node
- * @return a string denoting hierarchical path of node
- */
- private static String makeDriveStrOLD(VarContext context) {
- String s = "LEDRIVE_"+makeDriveStrOLDRecurse(context)+";0;S";
- //System.out.println("name is "+s);
- return s;
- }
+// /**
+// * Makes a string denoting hierarchy path.
+// * @param context var context of node
+// * @return a string denoting hierarchical path of node
+// */
+// private static String makeDriveStr(VarContext context) {
+// return "LEDRIVE_" + context.getInstPath(".");
+// }
+
+// /**
+// * Makes a string denoting hierarchy path.
+// * This is the old version compatible with Java Electric.
+// * @param context var context of node
+// * @return a string denoting hierarchical path of node
+// */
+// private static String makeDriveStrOLD(VarContext context) {
+// String s = "LEDRIVE_"+makeDriveStrOLDRecurse(context)+";0;S";
+// //System.out.println("name is "+s);
+// return s;
+// }
private static String makeDriveStrOLDRecurse(VarContext context) {
if (context == VarContext.globalContext) return "";
@@ -454,7 +456,6 @@ public class LETool extends Tool {
*/
public static class AnalyzeCell extends Job
{
- /** progress */ private String progress;
/** cell to analyze */ private Cell cell;
/** var context */ private VarContext context;
/** algorithm type */ private LESizer.Alg algorithm;
@@ -463,7 +464,6 @@ public class LETool extends Tool {
public AnalyzeCell(LESizer.Alg algorithm, Cell cell, VarContext context, boolean newAlg) {
super("Analyze "+cell, tool, Job.Type.CLIENT_EXAMINE, null, cell, Job.Priority.USER);
- progress = null;
this.algorithm = algorithm;
this.cell = cell;
this.context = context;
@@ -471,6 +471,7 @@ public class LETool extends Tool {
}
public boolean doIt() throws JobException {
+ timer.start();
// delete last job, if any
if (lastLEJobExecuted != null)
lastLEJobExecuted.remove();
@@ -479,15 +480,6 @@ public class LETool extends Tool {
setProgress("building equations");
System.out.print("Building equations...");
- // sleep for testing purposes only, remove later
-// try {
-// boolean donesleeping = false;
-// while(!donesleeping) {
-// Thread.sleep(1);
-// donesleeping = true;
-// }
-// } catch (InterruptedException e) {}
-
// get sizer and netlister
Technology layoutTech = cell.getTechnology();
if (layoutTech == Schematics.tech())
@@ -501,7 +493,7 @@ public class LETool extends Tool {
// calculate statistics
timer.end();
- System.out.println("done ("+timer+")");
+ System.out.println("Done (took " + timer + ")");
// if user aborted, return, and do not run sizer
if (checkAbort(null)) {
@@ -553,7 +545,7 @@ public class LETool extends Tool {
}
/**
- * Check if we are scheduled to abort. If so, print msg if non null
+ * Check if we are scheduled to abort. If so, print message if non null
* and return true.
* @param msg message to print if we are aborted
* @return true on abort, false otherwise
@@ -637,6 +629,7 @@ public class LETool extends Tool {
// as top level cell parameter
String varName = varNames.get(i);
cell.newVar(varName, f, ep);
+
}
}
@@ -708,7 +701,6 @@ public class LETool extends Tool {
String p = TextUtils.formatDouble(100*percentdiff, 1);
String ideal = TextUtils.formatDouble(targetsize, 2);
String used = TextUtils.formatDouble(chosensize, 2);
- //String strcontext = (context == VarContext.globalContext ? "topcell" : context.getInstPath("."));
String strcontext = context.push(ni).getInstPath(".");
System.out.println(" "+p+"%: "+ideal+" (ideal) vs "+used+" (used); for "+strcontext);
}
@@ -782,7 +774,7 @@ public class LETool extends Tool {
* recursive.
* @param cell current cell
* @param context current context
- * @param ep EditingPreferences ep
+ * @param ep EditingPreferences
*/
public void registerCellsToUniquify(Cell cell, VarContext context, EditingPreferences ep) {
Netlist netlist = cell.getNetlist();
@@ -1020,11 +1012,11 @@ public class LETool extends Tool {
}
public static void clearStoredSizesJob(NodeInst ni) {
- ClearStoredSizes job = new ClearStoredSizes(ni);
+ new ClearStoredSizes(ni);
}
public static void clearStoredSizesJob(Library lib) {
- ClearStoredSizesLibrary job = new ClearStoredSizesLibrary(lib);
+ new ClearStoredSizesLibrary(lib);
}
/**
@@ -1085,7 +1077,7 @@ public class LETool extends Tool {
}
}
- // delete all vars that start with "LEDRIVE_"
+ // delete all variables that start with "LEDRIVE_"
private static void clearStoredSizes(NodeInst ni) {
for (Iterator<Variable> it = ni.getVariables(); it.hasNext(); ) {
Variable var = (Variable)it.next();
@@ -1096,56 +1088,8 @@ public class LETool extends Tool {
}
}
-/*
- protected static void addSettings(NetlisterConstants constants, Cell cell) {
- // find LESETTINGS cell
- Cell settings = null;
- for (Iterator libIt = Library.getLibraries(); libIt.hasNext(); ) {
- Library lib = (Library)libIt.next();
- for (Iterator it = lib.getCells(); it.hasNext(); ) {
- Cell c = (Cell)it.next();
- if (c.getVar("ATTR_LESETTINGS") != null) {
- settings = c;
- break;
- }
- }
- }
- if (settings == null) {
- System.out.println("Did not find LESETTINGS Cell, not saving settings to "+cell.describe());
- return;
- }
- Rectangle2D bounds = cell.getBounds();
- int x = (int)bounds.getMaxX();
- int y = (int)bounds.getMinY();
- NodeInst ni = NodeInst.makeInstance(settings, new Point2D.Double(x,y), settings.getDefWidth(),
- settings.getDefHeight(), cell);
- if (ni == null) {
- System.out.println("Could not create LESETTINGS instance, not saving settings to "+cell.describe());
- return;
- }
- Variable var;
- if ((var = ni.getVar("ATTR_su")) != null) ni.updateVar(var.getKey(), new Float(constants.su));
- if ((var = ni.getVar("ATTR_wire_ratio")) != null) ni.updateVar(var.getKey(), new Float(constants.wireRatio));
- if ((var = ni.getVar("ATTR_epsilon")) != null) ni.updateVar(var.getKey(), new Float(constants.epsilon));
- if ((var = ni.getVar("ATTR_max_iter")) != null) ni.updateVar(var.getKey(), new Integer(constants.maxIterations));
- if ((var = ni.getVar("ATTR_gate_cap")) != null) ni.updateVar(var.getKey(), new Float(constants.gateCap));
- if ((var = ni.getVar("ATTR_alpha")) != null) ni.updateVar(var.getKey(), new Float(constants.alpha));
- if ((var = ni.getVar("ATTR_keeper_ratio")) != null) ni.updateVar(var.getKey(), new Float(constants.keeperRatio));
- }
-*/
-
/************************** PROJECT PREFERENCES *************************/
-// // preferences; tech-dependent values handled by technology and
- // project preferences
- private static double DEFAULT_GLOBALFANOUT = 4.7;
- private static double DEFAULT_EPSILON = 0.001;
- private static int DEFAULT_MAXITER = 30;
-// private static double DEFAULT_GATECAP = 0.4;
-// private static double DEFAULT_WIRERATIO = 0.16;
-// private static double DEFAULT_DIFFALPHA = 0.7;
- private static double DEFAULT_KEEPERRATIO = 0.1;
-
/**
* Method to tell whether to use local settings for Logical Effort.
* The default is true.
@@ -1158,32 +1102,6 @@ public class LETool extends Tool {
*/
public static Setting getUseLocalSettingsSetting() { return ToolSettings.getUseLocalSettingsSetting(); }
-// private static Pref cacheHighlightComponents = Pref.makeBooleanPref("HighlightComponents", LETool.tool.prefs, false);
-// /**
-// * Method to tell whether to highlight components in Logical Effort.
-// * The default is false.
-// * @return true to highlight components in Logical Effort
-// */
-// public static boolean isHighlightComponents() { return cacheHighlightComponents.getBoolean(); }
-// /**
-// * Method to set whether to highlight components in Logical Effort
-// * @param on whether to highlight components in Logical Effort
-// */
-// public static void setHighlightComponents(boolean on) { cacheHighlightComponents.setBoolean(on); }
-
-// private static Pref cacheShowIntermediateCapacitances = Pref.makeBooleanPref("ShowIntermediateCapacitances", LETool.tool.prefs, false);
-// /**
-// * Method to tell whether to highlight intermediate capacitances in Logical Effort.
-// * The default is false.
-// * @return true to highlight intermediate capacitances in Logical Effort
-// */
-// public static boolean isShowIntermediateCapacitances() { return cacheShowIntermediateCapacitances.getBoolean(); }
-// /**
-// * Method to set whether to highlight intermediate capacitances in Logical Effort
-// * @param on whether to highlight intermediate capacitances in Logical Effort
-// */
-// public static void setShowIntermediateCapacitances(boolean on) { cacheShowIntermediateCapacitances.setBoolean(on); }
-
/**
* Method to get the Global Fanout for Logical Effort.
* The default is DEFAULT_GLOBALFANOUT.
@@ -1220,45 +1138,6 @@ public class LETool extends Tool {
*/
public static Setting getMaxIterationsSetting() { return ToolSettings.getMaxIterationsSetting(); }
-// private static Pref cacheGateCapacitance = Pref.makeDoublePref("GateCapfFPerLambda", LETool.tool.prefs, DEFAULT_GATECAP);
-// /**
-// * Method to get the Gate Capacitance for Logical Effort.
-// * The default is DEFAULT_GATECAP.
-// * @return the Gate Capacitance for Logical Effort.
-// */
-// public static double getGateCapacitance() { return cacheGateCapacitance.getDouble(); }
-// /**
-// * Method to set the Gate Capacitance for Logical Effort.
-// * @param gc the Gate Capacitance for Logical Effort.
-// */
-// public static void setGateCapacitance(double gc) { cacheGateCapacitance.setDouble(gc); }
-
-// private static Pref cacheWireRatio = Pref.makeDoublePref("WireRatio", LETool.tool.prefs, DEFAULT_WIRERATIO);
-// /**
-// * Method to get the wire capacitance ratio for Logical Effort.
-// * The default is DEFAULT_WIRERATIO.
-// * @return the wire capacitance ratio for Logical Effort.
-// */
-// public static double getWireRatio() { return cacheWireRatio.getDouble(); }
-// /**
-// * Method to set the wire capacitance ratio for Logical Effort.
-// * @param wr the wire capacitance ratio for Logical Effort.
-// */
-// public static void setWireRatio(double wr) { cacheWireRatio.setDouble(wr); }
-
-// private static Pref cacheDiffAlpha = Pref.makeDoublePref("DiffusionAlpha", LETool.tool.prefs, DEFAULT_DIFFALPHA);
-// /**
-// * Method to get the diffusion to gate capacitance ratio for Logical Effort.
-// * The default is DEFAULT_DIFFALPHA.
-// * @return the diffusion to gate capacitance ratio for Logical Effort.
-// */
-// public static double getDiffAlpha() { return cacheDiffAlpha.getDouble(); }
-// /**
-// * Method to set the diffusion to gate capacitance ratio for Logical Effort.
-// * @param da the diffusion to gate capacitance ratio for Logical Effort.
-// */
-// public static void setDiffAlpha(double da) { cacheDiffAlpha.setDouble(da); }
-
/**
* Method to get the keeper size ratio for Logical Effort.
* The default is DEFAULT_KEEPERRATIO.
diff --git a/com/sun/electric/tool/logicaleffort/Net.java b/com/sun/electric/tool/logicaleffort/Net.java
index 9814554..f5a4c6b 100644
--- a/com/sun/electric/tool/logicaleffort/Net.java
+++ b/com/sun/electric/tool/logicaleffort/Net.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: Net.java
- * Written by: Jonathan Gainsley, Sun Microsystems.
+ * Written by: Jonathan Gainsley.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/logicaleffort/Pin.java b/com/sun/electric/tool/logicaleffort/Pin.java
index b49f2a2..79f1808 100644
--- a/com/sun/electric/tool/logicaleffort/Pin.java
+++ b/com/sun/electric/tool/logicaleffort/Pin.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: Pin.java
- * Written by: Jonathan Gainsley, Sun Microsystems.
+ * Written by: Jonathan Gainsley.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/Aborter.java b/com/sun/electric/tool/ncc/Aborter.java
index e2b8e6f..7e710be 100644
--- a/com/sun/electric/tool/ncc/Aborter.java
+++ b/com/sun/electric/tool/ncc/Aborter.java
@@ -4,7 +4,7 @@
*
* File: Aborter.java
*
-* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+* Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/AllSchemNamesToLay.java b/com/sun/electric/tool/ncc/AllSchemNamesToLay.java
index 185ea8b..bcd10fc 100644
--- a/com/sun/electric/tool/ncc/AllSchemNamesToLay.java
+++ b/com/sun/electric/tool/ncc/AllSchemNamesToLay.java
@@ -4,7 +4,7 @@
*
* File: AllSchemNamesToLay.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/ListNccAnnotations.java b/com/sun/electric/tool/ncc/ListNccAnnotations.java
index 7f77b10..2dbf756 100644
--- a/com/sun/electric/tool/ncc/ListNccAnnotations.java
+++ b/com/sun/electric/tool/ncc/ListNccAnnotations.java
@@ -4,7 +4,7 @@
*
* File: ListNccAnnotations.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/Ncc.java b/com/sun/electric/tool/ncc/Ncc.java
index 8f295c4..638c548 100644
--- a/com/sun/electric/tool/ncc/Ncc.java
+++ b/com/sun/electric/tool/ncc/Ncc.java
@@ -4,7 +4,7 @@
*
* File: Ncc.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/NccBottomUp.java b/com/sun/electric/tool/ncc/NccBottomUp.java
index 97ea9f0..6b215c3 100644
--- a/com/sun/electric/tool/ncc/NccBottomUp.java
+++ b/com/sun/electric/tool/ncc/NccBottomUp.java
@@ -4,7 +4,7 @@
*
* File: NccBottomUp.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/NccCrossProbing.java b/com/sun/electric/tool/ncc/NccCrossProbing.java
index 1f86a67..26d483c 100644
--- a/com/sun/electric/tool/ncc/NccCrossProbing.java
+++ b/com/sun/electric/tool/ncc/NccCrossProbing.java
@@ -4,7 +4,7 @@
*
* File: NccCrossProbing.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/NccEngine.java b/com/sun/electric/tool/ncc/NccEngine.java
index 10c9c1c..aba668c 100644
--- a/com/sun/electric/tool/ncc/NccEngine.java
+++ b/com/sun/electric/tool/ncc/NccEngine.java
@@ -4,7 +4,7 @@
*
* File: NccEngine.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/NccGlobals.java b/com/sun/electric/tool/ncc/NccGlobals.java
index f00f5c8..bf7a3fb 100644
--- a/com/sun/electric/tool/ncc/NccGlobals.java
+++ b/com/sun/electric/tool/ncc/NccGlobals.java
@@ -4,7 +4,7 @@
*
* File: NccGlobals.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/NccGlobalsReportable.java b/com/sun/electric/tool/ncc/NccGlobalsReportable.java
index d41d575..078a344 100644
--- a/com/sun/electric/tool/ncc/NccGlobalsReportable.java
+++ b/com/sun/electric/tool/ncc/NccGlobalsReportable.java
@@ -4,7 +4,7 @@
*
* File: NccGlobalsReportable.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/NccJob.java b/com/sun/electric/tool/ncc/NccJob.java
index 69020c9..c462580 100644
--- a/com/sun/electric/tool/ncc/NccJob.java
+++ b/com/sun/electric/tool/ncc/NccJob.java
@@ -4,7 +4,7 @@
*
* File: NccJob.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/NccOptions.java b/com/sun/electric/tool/ncc/NccOptions.java
index fc47569..f60f119 100644
--- a/com/sun/electric/tool/ncc/NccOptions.java
+++ b/com/sun/electric/tool/ncc/NccOptions.java
@@ -4,7 +4,7 @@
*
* File: NccOptions.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/NccPreferences.java b/com/sun/electric/tool/ncc/NccPreferences.java
index d3991de..208d20b 100644
--- a/com/sun/electric/tool/ncc/NccPreferences.java
+++ b/com/sun/electric/tool/ncc/NccPreferences.java
@@ -4,7 +4,7 @@
*
* File: NccPreferences.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/SchemNamesToLay.java b/com/sun/electric/tool/ncc/SchemNamesToLay.java
index 8cba615..abda329 100644
--- a/com/sun/electric/tool/ncc/SchemNamesToLay.java
+++ b/com/sun/electric/tool/ncc/SchemNamesToLay.java
@@ -4,7 +4,7 @@
*
* File: SchemNamesToLay.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/basic/CellContext.java b/com/sun/electric/tool/ncc/basic/CellContext.java
index 63ec336..b7c5c4d 100644
--- a/com/sun/electric/tool/ncc/basic/CellContext.java
+++ b/com/sun/electric/tool/ncc/basic/CellContext.java
@@ -4,7 +4,7 @@
*
* File: CellContext.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/basic/CellUsage.java b/com/sun/electric/tool/ncc/basic/CellUsage.java
index d88da30..756c5cd 100644
--- a/com/sun/electric/tool/ncc/basic/CellUsage.java
+++ b/com/sun/electric/tool/ncc/basic/CellUsage.java
@@ -4,7 +4,7 @@
*
* File: CellUsage.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/basic/CompareList.java b/com/sun/electric/tool/ncc/basic/CompareList.java
index cfc17f2..6bff668 100644
--- a/com/sun/electric/tool/ncc/basic/CompareList.java
+++ b/com/sun/electric/tool/ncc/basic/CompareList.java
@@ -4,7 +4,7 @@
*
* File: CompareList.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/basic/CompareLists.java b/com/sun/electric/tool/ncc/basic/CompareLists.java
index aa10cb5..8d3f016 100644
--- a/com/sun/electric/tool/ncc/basic/CompareLists.java
+++ b/com/sun/electric/tool/ncc/basic/CompareLists.java
@@ -4,7 +4,7 @@
*
* File: CompareLists.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/basic/NccCellAnnotations.java b/com/sun/electric/tool/ncc/basic/NccCellAnnotations.java
index 8015da5..cad0ac0 100644
--- a/com/sun/electric/tool/ncc/basic/NccCellAnnotations.java
+++ b/com/sun/electric/tool/ncc/basic/NccCellAnnotations.java
@@ -4,7 +4,7 @@
*
* File: NccCellAnnotations.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/basic/NccUtils.java b/com/sun/electric/tool/ncc/basic/NccUtils.java
index a438544..b0e05ff 100644
--- a/com/sun/electric/tool/ncc/basic/NccUtils.java
+++ b/com/sun/electric/tool/ncc/basic/NccUtils.java
@@ -4,7 +4,7 @@
*
* File: NccUtils.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/basic/Primes.java b/com/sun/electric/tool/ncc/basic/Primes.java
index 887a136..827cc13 100644
--- a/com/sun/electric/tool/ncc/basic/Primes.java
+++ b/com/sun/electric/tool/ncc/basic/Primes.java
@@ -4,7 +4,7 @@
*
* File: Primes.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/basic/TransitiveRelation.java b/com/sun/electric/tool/ncc/basic/TransitiveRelation.java
index 75c3227..aa428f4 100644
--- a/com/sun/electric/tool/ncc/basic/TransitiveRelation.java
+++ b/com/sun/electric/tool/ncc/basic/TransitiveRelation.java
@@ -4,7 +4,7 @@
*
* File: TransitiveRelation.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/lists/LeafList.java b/com/sun/electric/tool/ncc/lists/LeafList.java
index c7dc368..8616048 100644
--- a/com/sun/electric/tool/ncc/lists/LeafList.java
+++ b/com/sun/electric/tool/ncc/lists/LeafList.java
@@ -4,7 +4,7 @@
*
* File: LeafList.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/lists/RecordList.java b/com/sun/electric/tool/ncc/lists/RecordList.java
index c6c977e..2da59da 100644
--- a/com/sun/electric/tool/ncc/lists/RecordList.java
+++ b/com/sun/electric/tool/ncc/lists/RecordList.java
@@ -4,7 +4,7 @@
*
* File: RecordList.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/netlist/Bipolar.java b/com/sun/electric/tool/ncc/netlist/Bipolar.java
index 7de4069..0a31f6a 100644
--- a/com/sun/electric/tool/ncc/netlist/Bipolar.java
+++ b/com/sun/electric/tool/ncc/netlist/Bipolar.java
@@ -4,7 +4,7 @@
*
* File: Bipolar.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/netlist/Function4PortTo3Port.java b/com/sun/electric/tool/ncc/netlist/Function4PortTo3Port.java
index 0162c21..25877fd 100644
--- a/com/sun/electric/tool/ncc/netlist/Function4PortTo3Port.java
+++ b/com/sun/electric/tool/ncc/netlist/Function4PortTo3Port.java
@@ -4,7 +4,7 @@
*
* File: Function4PortTo3Port.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/netlist/Mos.java b/com/sun/electric/tool/ncc/netlist/Mos.java
index dbdebec..7394d4c 100644
--- a/com/sun/electric/tool/ncc/netlist/Mos.java
+++ b/com/sun/electric/tool/ncc/netlist/Mos.java
@@ -4,7 +4,7 @@
*
* File: Mos.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/netlist/NccNameProxy.java b/com/sun/electric/tool/ncc/netlist/NccNameProxy.java
index e7d3f6b..20b9f78 100644
--- a/com/sun/electric/tool/ncc/netlist/NccNameProxy.java
+++ b/com/sun/electric/tool/ncc/netlist/NccNameProxy.java
@@ -4,7 +4,7 @@
*
* File: NccNameProxy.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/netlist/NccNetlist.java b/com/sun/electric/tool/ncc/netlist/NccNetlist.java
index 8e2ca9f..c17801f 100644
--- a/com/sun/electric/tool/ncc/netlist/NccNetlist.java
+++ b/com/sun/electric/tool/ncc/netlist/NccNetlist.java
@@ -4,7 +4,7 @@
*
* File: NccNetlist.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/netlist/NetObject.java b/com/sun/electric/tool/ncc/netlist/NetObject.java
index e7df88d..9918614 100644
--- a/com/sun/electric/tool/ncc/netlist/NetObject.java
+++ b/com/sun/electric/tool/ncc/netlist/NetObject.java
@@ -4,7 +4,7 @@
*
* File: NetObject.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/netlist/Part.java b/com/sun/electric/tool/ncc/netlist/Part.java
index 6181fc2..b6a7849 100644
--- a/com/sun/electric/tool/ncc/netlist/Part.java
+++ b/com/sun/electric/tool/ncc/netlist/Part.java
@@ -4,7 +4,7 @@
*
* File: Part.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/netlist/PinType.java b/com/sun/electric/tool/ncc/netlist/PinType.java
index 6b18929..39cb18f 100644
--- a/com/sun/electric/tool/ncc/netlist/PinType.java
+++ b/com/sun/electric/tool/ncc/netlist/PinType.java
@@ -4,7 +4,7 @@
*
* File: PinType.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/netlist/Port.java b/com/sun/electric/tool/ncc/netlist/Port.java
index 5fcfb67..8ac0ebb 100644
--- a/com/sun/electric/tool/ncc/netlist/Port.java
+++ b/com/sun/electric/tool/ncc/netlist/Port.java
@@ -4,7 +4,7 @@
*
* File: Port.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/netlist/PrimitiveNameToFunction.java b/com/sun/electric/tool/ncc/netlist/PrimitiveNameToFunction.java
index 2ab0b93..1fa3dba 100644
--- a/com/sun/electric/tool/ncc/netlist/PrimitiveNameToFunction.java
+++ b/com/sun/electric/tool/ncc/netlist/PrimitiveNameToFunction.java
@@ -4,7 +4,7 @@
*
* File: PrimitiveNameToFunction.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/netlist/Resistor.java b/com/sun/electric/tool/ncc/netlist/Resistor.java
index 5b6b82d..2e2bd2b 100644
--- a/com/sun/electric/tool/ncc/netlist/Resistor.java
+++ b/com/sun/electric/tool/ncc/netlist/Resistor.java
@@ -4,7 +4,7 @@
*
* File: Resistor.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/netlist/Subcircuit.java b/com/sun/electric/tool/ncc/netlist/Subcircuit.java
index 7fd8c2f..8a6051a 100644
--- a/com/sun/electric/tool/ncc/netlist/Subcircuit.java
+++ b/com/sun/electric/tool/ncc/netlist/Subcircuit.java
@@ -4,7 +4,7 @@
*
* File: Subcircuit.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/netlist/Wire.java b/com/sun/electric/tool/ncc/netlist/Wire.java
index a1fc9de..bcaf0c5 100644
--- a/com/sun/electric/tool/ncc/netlist/Wire.java
+++ b/com/sun/electric/tool/ncc/netlist/Wire.java
@@ -4,7 +4,7 @@
*
* File: Wire.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/processing/ExportChecker.java b/com/sun/electric/tool/ncc/processing/ExportChecker.java
index 469bbbe..4472101 100644
--- a/com/sun/electric/tool/ncc/processing/ExportChecker.java
+++ b/com/sun/electric/tool/ncc/processing/ExportChecker.java
@@ -4,7 +4,7 @@
*
* File: ExportChecker.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/processing/ForceMatch.java b/com/sun/electric/tool/ncc/processing/ForceMatch.java
index 5cd7ed4..5986c1a 100644
--- a/com/sun/electric/tool/ncc/processing/ForceMatch.java
+++ b/com/sun/electric/tool/ncc/processing/ForceMatch.java
@@ -4,7 +4,7 @@
*
* File: ExportChecker.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/processing/HashCodePartitioning.java b/com/sun/electric/tool/ncc/processing/HashCodePartitioning.java
index a9e4f40..fc59974 100644
--- a/com/sun/electric/tool/ncc/processing/HashCodePartitioning.java
+++ b/com/sun/electric/tool/ncc/processing/HashCodePartitioning.java
@@ -4,7 +4,7 @@
*
* File: HashCodePartitioning.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/processing/HierarchyInfo.java b/com/sun/electric/tool/ncc/processing/HierarchyInfo.java
index 94776e2..0eea91e 100644
--- a/com/sun/electric/tool/ncc/processing/HierarchyInfo.java
+++ b/com/sun/electric/tool/ncc/processing/HierarchyInfo.java
@@ -4,7 +4,7 @@
*
* File: HierarchyInfo.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/processing/LocalPartitionResult.java b/com/sun/electric/tool/ncc/processing/LocalPartitionResult.java
index 222ccca..fc85a30 100644
--- a/com/sun/electric/tool/ncc/processing/LocalPartitionResult.java
+++ b/com/sun/electric/tool/ncc/processing/LocalPartitionResult.java
@@ -4,7 +4,7 @@
*
* File: LocalPartitionResult.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/processing/LocalPartitionWires.java b/com/sun/electric/tool/ncc/processing/LocalPartitionWires.java
index abb507a..aefd321 100644
--- a/com/sun/electric/tool/ncc/processing/LocalPartitionWires.java
+++ b/com/sun/electric/tool/ncc/processing/LocalPartitionWires.java
@@ -4,7 +4,7 @@
*
* File: LocalPartitioning.java
*
-* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+* Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/processing/LocalPartitioning.java b/com/sun/electric/tool/ncc/processing/LocalPartitioning.java
index e6581db..97f141a 100644
--- a/com/sun/electric/tool/ncc/processing/LocalPartitioning.java
+++ b/com/sun/electric/tool/ncc/processing/LocalPartitioning.java
@@ -4,7 +4,7 @@
*
* File: LocalPartitioning.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/processing/ReportHashCodeFailure.java b/com/sun/electric/tool/ncc/processing/ReportHashCodeFailure.java
index 2cdbf91..f40d25a 100644
--- a/com/sun/electric/tool/ncc/processing/ReportHashCodeFailure.java
+++ b/com/sun/electric/tool/ncc/processing/ReportHashCodeFailure.java
@@ -4,7 +4,7 @@
*
* File: ReportHashCodeFailure.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/processing/SerialParallelMerge.java b/com/sun/electric/tool/ncc/processing/SerialParallelMerge.java
index 14c7495..94161a3 100644
--- a/com/sun/electric/tool/ncc/processing/SerialParallelMerge.java
+++ b/com/sun/electric/tool/ncc/processing/SerialParallelMerge.java
@@ -4,7 +4,7 @@
*
* File: MergeSerialParallel.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/processing/SubcircuitInfo.java b/com/sun/electric/tool/ncc/processing/SubcircuitInfo.java
index 3b8fa42..8192d55 100644
--- a/com/sun/electric/tool/ncc/processing/SubcircuitInfo.java
+++ b/com/sun/electric/tool/ncc/processing/SubcircuitInfo.java
@@ -4,7 +4,7 @@
*
* File: SubcircuitInfo.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/result/BenchmarkResults.java b/com/sun/electric/tool/ncc/result/BenchmarkResults.java
index 133ddac..517f0c4 100644
--- a/com/sun/electric/tool/ncc/result/BenchmarkResults.java
+++ b/com/sun/electric/tool/ncc/result/BenchmarkResults.java
@@ -4,7 +4,7 @@
*
* File: BenchmarkResult.java
*
- * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/result/EquivRecReport.java b/com/sun/electric/tool/ncc/result/EquivRecReport.java
index a7d990b..c95c573 100644
--- a/com/sun/electric/tool/ncc/result/EquivRecReport.java
+++ b/com/sun/electric/tool/ncc/result/EquivRecReport.java
@@ -4,7 +4,7 @@
*
* File: EquivRecReport.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/result/NccResult.java b/com/sun/electric/tool/ncc/result/NccResult.java
index db514d6..c12130f 100644
--- a/com/sun/electric/tool/ncc/result/NccResult.java
+++ b/com/sun/electric/tool/ncc/result/NccResult.java
@@ -4,7 +4,7 @@
*
* File: NccResult.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/result/NccResults.java b/com/sun/electric/tool/ncc/result/NccResults.java
index 22c9f50..9672fdc 100644
--- a/com/sun/electric/tool/ncc/result/NccResults.java
+++ b/com/sun/electric/tool/ncc/result/NccResults.java
@@ -4,7 +4,7 @@
*
* File: NccResults.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/result/NetObjReport.java b/com/sun/electric/tool/ncc/result/NetObjReport.java
index 5325b52..c441c45 100644
--- a/com/sun/electric/tool/ncc/result/NetObjReport.java
+++ b/com/sun/electric/tool/ncc/result/NetObjReport.java
@@ -4,7 +4,7 @@
*
* File: NetObjReport.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/result/PartReport.java b/com/sun/electric/tool/ncc/result/PartReport.java
index 515728e..644ef98 100644
--- a/com/sun/electric/tool/ncc/result/PartReport.java
+++ b/com/sun/electric/tool/ncc/result/PartReport.java
@@ -4,7 +4,7 @@
*
* File: PartReport.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/result/Permutation.java b/com/sun/electric/tool/ncc/result/Permutation.java
index 448544b..9eaf586 100644
--- a/com/sun/electric/tool/ncc/result/Permutation.java
+++ b/com/sun/electric/tool/ncc/result/Permutation.java
@@ -5,7 +5,7 @@
* File: Permutation.java
* Written by Stephen Friedman
*
- * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/result/PortReport.java b/com/sun/electric/tool/ncc/result/PortReport.java
index 5a9198b..1a117ee 100644
--- a/com/sun/electric/tool/ncc/result/PortReport.java
+++ b/com/sun/electric/tool/ncc/result/PortReport.java
@@ -4,7 +4,7 @@
*
* File: WireReport.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/result/SizeMismatch.java b/com/sun/electric/tool/ncc/result/SizeMismatch.java
index ed98afd..26ce756 100644
--- a/com/sun/electric/tool/ncc/result/SizeMismatch.java
+++ b/com/sun/electric/tool/ncc/result/SizeMismatch.java
@@ -4,7 +4,7 @@
*
* File: SizeMismatch.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/result/WireReport.java b/com/sun/electric/tool/ncc/result/WireReport.java
index d688296..feb4eba 100644
--- a/com/sun/electric/tool/ncc/result/WireReport.java
+++ b/com/sun/electric/tool/ncc/result/WireReport.java
@@ -4,7 +4,7 @@
*
* File: WireReport.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/result/equivalence/Equivalence.java b/com/sun/electric/tool/ncc/result/equivalence/Equivalence.java
index c67eceb..3fba928 100644
--- a/com/sun/electric/tool/ncc/result/equivalence/Equivalence.java
+++ b/com/sun/electric/tool/ncc/result/equivalence/Equivalence.java
@@ -4,7 +4,7 @@
*
* File: Equivalence.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/result/equivalence/InstancePathToNccContext.java b/com/sun/electric/tool/ncc/result/equivalence/InstancePathToNccContext.java
index 4bd6348..21546ec 100644
--- a/com/sun/electric/tool/ncc/result/equivalence/InstancePathToNccContext.java
+++ b/com/sun/electric/tool/ncc/result/equivalence/InstancePathToNccContext.java
@@ -4,7 +4,7 @@
*
* File: InstancePathToNccContext.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/result/equivalence/NccContext.java b/com/sun/electric/tool/ncc/result/equivalence/NccContext.java
index f9961ee..73dc23b 100644
--- a/com/sun/electric/tool/ncc/result/equivalence/NccContext.java
+++ b/com/sun/electric/tool/ncc/result/equivalence/NccContext.java
@@ -4,7 +4,7 @@
*
* File: NccContext.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/result/equivalence/NetEquivalence.java b/com/sun/electric/tool/ncc/result/equivalence/NetEquivalence.java
index 6514eed..866b113 100644
--- a/com/sun/electric/tool/ncc/result/equivalence/NetEquivalence.java
+++ b/com/sun/electric/tool/ncc/result/equivalence/NetEquivalence.java
@@ -4,7 +4,7 @@
*
* File: NetEquivalence.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/result/equivalence/NodeEquivalence.java b/com/sun/electric/tool/ncc/result/equivalence/NodeEquivalence.java
index 6993947..67cd18a 100644
--- a/com/sun/electric/tool/ncc/result/equivalence/NodeEquivalence.java
+++ b/com/sun/electric/tool/ncc/result/equivalence/NodeEquivalence.java
@@ -4,7 +4,7 @@
*
* File: NodeEquivalence.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/strategy/StratCheck.java b/com/sun/electric/tool/ncc/strategy/StratCheck.java
index 8bf0571..3445759 100644
--- a/com/sun/electric/tool/ncc/strategy/StratCheck.java
+++ b/com/sun/electric/tool/ncc/strategy/StratCheck.java
@@ -4,7 +4,7 @@
*
* File: StratCheck.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/strategy/StratCheckSizes.java b/com/sun/electric/tool/ncc/strategy/StratCheckSizes.java
index 3b7dda1..c46a249 100644
--- a/com/sun/electric/tool/ncc/strategy/StratCheckSizes.java
+++ b/com/sun/electric/tool/ncc/strategy/StratCheckSizes.java
@@ -4,7 +4,7 @@
*
* File: StratCheckSizes.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/strategy/StratCount.java b/com/sun/electric/tool/ncc/strategy/StratCount.java
index 591435b..50cc444 100644
--- a/com/sun/electric/tool/ncc/strategy/StratCount.java
+++ b/com/sun/electric/tool/ncc/strategy/StratCount.java
@@ -4,7 +4,7 @@
*
* File: StratCount.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/strategy/StratDebug.java b/com/sun/electric/tool/ncc/strategy/StratDebug.java
index 2ab6e7c..e78a4c1 100644
--- a/com/sun/electric/tool/ncc/strategy/StratDebug.java
+++ b/com/sun/electric/tool/ncc/strategy/StratDebug.java
@@ -4,7 +4,7 @@
*
* File: StratDebug.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/strategy/StratHashParts.java b/com/sun/electric/tool/ncc/strategy/StratHashParts.java
index 1d0d66f..0c442b3 100644
--- a/com/sun/electric/tool/ncc/strategy/StratHashParts.java
+++ b/com/sun/electric/tool/ncc/strategy/StratHashParts.java
@@ -4,7 +4,7 @@
*
* File: StratHashParts.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/strategy/StratHashWires.java b/com/sun/electric/tool/ncc/strategy/StratHashWires.java
index 334ec99..8278951 100644
--- a/com/sun/electric/tool/ncc/strategy/StratHashWires.java
+++ b/com/sun/electric/tool/ncc/strategy/StratHashWires.java
@@ -4,7 +4,7 @@
*
* File: StratHashWires.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/strategy/StratPartPopularity.java b/com/sun/electric/tool/ncc/strategy/StratPartPopularity.java
index dae377d..7a02a66 100644
--- a/com/sun/electric/tool/ncc/strategy/StratPartPopularity.java
+++ b/com/sun/electric/tool/ncc/strategy/StratPartPopularity.java
@@ -4,7 +4,7 @@
*
* File: StratPartPopularity.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/strategy/StratPartType.java b/com/sun/electric/tool/ncc/strategy/StratPartType.java
index 61fa4c3..f03e451 100644
--- a/com/sun/electric/tool/ncc/strategy/StratPartType.java
+++ b/com/sun/electric/tool/ncc/strategy/StratPartType.java
@@ -4,7 +4,7 @@
*
* File: StratPartType.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/strategy/StratPortName.java b/com/sun/electric/tool/ncc/strategy/StratPortName.java
index 26ec4d2..7235ce7 100644
--- a/com/sun/electric/tool/ncc/strategy/StratPortName.java
+++ b/com/sun/electric/tool/ncc/strategy/StratPortName.java
@@ -4,7 +4,7 @@
*
* File: StratPortName.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/strategy/StratPrint.java b/com/sun/electric/tool/ncc/strategy/StratPrint.java
index bd0c3f2..4cabec2 100644
--- a/com/sun/electric/tool/ncc/strategy/StratPrint.java
+++ b/com/sun/electric/tool/ncc/strategy/StratPrint.java
@@ -4,7 +4,7 @@
*
* File: StratPrint.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/strategy/StratRandomMatch.java b/com/sun/electric/tool/ncc/strategy/StratRandomMatch.java
index bee06b4..2328951 100644
--- a/com/sun/electric/tool/ncc/strategy/StratRandomMatch.java
+++ b/com/sun/electric/tool/ncc/strategy/StratRandomMatch.java
@@ -4,7 +4,7 @@
*
* File: StratRandomMatch.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/strategy/StratSizes.java b/com/sun/electric/tool/ncc/strategy/StratSizes.java
index 5030285..91bfe0c 100644
--- a/com/sun/electric/tool/ncc/strategy/StratSizes.java
+++ b/com/sun/electric/tool/ncc/strategy/StratSizes.java
@@ -4,7 +4,7 @@
*
* File: StratSizes.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/strategy/Strategy.java b/com/sun/electric/tool/ncc/strategy/Strategy.java
index 3bd8f80..89518df 100644
--- a/com/sun/electric/tool/ncc/strategy/Strategy.java
+++ b/com/sun/electric/tool/ncc/strategy/Strategy.java
@@ -4,7 +4,7 @@
*
* File: Strategy.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/trees/Circuit.java b/com/sun/electric/tool/ncc/trees/Circuit.java
index 6e6658a..591e69f 100644
--- a/com/sun/electric/tool/ncc/trees/Circuit.java
+++ b/com/sun/electric/tool/ncc/trees/Circuit.java
@@ -4,7 +4,7 @@
*
* File: Circuit.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/trees/EquivRecord.java b/com/sun/electric/tool/ncc/trees/EquivRecord.java
index 3f45cc8..7a586c2 100644
--- a/com/sun/electric/tool/ncc/trees/EquivRecord.java
+++ b/com/sun/electric/tool/ncc/trees/EquivRecord.java
@@ -4,7 +4,7 @@
*
* File: EquivRecord.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/ncc/trees/LeafEquivRecords.java b/com/sun/electric/tool/ncc/trees/LeafEquivRecords.java
index d474156..e2ea2ae 100644
--- a/com/sun/electric/tool/ncc/trees/LeafEquivRecords.java
+++ b/com/sun/electric/tool/ncc/trees/LeafEquivRecords.java
@@ -4,7 +4,7 @@
*
* File: LeafEquivRecords.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/Placement.java b/com/sun/electric/tool/placement/Placement.java
index acd8a5b..3da8ed0 100644
--- a/com/sun/electric/tool/placement/Placement.java
+++ b/com/sun/electric/tool/placement/Placement.java
@@ -4,7 +4,7 @@
*
* File: Placement.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/PlacementAdapter.java b/com/sun/electric/tool/placement/PlacementAdapter.java
index 5ab9629..0fadb1a 100644
--- a/com/sun/electric/tool/placement/PlacementAdapter.java
+++ b/com/sun/electric/tool/placement/PlacementAdapter.java
@@ -4,7 +4,7 @@
*
* File: PlacementAdapter.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -579,7 +579,7 @@ public class PlacementAdapter {
public PlacementSteinerTree(List<SteinerTreePort> portList, boolean isRail)
{
- super(portList);
+ super(portList, false);
this.isRail = isRail;
}
diff --git a/com/sun/electric/tool/placement/PlacementFrame.java b/com/sun/electric/tool/placement/PlacementFrame.java
index cf1fcaa..ca4d44d 100644
--- a/com/sun/electric/tool/placement/PlacementFrame.java
+++ b/com/sun/electric/tool/placement/PlacementFrame.java
@@ -4,7 +4,7 @@
*
* File: PlacementFrame.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/PlacementFrameElectric.java b/com/sun/electric/tool/placement/PlacementFrameElectric.java
index c33437c..9bbfbaf 100644
--- a/com/sun/electric/tool/placement/PlacementFrameElectric.java
+++ b/com/sun/electric/tool/placement/PlacementFrameElectric.java
@@ -4,7 +4,7 @@
*
* File: PlacementFrameElectric.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/PlacementMinCut.java b/com/sun/electric/tool/placement/PlacementMinCut.java
index cea7b7c..3a978e9 100644
--- a/com/sun/electric/tool/placement/PlacementMinCut.java
+++ b/com/sun/electric/tool/placement/PlacementMinCut.java
@@ -4,7 +4,7 @@
*
* File: PlacementMinCut.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/PlacementRandom.java b/com/sun/electric/tool/placement/PlacementRandom.java
index 9780a8e..b886a1c 100644
--- a/com/sun/electric/tool/placement/PlacementRandom.java
+++ b/com/sun/electric/tool/placement/PlacementRandom.java
@@ -4,7 +4,7 @@
*
* File: PlacementRandom.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/PlacementSimple.java b/com/sun/electric/tool/placement/PlacementSimple.java
index 230ce40..6817dac 100644
--- a/com/sun/electric/tool/placement/PlacementSimple.java
+++ b/com/sun/electric/tool/placement/PlacementSimple.java
@@ -4,7 +4,7 @@
*
* File: PlacementSimple.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected1/Debug.java b/com/sun/electric/tool/placement/forceDirected1/Debug.java
index 9c2a3f3..d2e662c 100644
--- a/com/sun/electric/tool/placement/forceDirected1/Debug.java
+++ b/com/sun/electric/tool/placement/forceDirected1/Debug.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected1/PlacementForceDirectedTeam5.java b/com/sun/electric/tool/placement/forceDirected1/PlacementForceDirectedTeam5.java
index c67b04c..4cf00d9 100644
--- a/com/sun/electric/tool/placement/forceDirected1/PlacementForceDirectedTeam5.java
+++ b/com/sun/electric/tool/placement/forceDirected1/PlacementForceDirectedTeam5.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -458,7 +458,7 @@ public class PlacementForceDirectedTeam5 extends PlacementFrame {
*
* @param overlapWeightingFactor
* @param shapeRatio
- * @return
+ * @return status.
*/
boolean resolveOverlaps(double overlapWeightingFactor, double shapeRatio) {
// inputs : nodesToPlace, centerOfMass, W, H
@@ -523,7 +523,7 @@ public class PlacementForceDirectedTeam5 extends PlacementFrame {
*
* @param overlapWeightingFactor
* @param shapeRatio
- * @return
+ * @return status.
*/
boolean resolveOverlapsFast(double overlapWeightingFactor, double shapeRatio) {
// inputs : nodesToPlace, centerOfMass, W, H
@@ -1115,7 +1115,7 @@ public class PlacementForceDirectedTeam5 extends PlacementFrame {
* auxiliary function for getPositionOfPorts
*
* @param placementPort
- * @return
+ * @return a Point.
*/
private Point2D.Double getAbsolutePositionOf(PlacementPort placementPort) {
return new Point2D.Double(placementPort.getRotatedOffX()
diff --git a/com/sun/electric/tool/placement/forceDirected1/metric/AbstractMetric.java b/com/sun/electric/tool/placement/forceDirected1/metric/AbstractMetric.java
index 2d29fa5..db5dd5c 100644
--- a/com/sun/electric/tool/placement/forceDirected1/metric/AbstractMetric.java
+++ b/com/sun/electric/tool/placement/forceDirected1/metric/AbstractMetric.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected1/metric/BBMetric.java b/com/sun/electric/tool/placement/forceDirected1/metric/BBMetric.java
index 925c9ba..ddb3208 100644
--- a/com/sun/electric/tool/placement/forceDirected1/metric/BBMetric.java
+++ b/com/sun/electric/tool/placement/forceDirected1/metric/BBMetric.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected1/metric/MSTMetric.java b/com/sun/electric/tool/placement/forceDirected1/metric/MSTMetric.java
index e84471e..f6a4497 100644
--- a/com/sun/electric/tool/placement/forceDirected1/metric/MSTMetric.java
+++ b/com/sun/electric/tool/placement/forceDirected1/metric/MSTMetric.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -53,7 +53,7 @@ public class MSTMetric extends AbstractMetric
* Method returns the absolute Position of all Port in the list placementNets
* It is used to create the data structure for placement.metrics
* @param placementNets
- * @return
+ * @return port positions.
*/
private List<Point2D.Double[]> getPositionsOfPorts(List<PlacementNetwork> placementNets) {
LinkedList<Point2D.Double[]> posOfPorts = new LinkedList<Point2D.Double[]>();
@@ -77,7 +77,7 @@ public class MSTMetric extends AbstractMetric
/**
* auxiliary function for getPositionOfPorts
* @param placementPort
- * @return
+ * @return the port point.
*/
private Point2D.Double getAbsolutePositionOf(PlacementPort placementPort) {
return new Point2D.Double(
diff --git a/com/sun/electric/tool/placement/forceDirected1/metrics/CustomMetric.java b/com/sun/electric/tool/placement/forceDirected1/metrics/CustomMetric.java
index 7d274b8..b0ec019 100644
--- a/com/sun/electric/tool/placement/forceDirected1/metrics/CustomMetric.java
+++ b/com/sun/electric/tool/placement/forceDirected1/metrics/CustomMetric.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -88,7 +88,7 @@ public abstract class CustomMetric {
* Auxiliary method for getPositionOfPorts()
*
* @param placementPort
- * @return
+ * @return the point.
*/
private Point2D.Double getAbsolutePositionOf(PlacementPort placementPort) {
return new Point2D.Double(
diff --git a/com/sun/electric/tool/placement/forceDirected1/metrics/PAMetric.java b/com/sun/electric/tool/placement/forceDirected1/metrics/PAMetric.java
index d2c6968..cbb7c10 100644
--- a/com/sun/electric/tool/placement/forceDirected1/metrics/PAMetric.java
+++ b/com/sun/electric/tool/placement/forceDirected1/metrics/PAMetric.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/AdditionalNodeData.java b/com/sun/electric/tool/placement/forceDirected2/AdditionalNodeData.java
index 9cc854f..f63471b 100644
--- a/com/sun/electric/tool/placement/forceDirected2/AdditionalNodeData.java
+++ b/com/sun/electric/tool/placement/forceDirected2/AdditionalNodeData.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/PlacementForceDirectedStaged.java b/com/sun/electric/tool/placement/forceDirected2/PlacementForceDirectedStaged.java
index a7b7d49..0d6ba7d 100644
--- a/com/sun/electric/tool/placement/forceDirected2/PlacementForceDirectedStaged.java
+++ b/com/sun/electric/tool/placement/forceDirected2/PlacementForceDirectedStaged.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/forceDirected/IForceAlgorithm.java b/com/sun/electric/tool/placement/forceDirected2/forceDirected/IForceAlgorithm.java
index 89bbe80..d2a6631 100644
--- a/com/sun/electric/tool/placement/forceDirected2/forceDirected/IForceAlgorithm.java
+++ b/com/sun/electric/tool/placement/forceDirected2/forceDirected/IForceAlgorithm.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/forceDirected/IPlacementForceDirected.java b/com/sun/electric/tool/placement/forceDirected2/forceDirected/IPlacementForceDirected.java
index 1e8417f..ecb706b 100644
--- a/com/sun/electric/tool/placement/forceDirected2/forceDirected/IPlacementForceDirected.java
+++ b/com/sun/electric/tool/placement/forceDirected2/forceDirected/IPlacementForceDirected.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/forceDirected/OverlapDirection.java b/com/sun/electric/tool/placement/forceDirected2/forceDirected/OverlapDirection.java
index a5918df..2168fba 100644
--- a/com/sun/electric/tool/placement/forceDirected2/forceDirected/OverlapDirection.java
+++ b/com/sun/electric/tool/placement/forceDirected2/forceDirected/OverlapDirection.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/forceDirected/SpringForce.java b/com/sun/electric/tool/placement/forceDirected2/forceDirected/SpringForce.java
index 13e9151..6ec4686 100644
--- a/com/sun/electric/tool/placement/forceDirected2/forceDirected/SpringForce.java
+++ b/com/sun/electric/tool/placement/forceDirected2/forceDirected/SpringForce.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/forceDirected/staged/CalculateForcesStageWorker.java b/com/sun/electric/tool/placement/forceDirected2/forceDirected/staged/CalculateForcesStageWorker.java
index a7f3098..612b94d 100644
--- a/com/sun/electric/tool/placement/forceDirected2/forceDirected/staged/CalculateForcesStageWorker.java
+++ b/com/sun/electric/tool/placement/forceDirected2/forceDirected/staged/CalculateForcesStageWorker.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -65,7 +65,7 @@ public class CalculateForcesStageWorker extends StageWorker {
/**
*
* @param node
- * @return
+ * @return the calculated forces.
*/
private Force2D calculateForces(PlacementNode node) {
Force2D result = new Force2D();
diff --git a/com/sun/electric/tool/placement/forceDirected2/forceDirected/staged/EndWorker.java b/com/sun/electric/tool/placement/forceDirected2/forceDirected/staged/EndWorker.java
index f15d371..8f6ca3b 100644
--- a/com/sun/electric/tool/placement/forceDirected2/forceDirected/staged/EndWorker.java
+++ b/com/sun/electric/tool/placement/forceDirected2/forceDirected/staged/EndWorker.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/forceDirected/staged/FinalizeWorker.java b/com/sun/electric/tool/placement/forceDirected2/forceDirected/staged/FinalizeWorker.java
index d9e7b36..1093312 100644
--- a/com/sun/electric/tool/placement/forceDirected2/forceDirected/staged/FinalizeWorker.java
+++ b/com/sun/electric/tool/placement/forceDirected2/forceDirected/staged/FinalizeWorker.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/forceDirected/staged/OverlapWorker.java b/com/sun/electric/tool/placement/forceDirected2/forceDirected/staged/OverlapWorker.java
index 37e7c32..b5dac40 100644
--- a/com/sun/electric/tool/placement/forceDirected2/forceDirected/staged/OverlapWorker.java
+++ b/com/sun/electric/tool/placement/forceDirected2/forceDirected/staged/OverlapWorker.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/forceDirected/staged/PlaceNodesStageWorker.java b/com/sun/electric/tool/placement/forceDirected2/forceDirected/staged/PlaceNodesStageWorker.java
index 546670a..f548d83 100644
--- a/com/sun/electric/tool/placement/forceDirected2/forceDirected/staged/PlaceNodesStageWorker.java
+++ b/com/sun/electric/tool/placement/forceDirected2/forceDirected/staged/PlaceNodesStageWorker.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/forceDirected/staged/PlacementDTO.java b/com/sun/electric/tool/placement/forceDirected2/forceDirected/staged/PlacementDTO.java
index 3e75812..d12406a 100644
--- a/com/sun/electric/tool/placement/forceDirected2/forceDirected/staged/PlacementDTO.java
+++ b/com/sun/electric/tool/placement/forceDirected2/forceDirected/staged/PlacementDTO.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/forceDirected/staged/StartUpStage.java b/com/sun/electric/tool/placement/forceDirected2/forceDirected/staged/StartUpStage.java
index a4adafc..e94b65a 100644
--- a/com/sun/electric/tool/placement/forceDirected2/forceDirected/staged/StartUpStage.java
+++ b/com/sun/electric/tool/placement/forceDirected2/forceDirected/staged/StartUpStage.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/forceDirected/staged/StartUpStageWorker.java b/com/sun/electric/tool/placement/forceDirected2/forceDirected/staged/StartUpStageWorker.java
index 0e327c6..819c604 100644
--- a/com/sun/electric/tool/placement/forceDirected2/forceDirected/staged/StartUpStageWorker.java
+++ b/com/sun/electric/tool/placement/forceDirected2/forceDirected/staged/StartUpStageWorker.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/CheckboardingField.java b/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/CheckboardingField.java
index ce8ee8a..4189cf5 100644
--- a/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/CheckboardingField.java
+++ b/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/CheckboardingField.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/CheckboardingPattern.java b/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/CheckboardingPattern.java
index fdf8aed..3b86947 100644
--- a/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/CheckboardingPattern.java
+++ b/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/CheckboardingPattern.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/Force2D.java b/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/Force2D.java
index d90a145..27582c7 100644
--- a/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/Force2D.java
+++ b/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/Force2D.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/history/HistoryEntry.java b/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/history/HistoryEntry.java
index 61a10da..5e0e727 100644
--- a/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/history/HistoryEntry.java
+++ b/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/history/HistoryEntry.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/history/IOverlapHistory.java b/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/history/IOverlapHistory.java
index 288020e..bd071bc 100644
--- a/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/history/IOverlapHistory.java
+++ b/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/history/IOverlapHistory.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/history/OverlapHistory.java b/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/history/OverlapHistory.java
index 4c0ee1d..e958a2a 100644
--- a/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/history/OverlapHistory.java
+++ b/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/history/OverlapHistory.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/history/OverlapHistoryAtomics.java b/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/history/OverlapHistoryAtomics.java
index 9eb2a39..05a1d7f 100644
--- a/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/history/OverlapHistoryAtomics.java
+++ b/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/history/OverlapHistoryAtomics.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/history/OverlapHistoryLock.java b/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/history/OverlapHistoryLock.java
index 6ece56d..576ed00 100644
--- a/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/history/OverlapHistoryLock.java
+++ b/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/history/OverlapHistoryLock.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/history/OverlapHistoryLockFree.java b/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/history/OverlapHistoryLockFree.java
index 6e45f9d..0079268 100644
--- a/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/history/OverlapHistoryLockFree.java
+++ b/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/history/OverlapHistoryLockFree.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/history/OverlapHistoryNone.java b/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/history/OverlapHistoryNone.java
index d583ef6..754f99d 100644
--- a/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/history/OverlapHistoryNone.java
+++ b/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/history/OverlapHistoryNone.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/history/OverlapHistorySync.java b/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/history/OverlapHistorySync.java
index 5f0b38a..aa36ecb 100644
--- a/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/history/OverlapHistorySync.java
+++ b/com/sun/electric/tool/placement/forceDirected2/forceDirected/util/history/OverlapHistorySync.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/metrics/AbstractMetric.java b/com/sun/electric/tool/placement/forceDirected2/metrics/AbstractMetric.java
index f44bd4a..31d2210 100644
--- a/com/sun/electric/tool/placement/forceDirected2/metrics/AbstractMetric.java
+++ b/com/sun/electric/tool/placement/forceDirected2/metrics/AbstractMetric.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/metrics/AbstractMetricGeneric.java b/com/sun/electric/tool/placement/forceDirected2/metrics/AbstractMetricGeneric.java
index 7a4733e..3750b71 100644
--- a/com/sun/electric/tool/placement/forceDirected2/metrics/AbstractMetricGeneric.java
+++ b/com/sun/electric/tool/placement/forceDirected2/metrics/AbstractMetricGeneric.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/metrics/BBMetric.java b/com/sun/electric/tool/placement/forceDirected2/metrics/BBMetric.java
index fe14e09..58c9dc8 100644
--- a/com/sun/electric/tool/placement/forceDirected2/metrics/BBMetric.java
+++ b/com/sun/electric/tool/placement/forceDirected2/metrics/BBMetric.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/metrics/MSTMetric.java b/com/sun/electric/tool/placement/forceDirected2/metrics/MSTMetric.java
index d0325d7..b45a18f 100644
--- a/com/sun/electric/tool/placement/forceDirected2/metrics/MSTMetric.java
+++ b/com/sun/electric/tool/placement/forceDirected2/metrics/MSTMetric.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -158,7 +158,7 @@ public class MSTMetric extends AbstractMetric {
/**
*
* @param net
- * @return
+ * @return the metric
*/
private double compute(PlacementNetwork net) {
@@ -190,7 +190,7 @@ public class MSTMetric extends AbstractMetric {
*
* @param port1
* @param port2
- * @return
+ * @return the distance between the ports.
*/
private double getDistance(PlacementPort port1, PlacementPort port2) {
double deltaX = this.getPlacementX(port1) - this.getPlacementX(port2);
diff --git a/com/sun/electric/tool/placement/forceDirected2/metrics/OverallAreaMetric.java b/com/sun/electric/tool/placement/forceDirected2/metrics/OverallAreaMetric.java
index fc0c449..5cd0391 100644
--- a/com/sun/electric/tool/placement/forceDirected2/metrics/OverallAreaMetric.java
+++ b/com/sun/electric/tool/placement/forceDirected2/metrics/OverallAreaMetric.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/utils/GlobalVars.java b/com/sun/electric/tool/placement/forceDirected2/utils/GlobalVars.java
index 6df2e3a..47861e7 100644
--- a/com/sun/electric/tool/placement/forceDirected2/utils/GlobalVars.java
+++ b/com/sun/electric/tool/placement/forceDirected2/utils/GlobalVars.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/utils/PlacementProperties.java b/com/sun/electric/tool/placement/forceDirected2/utils/PlacementProperties.java
index 6be7983..cbf1222 100644
--- a/com/sun/electric/tool/placement/forceDirected2/utils/PlacementProperties.java
+++ b/com/sun/electric/tool/placement/forceDirected2/utils/PlacementProperties.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/CircularArray.java b/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/CircularArray.java
index 203e442..b0ec283 100644
--- a/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/CircularArray.java
+++ b/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/CircularArray.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/DEQueue.java b/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/DEQueue.java
index 899971b..9c0ab2a 100644
--- a/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/DEQueue.java
+++ b/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/DEQueue.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/EmptyException.java b/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/EmptyException.java
index b5cf575..3826bdd 100644
--- a/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/EmptyException.java
+++ b/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/EmptyException.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/IDEStructure.java b/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/IDEStructure.java
index 6e0d92a..d78f203 100644
--- a/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/IDEStructure.java
+++ b/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/IDEStructure.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/IStructure.java b/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/IStructure.java
index 1ebd5e8..65b45ab 100644
--- a/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/IStructure.java
+++ b/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/IStructure.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/LockFreeQueue.java b/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/LockFreeQueue.java
index 27a58e8..aa9159f 100644
--- a/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/LockFreeQueue.java
+++ b/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/LockFreeQueue.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/Stage.java b/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/Stage.java
index cfbeac1..d360136 100644
--- a/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/Stage.java
+++ b/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/Stage.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/StageWorker.java b/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/StageWorker.java
index 2cd3124..af66808 100644
--- a/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/StageWorker.java
+++ b/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/StageWorker.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/ThreadID.java b/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/ThreadID.java
index e0f3390..7642133 100644
--- a/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/ThreadID.java
+++ b/com/sun/electric/tool/placement/forceDirected2/utils/concurrent/ThreadID.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/utils/output/DebugMessageHandler.java b/com/sun/electric/tool/placement/forceDirected2/utils/output/DebugMessageHandler.java
index 7eb2328..9457968 100644
--- a/com/sun/electric/tool/placement/forceDirected2/utils/output/DebugMessageHandler.java
+++ b/com/sun/electric/tool/placement/forceDirected2/utils/output/DebugMessageHandler.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/utils/output/GenerateCSV.java b/com/sun/electric/tool/placement/forceDirected2/utils/output/GenerateCSV.java
index 731754e..3933cf2 100644
--- a/com/sun/electric/tool/placement/forceDirected2/utils/output/GenerateCSV.java
+++ b/com/sun/electric/tool/placement/forceDirected2/utils/output/GenerateCSV.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/forceDirected2/utils/output/PNGOutput.java b/com/sun/electric/tool/placement/forceDirected2/utils/output/PNGOutput.java
index b18a0ee..e157a93 100644
--- a/com/sun/electric/tool/placement/forceDirected2/utils/output/PNGOutput.java
+++ b/com/sun/electric/tool/placement/forceDirected2/utils/output/PNGOutput.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/general/BottomUpPartition.java b/com/sun/electric/tool/placement/general/BottomUpPartition.java
index 8e925fd..f723a94 100644
--- a/com/sun/electric/tool/placement/general/BottomUpPartition.java
+++ b/com/sun/electric/tool/placement/general/BottomUpPartition.java
@@ -5,7 +5,7 @@
* File: BottomUpPartition.java
* Written by Steven M. Rubin
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/general/BottomUpPlace.java b/com/sun/electric/tool/placement/general/BottomUpPlace.java
index 3c3f404..ca764b6 100644
--- a/com/sun/electric/tool/placement/general/BottomUpPlace.java
+++ b/com/sun/electric/tool/placement/general/BottomUpPlace.java
@@ -5,7 +5,7 @@
* File: BottomUpPlace.java
* Written by Steven M. Rubin
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/general/Control.java b/com/sun/electric/tool/placement/general/Control.java
index 5bb4991..f42b559 100644
--- a/com/sun/electric/tool/placement/general/Control.java
+++ b/com/sun/electric/tool/placement/general/Control.java
@@ -5,7 +5,7 @@
* File: Control.java
* Written by Steven M. Rubin
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/general/FDIrregular.java b/com/sun/electric/tool/placement/general/FDIrregular.java
index 9974615..8848bda 100644
--- a/com/sun/electric/tool/placement/general/FDIrregular.java
+++ b/com/sun/electric/tool/placement/general/FDIrregular.java
@@ -5,7 +5,7 @@
* File: FDIrregular.java
* Written by Steven M. Rubin
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/general/FDRowCol.java b/com/sun/electric/tool/placement/general/FDRowCol.java
index a286b34..177481f 100644
--- a/com/sun/electric/tool/placement/general/FDRowCol.java
+++ b/com/sun/electric/tool/placement/general/FDRowCol.java
@@ -5,7 +5,7 @@
* File: FDRowCol.java
* Written by Steven M. Rubin
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/general/FindEmptyRects.java b/com/sun/electric/tool/placement/general/FindEmptyRects.java
index d5f9be9..92d2423 100644
--- a/com/sun/electric/tool/placement/general/FindEmptyRects.java
+++ b/com/sun/electric/tool/placement/general/FindEmptyRects.java
@@ -5,7 +5,7 @@
* File: FindEmptyRects.java
* Written by Steven M. Rubin
*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/general/RowCol.java b/com/sun/electric/tool/placement/general/RowCol.java
index a26a554..407d01a 100644
--- a/com/sun/electric/tool/placement/general/RowCol.java
+++ b/com/sun/electric/tool/placement/general/RowCol.java
@@ -5,7 +5,7 @@
* File: RowCol.java
* Written by Steven M. Rubin
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/general/SARowCol.java b/com/sun/electric/tool/placement/general/SARowCol.java
index 4673659..5e7d5b3 100644
--- a/com/sun/electric/tool/placement/general/SARowCol.java
+++ b/com/sun/electric/tool/placement/general/SARowCol.java
@@ -5,7 +5,7 @@
* File: SARowCol.java
* Written by Steven M. Rubin
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic1/Chromosome.java b/com/sun/electric/tool/placement/genetic1/Chromosome.java
index f626b2b..4ad1497 100644
--- a/com/sun/electric/tool/placement/genetic1/Chromosome.java
+++ b/com/sun/electric/tool/placement/genetic1/Chromosome.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic1/ChromosomeMutation.java b/com/sun/electric/tool/placement/genetic1/ChromosomeMutation.java
index 6abbd31..dd5c346 100644
--- a/com/sun/electric/tool/placement/genetic1/ChromosomeMutation.java
+++ b/com/sun/electric/tool/placement/genetic1/ChromosomeMutation.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic1/Crossover.java b/com/sun/electric/tool/placement/genetic1/Crossover.java
index 2d482dd..d01b3ba 100644
--- a/com/sun/electric/tool/placement/genetic1/Crossover.java
+++ b/com/sun/electric/tool/placement/genetic1/Crossover.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic1/GenePlacement.java b/com/sun/electric/tool/placement/genetic1/GenePlacement.java
index 88c1aa5..4c515cf 100644
--- a/com/sun/electric/tool/placement/genetic1/GenePlacement.java
+++ b/com/sun/electric/tool/placement/genetic1/GenePlacement.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic1/Metric.java b/com/sun/electric/tool/placement/genetic1/Metric.java
index 65d1a25..a51f593 100644
--- a/com/sun/electric/tool/placement/genetic1/Metric.java
+++ b/com/sun/electric/tool/placement/genetic1/Metric.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic1/Population.java b/com/sun/electric/tool/placement/genetic1/Population.java
index b1b891a..fef73d3 100644
--- a/com/sun/electric/tool/placement/genetic1/Population.java
+++ b/com/sun/electric/tool/placement/genetic1/Population.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic1/PopulationCreation.java b/com/sun/electric/tool/placement/genetic1/PopulationCreation.java
index 0b6d97b..a74a9c2 100644
--- a/com/sun/electric/tool/placement/genetic1/PopulationCreation.java
+++ b/com/sun/electric/tool/placement/genetic1/PopulationCreation.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic1/PopulationMutation.java b/com/sun/electric/tool/placement/genetic1/PopulationMutation.java
index 90a3474..441117a 100644
--- a/com/sun/electric/tool/placement/genetic1/PopulationMutation.java
+++ b/com/sun/electric/tool/placement/genetic1/PopulationMutation.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic1/Selection.java b/com/sun/electric/tool/placement/genetic1/Selection.java
index fc095ad..732bc45 100644
--- a/com/sun/electric/tool/placement/genetic1/Selection.java
+++ b/com/sun/electric/tool/placement/genetic1/Selection.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic1/g1/ChromosomeMutationPadding.java b/com/sun/electric/tool/placement/genetic1/g1/ChromosomeMutationPadding.java
index f140430..fb6e249 100644
--- a/com/sun/electric/tool/placement/genetic1/g1/ChromosomeMutationPadding.java
+++ b/com/sun/electric/tool/placement/genetic1/g1/ChromosomeMutationPadding.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic1/g1/ChromsomeMutationMoveCells.java b/com/sun/electric/tool/placement/genetic1/g1/ChromsomeMutationMoveCells.java
index f7fa035..7fe1b7d 100644
--- a/com/sun/electric/tool/placement/genetic1/g1/ChromsomeMutationMoveCells.java
+++ b/com/sun/electric/tool/placement/genetic1/g1/ChromsomeMutationMoveCells.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic1/g1/ChromsomeMutationRotateCells.java b/com/sun/electric/tool/placement/genetic1/g1/ChromsomeMutationRotateCells.java
index 02f2d0f..07380f5 100644
--- a/com/sun/electric/tool/placement/genetic1/g1/ChromsomeMutationRotateCells.java
+++ b/com/sun/electric/tool/placement/genetic1/g1/ChromsomeMutationRotateCells.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic1/g1/ChromsomeMutationSwapCells.java b/com/sun/electric/tool/placement/genetic1/g1/ChromsomeMutationSwapCells.java
index d37c966..6400909 100644
--- a/com/sun/electric/tool/placement/genetic1/g1/ChromsomeMutationSwapCells.java
+++ b/com/sun/electric/tool/placement/genetic1/g1/ChromsomeMutationSwapCells.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic1/g1/CycleCrossoverFavoringStrongParents.java b/com/sun/electric/tool/placement/genetic1/g1/CycleCrossoverFavoringStrongParents.java
index b9087b4..104853d 100644
--- a/com/sun/electric/tool/placement/genetic1/g1/CycleCrossoverFavoringStrongParents.java
+++ b/com/sun/electric/tool/placement/genetic1/g1/CycleCrossoverFavoringStrongParents.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic1/g1/GenePlacementLeftRightAlignedDrop.java b/com/sun/electric/tool/placement/genetic1/g1/GenePlacementLeftRightAlignedDrop.java
index bd9653f..9ca097c 100644
--- a/com/sun/electric/tool/placement/genetic1/g1/GenePlacementLeftRightAlignedDrop.java
+++ b/com/sun/electric/tool/placement/genetic1/g1/GenePlacementLeftRightAlignedDrop.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic1/g1/GeneticPlacement.java b/com/sun/electric/tool/placement/genetic1/g1/GeneticPlacement.java
index 8aba9f4..6ade749 100644
--- a/com/sun/electric/tool/placement/genetic1/g1/GeneticPlacement.java
+++ b/com/sun/electric/tool/placement/genetic1/g1/GeneticPlacement.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic1/g1/MetricBoundingBox3.java b/com/sun/electric/tool/placement/genetic1/g1/MetricBoundingBox3.java
index 603aa71..ff464a2 100644
--- a/com/sun/electric/tool/placement/genetic1/g1/MetricBoundingBox3.java
+++ b/com/sun/electric/tool/placement/genetic1/g1/MetricBoundingBox3.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic1/g1/PlacementNodeProxy.java b/com/sun/electric/tool/placement/genetic1/g1/PlacementNodeProxy.java
index 3690ad2..676ebe0 100644
--- a/com/sun/electric/tool/placement/genetic1/g1/PlacementNodeProxy.java
+++ b/com/sun/electric/tool/placement/genetic1/g1/PlacementNodeProxy.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic1/g1/PopulationCreationRandomWithPlaceHolder2.java b/com/sun/electric/tool/placement/genetic1/g1/PopulationCreationRandomWithPlaceHolder2.java
index 0935890..6e157f6 100644
--- a/com/sun/electric/tool/placement/genetic1/g1/PopulationCreationRandomWithPlaceHolder2.java
+++ b/com/sun/electric/tool/placement/genetic1/g1/PopulationCreationRandomWithPlaceHolder2.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic1/g1/PopulationMutation2.java b/com/sun/electric/tool/placement/genetic1/g1/PopulationMutation2.java
index c4b3f58..de298fd 100644
--- a/com/sun/electric/tool/placement/genetic1/g1/PopulationMutation2.java
+++ b/com/sun/electric/tool/placement/genetic1/g1/PopulationMutation2.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic1/g1/SelectionTournament.java b/com/sun/electric/tool/placement/genetic1/g1/SelectionTournament.java
index cf27c1e..dba0d11 100644
--- a/com/sun/electric/tool/placement/genetic1/g1/SelectionTournament.java
+++ b/com/sun/electric/tool/placement/genetic1/g1/SelectionTournament.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic1/g1/SubPopulationProcessing.java b/com/sun/electric/tool/placement/genetic1/g1/SubPopulationProcessing.java
index 821ec38..e1a46dc 100644
--- a/com/sun/electric/tool/placement/genetic1/g1/SubPopulationProcessing.java
+++ b/com/sun/electric/tool/placement/genetic1/g1/SubPopulationProcessing.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic2/Block.java b/com/sun/electric/tool/placement/genetic2/Block.java
index 96edad8..a96c579 100644
--- a/com/sun/electric/tool/placement/genetic2/Block.java
+++ b/com/sun/electric/tool/placement/genetic2/Block.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic2/ClassicIndividual.java b/com/sun/electric/tool/placement/genetic2/ClassicIndividual.java
index 77c1fed..83e5592 100644
--- a/com/sun/electric/tool/placement/genetic2/ClassicIndividual.java
+++ b/com/sun/electric/tool/placement/genetic2/ClassicIndividual.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic2/DeltaIndividual.java b/com/sun/electric/tool/placement/genetic2/DeltaIndividual.java
index f5b875b..efaa226 100644
--- a/com/sun/electric/tool/placement/genetic2/DeltaIndividual.java
+++ b/com/sun/electric/tool/placement/genetic2/DeltaIndividual.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic2/Evolver.java b/com/sun/electric/tool/placement/genetic2/Evolver.java
index 31975b4..e083f1d 100644
--- a/com/sun/electric/tool/placement/genetic2/Evolver.java
+++ b/com/sun/electric/tool/placement/genetic2/Evolver.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic2/GeneticPlacer.java b/com/sun/electric/tool/placement/genetic2/GeneticPlacer.java
index 4c90bc8..cd162ac 100644
--- a/com/sun/electric/tool/placement/genetic2/GeneticPlacer.java
+++ b/com/sun/electric/tool/placement/genetic2/GeneticPlacer.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic2/Individual.java b/com/sun/electric/tool/placement/genetic2/Individual.java
index 073f2af..d441ebc 100644
--- a/com/sun/electric/tool/placement/genetic2/Individual.java
+++ b/com/sun/electric/tool/placement/genetic2/Individual.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic2/PlacementGenetic.java b/com/sun/electric/tool/placement/genetic2/PlacementGenetic.java
index 95e28f5..f5003ff 100644
--- a/com/sun/electric/tool/placement/genetic2/PlacementGenetic.java
+++ b/com/sun/electric/tool/placement/genetic2/PlacementGenetic.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic2/Population.java b/com/sun/electric/tool/placement/genetic2/Population.java
index 3e9b210..0c031d4 100644
--- a/com/sun/electric/tool/placement/genetic2/Population.java
+++ b/com/sun/electric/tool/placement/genetic2/Population.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic2/Reference.java b/com/sun/electric/tool/placement/genetic2/Reference.java
index 3be24a7..bcb1c1b 100644
--- a/com/sun/electric/tool/placement/genetic2/Reference.java
+++ b/com/sun/electric/tool/placement/genetic2/Reference.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic2/SimulatedAnnealing.java b/com/sun/electric/tool/placement/genetic2/SimulatedAnnealing.java
index 3b793f0..2d06637 100644
--- a/com/sun/electric/tool/placement/genetic2/SimulatedAnnealing.java
+++ b/com/sun/electric/tool/placement/genetic2/SimulatedAnnealing.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic2/UnifiedPopulation.java b/com/sun/electric/tool/placement/genetic2/UnifiedPopulation.java
index b41717d..38e6768 100644
--- a/com/sun/electric/tool/placement/genetic2/UnifiedPopulation.java
+++ b/com/sun/electric/tool/placement/genetic2/UnifiedPopulation.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic2/UniformGrid.java b/com/sun/electric/tool/placement/genetic2/UniformGrid.java
index 5f95072..3a634e2 100644
--- a/com/sun/electric/tool/placement/genetic2/UniformGrid.java
+++ b/com/sun/electric/tool/placement/genetic2/UniformGrid.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic2/metrics/BBMetric.java b/com/sun/electric/tool/placement/genetic2/metrics/BBMetric.java
index 86b034e..bea9741 100644
--- a/com/sun/electric/tool/placement/genetic2/metrics/BBMetric.java
+++ b/com/sun/electric/tool/placement/genetic2/metrics/BBMetric.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic2/metrics/BBThread.java b/com/sun/electric/tool/placement/genetic2/metrics/BBThread.java
index 0f50226..acaf595 100644
--- a/com/sun/electric/tool/placement/genetic2/metrics/BBThread.java
+++ b/com/sun/electric/tool/placement/genetic2/metrics/BBThread.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/genetic2/metrics/DeltaBBMetric.java b/com/sun/electric/tool/placement/genetic2/metrics/DeltaBBMetric.java
index dc550d8..18f8f76 100644
--- a/com/sun/electric/tool/placement/genetic2/metrics/DeltaBBMetric.java
+++ b/com/sun/electric/tool/placement/genetic2/metrics/DeltaBBMetric.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/metrics/AbstractMetric.java b/com/sun/electric/tool/placement/metrics/AbstractMetric.java
index 76b42a9..bf420f9 100644
--- a/com/sun/electric/tool/placement/metrics/AbstractMetric.java
+++ b/com/sun/electric/tool/placement/metrics/AbstractMetric.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/metrics/AbstractMetricGeneric.java b/com/sun/electric/tool/placement/metrics/AbstractMetricGeneric.java
index fa9ce41..bfafecd 100644
--- a/com/sun/electric/tool/placement/metrics/AbstractMetricGeneric.java
+++ b/com/sun/electric/tool/placement/metrics/AbstractMetricGeneric.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/metrics/boundingbox/BBMetric.java b/com/sun/electric/tool/placement/metrics/boundingbox/BBMetric.java
index 5975457..18857b2 100644
--- a/com/sun/electric/tool/placement/metrics/boundingbox/BBMetric.java
+++ b/com/sun/electric/tool/placement/metrics/boundingbox/BBMetric.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/metrics/boundingbox/BBMetricParallel.java b/com/sun/electric/tool/placement/metrics/boundingbox/BBMetricParallel.java
index 17de1b9..4ab2ea0 100644
--- a/com/sun/electric/tool/placement/metrics/boundingbox/BBMetricParallel.java
+++ b/com/sun/electric/tool/placement/metrics/boundingbox/BBMetricParallel.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/metrics/boundingbox/BBMetricTask.java b/com/sun/electric/tool/placement/metrics/boundingbox/BBMetricTask.java
index 0252111..0650918 100644
--- a/com/sun/electric/tool/placement/metrics/boundingbox/BBMetricTask.java
+++ b/com/sun/electric/tool/placement/metrics/boundingbox/BBMetricTask.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/metrics/mst/MSTMetric.java b/com/sun/electric/tool/placement/metrics/mst/MSTMetric.java
index c867235..1dda185 100644
--- a/com/sun/electric/tool/placement/metrics/mst/MSTMetric.java
+++ b/com/sun/electric/tool/placement/metrics/mst/MSTMetric.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -162,7 +162,7 @@ public class MSTMetric extends AbstractMetric {
/**
*
* @param net
- * @return
+ * @return the metric.
*/
private double compute(PlacementNetwork net) {
@@ -194,7 +194,7 @@ public class MSTMetric extends AbstractMetric {
*
* @param port1
* @param port2
- * @return
+ * @return the distance between ports.
*/
private double getDistance(PlacementPort port1, PlacementPort port2) {
double deltaX = this.getPlacementX(port1) - this.getPlacementX(port2);
diff --git a/com/sun/electric/tool/placement/metrics/mst/MSTMetricParallel.java b/com/sun/electric/tool/placement/metrics/mst/MSTMetricParallel.java
index 1ae3cee..76141b4 100644
--- a/com/sun/electric/tool/placement/metrics/mst/MSTMetricParallel.java
+++ b/com/sun/electric/tool/placement/metrics/mst/MSTMetricParallel.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/metrics/mst/MSTMetricTask.java b/com/sun/electric/tool/placement/metrics/mst/MSTMetricTask.java
index 7a2e3a9..71d1857 100644
--- a/com/sun/electric/tool/placement/metrics/mst/MSTMetricTask.java
+++ b/com/sun/electric/tool/placement/metrics/mst/MSTMetricTask.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -155,7 +155,7 @@ public class MSTMetricTask extends PReduceTask<Double, BlockedRange1D> {
/**
*
* @param net
- * @return
+ * @return the metric.
*/
private double compute(PlacementNetwork net) {
@@ -188,7 +188,7 @@ public class MSTMetricTask extends PReduceTask<Double, BlockedRange1D> {
*
* @param port1
* @param port2
- * @return
+ * @return the distance between ports.
*/
private double getDistance(PlacementPort port1, PlacementPort port2) {
double deltaX = this.getPlacementX(port1) - this.getPlacementX(port2);
diff --git a/com/sun/electric/tool/placement/simulatedAnnealing1/SA_Test.java b/com/sun/electric/tool/placement/simulatedAnnealing1/SA_Test.java
index 6601652..dd2b96e 100644
--- a/com/sun/electric/tool/placement/simulatedAnnealing1/SA_Test.java
+++ b/com/sun/electric/tool/placement/simulatedAnnealing1/SA_Test.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/simulatedAnnealing1/SimulatedAnnealing.java b/com/sun/electric/tool/placement/simulatedAnnealing1/SimulatedAnnealing.java
index 92d3124..c0bb1c5 100644
--- a/com/sun/electric/tool/placement/simulatedAnnealing1/SimulatedAnnealing.java
+++ b/com/sun/electric/tool/placement/simulatedAnnealing1/SimulatedAnnealing.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/simulatedAnnealing1/metrics/AOMetric.java b/com/sun/electric/tool/placement/simulatedAnnealing1/metrics/AOMetric.java
index c9dd913..37e671a 100644
--- a/com/sun/electric/tool/placement/simulatedAnnealing1/metrics/AOMetric.java
+++ b/com/sun/electric/tool/placement/simulatedAnnealing1/metrics/AOMetric.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/simulatedAnnealing1/metrics/AbstractMetric.java b/com/sun/electric/tool/placement/simulatedAnnealing1/metrics/AbstractMetric.java
index e1e5e4d..96c7e76 100644
--- a/com/sun/electric/tool/placement/simulatedAnnealing1/metrics/AbstractMetric.java
+++ b/com/sun/electric/tool/placement/simulatedAnnealing1/metrics/AbstractMetric.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/simulatedAnnealing1/metrics/AreaOverlapMetric.java b/com/sun/electric/tool/placement/simulatedAnnealing1/metrics/AreaOverlapMetric.java
index 618beec..7ce4df0 100644
--- a/com/sun/electric/tool/placement/simulatedAnnealing1/metrics/AreaOverlapMetric.java
+++ b/com/sun/electric/tool/placement/simulatedAnnealing1/metrics/AreaOverlapMetric.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/simulatedAnnealing1/metrics/BBMetric.java b/com/sun/electric/tool/placement/simulatedAnnealing1/metrics/BBMetric.java
index 868db6a..3c48ea2 100644
--- a/com/sun/electric/tool/placement/simulatedAnnealing1/metrics/BBMetric.java
+++ b/com/sun/electric/tool/placement/simulatedAnnealing1/metrics/BBMetric.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/simulatedAnnealing1/metrics/BoundingBoxMetric.java b/com/sun/electric/tool/placement/simulatedAnnealing1/metrics/BoundingBoxMetric.java
index 7c28dd0..1317acd 100644
--- a/com/sun/electric/tool/placement/simulatedAnnealing1/metrics/BoundingBoxMetric.java
+++ b/com/sun/electric/tool/placement/simulatedAnnealing1/metrics/BoundingBoxMetric.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/simulatedAnnealing1/metrics/MSTMetric.java b/com/sun/electric/tool/placement/simulatedAnnealing1/metrics/MSTMetric.java
index 85a3a8e..f9b3b9a 100644
--- a/com/sun/electric/tool/placement/simulatedAnnealing1/metrics/MSTMetric.java
+++ b/com/sun/electric/tool/placement/simulatedAnnealing1/metrics/MSTMetric.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/simulatedAnnealing2/BoundingBoxMetric.java b/com/sun/electric/tool/placement/simulatedAnnealing2/BoundingBoxMetric.java
index 7ef6a46..5206846 100644
--- a/com/sun/electric/tool/placement/simulatedAnnealing2/BoundingBoxMetric.java
+++ b/com/sun/electric/tool/placement/simulatedAnnealing2/BoundingBoxMetric.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/simulatedAnnealing2/MSTMetric.java b/com/sun/electric/tool/placement/simulatedAnnealing2/MSTMetric.java
index f341b61..2056c71 100644
--- a/com/sun/electric/tool/placement/simulatedAnnealing2/MSTMetric.java
+++ b/com/sun/electric/tool/placement/simulatedAnnealing2/MSTMetric.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/simulatedAnnealing2/Metric.java b/com/sun/electric/tool/placement/simulatedAnnealing2/Metric.java
index 0f61493..77a01f4 100644
--- a/com/sun/electric/tool/placement/simulatedAnnealing2/Metric.java
+++ b/com/sun/electric/tool/placement/simulatedAnnealing2/Metric.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/simulatedAnnealing2/PlacementSimulatedAnnealing.java b/com/sun/electric/tool/placement/simulatedAnnealing2/PlacementSimulatedAnnealing.java
index 6660ebc..98e40e9 100644
--- a/com/sun/electric/tool/placement/simulatedAnnealing2/PlacementSimulatedAnnealing.java
+++ b/com/sun/electric/tool/placement/simulatedAnnealing2/PlacementSimulatedAnnealing.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -320,7 +320,7 @@ public class PlacementSimulatedAnnealing extends PlacementFrame {
* Method that calculates how many moves per temperature step are necessary
*
* @param nodes
- * @return
+ * @return the number of moves.
*/
private int getDesiredMoves(List<PlacementNode> nodes) {
// TODO THIS IS TWEAKING DATA
@@ -331,7 +331,7 @@ public class PlacementSimulatedAnnealing extends PlacementFrame {
* Method that estimates how many moves can be evaluated with the current
* settings
*
- * @return
+ * @return the time per move
*/
private double guessMillisecondsPerMove() {
double time = System.currentTimeMillis();
@@ -544,7 +544,7 @@ public class PlacementSimulatedAnnealing extends PlacementFrame {
* no use in moving nodes "miles" away ...
*
* @param nodesToPlace
- * @return
+ * @return the maximum length
*/
private double getMaxChipLength(List<PlacementNode> nodesToPlace) {
double totalArea = 0;
diff --git a/com/sun/electric/tool/placement/simulatedAnnealing2/PositionIndex.java b/com/sun/electric/tool/placement/simulatedAnnealing2/PositionIndex.java
index 384423f..7dfc7a9 100644
--- a/com/sun/electric/tool/placement/simulatedAnnealing2/PositionIndex.java
+++ b/com/sun/electric/tool/placement/simulatedAnnealing2/PositionIndex.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/placement/simulatedAnnealing2/ProxyNode.java b/com/sun/electric/tool/placement/simulatedAnnealing2/ProxyNode.java
index 4381295..f68c912 100644
--- a/com/sun/electric/tool/placement/simulatedAnnealing2/ProxyNode.java
+++ b/com/sun/electric/tool/placement/simulatedAnnealing2/ProxyNode.java
@@ -9,7 +9,7 @@
* as part of the course "Multicore Programming in Practice: Tools, Models, and Languages".
* Contact instructor: Dr. Victor Pankratius (pankratius at ipd.uka.de)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/project/AddCellJob.java b/com/sun/electric/tool/project/AddCellJob.java
index a7d6a2f..5dead41 100644
--- a/com/sun/electric/tool/project/AddCellJob.java
+++ b/com/sun/electric/tool/project/AddCellJob.java
@@ -6,7 +6,7 @@
* Project management tool: Add a cell to the Project Management repository
* Written by: Steven M. Rubin
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/project/AddLibraryJob.java b/com/sun/electric/tool/project/AddLibraryJob.java
index 041fe51..1e25195 100644
--- a/com/sun/electric/tool/project/AddLibraryJob.java
+++ b/com/sun/electric/tool/project/AddLibraryJob.java
@@ -6,7 +6,7 @@
* Project management tool: Add a library to the Project Management repository
* Written by: Steven M. Rubin
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/project/CancelCheckOutJob.java b/com/sun/electric/tool/project/CancelCheckOutJob.java
index 3fa44d5..9f4489b 100644
--- a/com/sun/electric/tool/project/CancelCheckOutJob.java
+++ b/com/sun/electric/tool/project/CancelCheckOutJob.java
@@ -6,7 +6,7 @@
* Project management tool: Cancel the checkout of a cell
* Written by: Steven M. Rubin
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/project/CheckInJob.java b/com/sun/electric/tool/project/CheckInJob.java
index adf5f44..7f12a82 100644
--- a/com/sun/electric/tool/project/CheckInJob.java
+++ b/com/sun/electric/tool/project/CheckInJob.java
@@ -6,7 +6,7 @@
* Project management tool: check a cell into the repository
* Written by: Steven M. Rubin
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/project/CheckOutJob.java b/com/sun/electric/tool/project/CheckOutJob.java
index 63f9a0c..bd19018 100644
--- a/com/sun/electric/tool/project/CheckOutJob.java
+++ b/com/sun/electric/tool/project/CheckOutJob.java
@@ -6,7 +6,7 @@
* Project management tool
* Written by: Steven M. Rubin
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/project/DeleteCellJob.java b/com/sun/electric/tool/project/DeleteCellJob.java
index 225a454..a36b3cb 100644
--- a/com/sun/electric/tool/project/DeleteCellJob.java
+++ b/com/sun/electric/tool/project/DeleteCellJob.java
@@ -6,7 +6,7 @@
* Project management tool: Delete a cell from the Project Management repository
* Written by: Steven M. Rubin
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/project/DisplayedCells.java b/com/sun/electric/tool/project/DisplayedCells.java
index d3db71d..368587f 100644
--- a/com/sun/electric/tool/project/DisplayedCells.java
+++ b/com/sun/electric/tool/project/DisplayedCells.java
@@ -6,7 +6,7 @@
* Project management tool
* Written by: Steven M. Rubin
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/project/HistoryDialog.java b/com/sun/electric/tool/project/HistoryDialog.java
index f4a8dd4..152c657 100644
--- a/com/sun/electric/tool/project/HistoryDialog.java
+++ b/com/sun/electric/tool/project/HistoryDialog.java
@@ -6,7 +6,7 @@
* Project management tool: cell history dialog
* Written by: Steven M. Rubin
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/project/LibraryDialog.java b/com/sun/electric/tool/project/LibraryDialog.java
index 31b1931..47037e3 100644
--- a/com/sun/electric/tool/project/LibraryDialog.java
+++ b/com/sun/electric/tool/project/LibraryDialog.java
@@ -6,7 +6,7 @@
* Project management tool
* Written by: Steven M. Rubin
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/project/Project.java b/com/sun/electric/tool/project/Project.java
index 9f37521..107350e 100644
--- a/com/sun/electric/tool/project/Project.java
+++ b/com/sun/electric/tool/project/Project.java
@@ -6,7 +6,7 @@
* Project management tool
* Written by: Steven M. Rubin
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/project/ProjectCell.java b/com/sun/electric/tool/project/ProjectCell.java
index 2c190cc..ecdd478 100644
--- a/com/sun/electric/tool/project/ProjectCell.java
+++ b/com/sun/electric/tool/project/ProjectCell.java
@@ -6,7 +6,7 @@
* Project management tool: cell information
* Written by: Steven M. Rubin
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/project/ProjectDB.java b/com/sun/electric/tool/project/ProjectDB.java
index c102992..80b4045 100644
--- a/com/sun/electric/tool/project/ProjectDB.java
+++ b/com/sun/electric/tool/project/ProjectDB.java
@@ -6,7 +6,7 @@
* Project management tool database
* Written by: Steven M. Rubin
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/project/ProjectLibrary.java b/com/sun/electric/tool/project/ProjectLibrary.java
index f6a7cd5..e5a12fb 100644
--- a/com/sun/electric/tool/project/ProjectLibrary.java
+++ b/com/sun/electric/tool/project/ProjectLibrary.java
@@ -6,7 +6,7 @@
* Project management tool: library information
* Written by: Steven M. Rubin
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/project/UpdateJob.java b/com/sun/electric/tool/project/UpdateJob.java
index 038511a..08dd02e 100644
--- a/com/sun/electric/tool/project/UpdateJob.java
+++ b/com/sun/electric/tool/project/UpdateJob.java
@@ -6,7 +6,7 @@
* Project management tool: update libraries from the repository
* Written by: Steven M. Rubin
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/project/Users.java b/com/sun/electric/tool/project/Users.java
index 27910fa..10a5b2e 100644
--- a/com/sun/electric/tool/project/Users.java
+++ b/com/sun/electric/tool/project/Users.java
@@ -6,7 +6,7 @@
* Project management tool: user management
* Written by: Steven M. Rubin
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/AutoStitch.java b/com/sun/electric/tool/routing/AutoStitch.java
index 00d959f..c59bf83 100644
--- a/com/sun/electric/tool/routing/AutoStitch.java
+++ b/com/sun/electric/tool/routing/AutoStitch.java
@@ -4,9 +4,9 @@
*
* File: AutoStitch.java
* Routing tool: Auto-Stitcher (places wires where geometry touches).
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/ClockRouter.java b/com/sun/electric/tool/routing/ClockRouter.java
index c270ac0..de28535 100644
--- a/com/sun/electric/tool/routing/ClockRouter.java
+++ b/com/sun/electric/tool/routing/ClockRouter.java
@@ -4,7 +4,7 @@
*
* File: ClockRouter.java
*
- * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/InteractiveRouter.java b/com/sun/electric/tool/routing/InteractiveRouter.java
index 407a918..f7ca534 100644
--- a/com/sun/electric/tool/routing/InteractiveRouter.java
+++ b/com/sun/electric/tool/routing/InteractiveRouter.java
@@ -4,7 +4,7 @@
*
* File: InteractiveRouter.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/Maze.java b/com/sun/electric/tool/routing/Maze.java
index c28e3f9..8a6558f 100644
--- a/com/sun/electric/tool/routing/Maze.java
+++ b/com/sun/electric/tool/routing/Maze.java
@@ -5,9 +5,9 @@
* File: Maze.java
* Routing tool: Maze routing
* Original C Code written by Glen M. Lawson
- * Translated to Java by Steven M. Rubin, Sun Microsystems.
+ * Translated to Java by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/MimicStitch.java b/com/sun/electric/tool/routing/MimicStitch.java
index 6e6fc6f..0270221 100644
--- a/com/sun/electric/tool/routing/MimicStitch.java
+++ b/com/sun/electric/tool/routing/MimicStitch.java
@@ -4,9 +4,9 @@
*
* File: MimicStitch.java
* Routing tool: Mimic Stitcher (duplicates user's routes elsewhere in the cell).
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/River.java b/com/sun/electric/tool/routing/River.java
index a79d0ce..4a150af 100644
--- a/com/sun/electric/tool/routing/River.java
+++ b/com/sun/electric/tool/routing/River.java
@@ -5,9 +5,9 @@
* File: River.java
* Routing tool: River Routing (busses).
* Original C Code written by Telle Whitney, Schlumberger Palo Alto Research
- * Translated to Java by Steven M. Rubin, Sun Microsystems.
+ * Translated to Java by Steven M. Rubin.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/Route.java b/com/sun/electric/tool/routing/Route.java
index 85d3a87..fad4934 100644
--- a/com/sun/electric/tool/routing/Route.java
+++ b/com/sun/electric/tool/routing/Route.java
@@ -4,7 +4,7 @@
*
* File: Route.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/RouteElement.java b/com/sun/electric/tool/routing/RouteElement.java
index cda0388..5775833 100644
--- a/com/sun/electric/tool/routing/RouteElement.java
+++ b/com/sun/electric/tool/routing/RouteElement.java
@@ -4,7 +4,7 @@
*
* File: RouteElement.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/RouteElementArc.java b/com/sun/electric/tool/routing/RouteElementArc.java
index f91fffc..d347f30 100644
--- a/com/sun/electric/tool/routing/RouteElementArc.java
+++ b/com/sun/electric/tool/routing/RouteElementArc.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: RouteElementArc.java
- * Written by: Jonathan Gainsley, Sun Microsystems.
+ * Written by: Jonathan Gainsley.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/RouteElementPort.java b/com/sun/electric/tool/routing/RouteElementPort.java
index f5e8815..3999389 100644
--- a/com/sun/electric/tool/routing/RouteElementPort.java
+++ b/com/sun/electric/tool/routing/RouteElementPort.java
@@ -4,7 +4,7 @@
*
* File: RouteElementPort.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/Router.java b/com/sun/electric/tool/routing/Router.java
index 91ffa7b..27eae58 100644
--- a/com/sun/electric/tool/routing/Router.java
+++ b/com/sun/electric/tool/routing/Router.java
@@ -4,7 +4,7 @@
*
* File: Router.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/Routing.java b/com/sun/electric/tool/routing/Routing.java
index ca1ad6b..26e91af 100644
--- a/com/sun/electric/tool/routing/Routing.java
+++ b/com/sun/electric/tool/routing/Routing.java
@@ -4,7 +4,7 @@
*
* File: Routing.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -1754,6 +1754,56 @@ public class Routing extends Listener {
*/
public static boolean isFactorySeaOfGatesRunOnConnectedRoutes() { return cacheSOGRunOnConnectedRoutes.getBooleanFactoryValue(); }
+ private static Pref cacheSOGNetOrder = Pref.makeIntPref("SeaOfGatesNetOrder", Routing.getRoutingTool().prefs, SoGNetOrder.SOGNETORDERORIGINAL.getValue());
+
+ /**
+ * Method to tell the "sea-of-gates" router how to sort the nets to route.
+ * @return value associated to the different SoGNetOrder modes: (1) order provided by user (SOGNETORDERGIVEN, default),
+ * (2) descending order given by arc lengths and (3) ascending order given by arc lengths.
+ */
+ public static SoGNetOrder getSeaOfGatesNetOrder() { return SoGNetOrder.findByValue(cacheSOGNetOrder.getInt()); }
+
+ /**
+ * Method to set the "sea-of-gates" router how to sort the nets to route.
+ * (1) order provided by user (SOGNETORDERGIVEN, default),
+ * (2) descending order given by arc lengths and (3) ascending order given by arc lengths.
+ */
+ public static void setSeaOfGatesNetOrder(SoGNetOrder p) { cacheSOGNetOrder.setInt(p.getValue()); }
+
+ /**
+ * Method to tell the "sea-of-gates" router how to sort the nets to route, by default
+ * @return value associated to the different SoGNetOrder modes: (1) order provided by user (SOGNETORDERORIGINAL, default),
+ * (2) descending order given by arc lengths and (3) ascending order given by arc lengths.
+ */
+ public static SoGNetOrder getFactorySeaOfGatesNetOrder() { return SoGNetOrder.findByValue(cacheSOGNetOrder.getIntFactoryValue()); }
+
+ public enum SoGNetOrder {
+ SOGNETORDERDESCENDING(1), // Sorting nets in descending length order -> longest first
+ SOGNETORDERASCENDING(2), // Sorting nets in ascending length order -> shortest first
+ SOGNETORDERGIVEN(3), // Given by user/file
+ SOGNETORDERBUS(4), // Route busses first
+ SOGNETORDERPERCENTAGE(5), // Idea that X% of shortest, Y% largest and the (1-X-Y) at the end.
+ SOGNETORDERORIGINAL(0); // String sorting on net Network/RouteBatch comparators. Original code
+
+ private int value = -1;
+
+ SoGNetOrder(int val)
+ {
+ value = val; // level
+ }
+
+ int getValue() {return value;}
+ public static SoGNetOrder findByValue(int level)
+ {
+ for (SoGNetOrder s : SoGNetOrder.values())
+ {
+ if (s.getValue() == level) return s;
+ }
+ assert(false); // should never reach this code.
+ return null;
+ }
+ }
+
public enum SoGContactsStrategy {
SOGCONTACTSATTOPLEVEL (0, "Contacts at top level"),
SOGCONTACTSUSEEXISTINGSUBCELLS(1, "Contacts use existing subcells or place at top"),
diff --git a/com/sun/electric/tool/routing/RoutingFrame.java b/com/sun/electric/tool/routing/RoutingFrame.java
index 8333410..410381a 100644
--- a/com/sun/electric/tool/routing/RoutingFrame.java
+++ b/com/sun/electric/tool/routing/RoutingFrame.java
@@ -4,7 +4,7 @@
*
* File: RoutingFrame.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/SeaOfGates.java b/com/sun/electric/tool/routing/SeaOfGates.java
index e0f6d92..1e93855 100644
--- a/com/sun/electric/tool/routing/SeaOfGates.java
+++ b/com/sun/electric/tool/routing/SeaOfGates.java
@@ -6,7 +6,7 @@
* Routing tool: Sea of Gates control
* Written by: Steven M. Rubin
*
- * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -41,6 +41,7 @@ import com.sun.electric.technology.Technology;
import com.sun.electric.technology.technologies.Generic;
import com.sun.electric.tool.Job;
import com.sun.electric.tool.routing.Routing.SoGContactsStrategy;
+import com.sun.electric.tool.routing.Routing.SoGNetOrder;
import com.sun.electric.tool.routing.seaOfGates.SeaOfGatesEngine;
import com.sun.electric.tool.routing.seaOfGates.SeaOfGatesEngineFactory.SeaOfGatesEngineType;
import com.sun.electric.tool.routing.seaOfGates.SeaOfGatesHandlers;
@@ -80,7 +81,7 @@ public class SeaOfGates
* Presumes that it is inside of a Job.
* @param justSubCells true to run the router on all sub-cells of the current cell
* (but not on the current cell itself).
- *
+ *
* standard entry to routing is seaOfGatesRoute(false)
*/
public static void seaOfGatesRoute(boolean justSubCells)
@@ -121,8 +122,8 @@ public class SeaOfGates
/**
* Method to run Sea-of-Gates routing on the current cell, using a specified routing engine type.
* Presumes that it is inside of a Job.
- *
- * standard entry to routing is seaOfGatesRoute(SeaOfGatesEngineType.defaultVersion)
+ *
+ * standard entry to routing is seaOfGatesRoute(SeaOfGatesEngineType.defaultVersion)
*/
public static void seaOfGatesRoute(SeaOfGatesEngineType version)
{
@@ -265,11 +266,12 @@ public class SeaOfGates
public double maxArcWidth;
public int complexityLimit, rerunComplexityLimit;
public int maxDistance;
- public boolean useGlobalRouter, reRunFailedRoutes, enableSpineRouting;
+ public boolean useGlobalRouter, reRunFailedRoutes, enableSpineRouting, disableAdvancedSpineRouting;
public int forcedNumberOfThreads;
public String resultCellName;
public ElapseTimer theTimer;
public PrintStream qualityPrintStream;
+ public SoGNetOrder netOrder;
public SeaOfGatesOptions()
{
@@ -283,12 +285,14 @@ public class SeaOfGates
useGlobalRouter = false;
reRunFailedRoutes = false;
enableSpineRouting = false;
+ disableAdvancedSpineRouting = false;
forcedNumberOfThreads = 0;
resultCellName = null;
qualityPrintStream = null;
maxDistance = 2; // original default
+ netOrder = SoGNetOrder.SOGNETORDERORIGINAL; // original strategy
}
-
+
public void getOptionsFromPreferences(boolean factory)
{
if (factory)
@@ -305,6 +309,7 @@ public class SeaOfGates
enableSpineRouting = Routing.isFactorySeaOfGatesEnableSpineRouting();
forcedNumberOfThreads = Routing.getFactorySeaOfGatesForcedProcessorCount();
maxDistance = Routing.getFactorySeaOfGatesMaxDistance();
+ netOrder = Routing.getFactorySeaOfGatesNetOrder();
}
else
{
@@ -320,8 +325,31 @@ public class SeaOfGates
enableSpineRouting = Routing.isSeaOfGatesEnableSpineRouting();
forcedNumberOfThreads = Routing.getSeaOfGatesForcedProcessorCount();
maxDistance = Routing.getSeaOfGatesMaxDistance();
+ netOrder = Routing.getSeaOfGatesNetOrder();
}
}
+
+ /**
+ * Method to print active preferences for debugging purposes
+ */
+ @Override
+ public String toString()
+ {
+ return "SoG Preferences = (" +
+ "useParallelFromToRoutes=" + useParallelFromToRoutes + ", " +
+ "useParallelRoutes=" + useParallelRoutes + ", " +
+ "runOnConnectedRoutes=" + runOnConnectedRoutes + ",\n " +
+ "contactPlacementAction=" + contactPlacementAction + ", " +
+ "maxArcWidth=" + maxArcWidth + ", " +
+ "complexityLimit=" + complexityLimit + ",\n " +
+ "rerunComplexityLimit=" + rerunComplexityLimit + ", " +
+ "useGlobalRouter=" + useGlobalRouter + ", " +
+ "reRunFailedRoutes=" + reRunFailedRoutes + ",\n " +
+ "forcedNumberOfThreads=" + forcedNumberOfThreads + ", " +
+ "maxDistance=" + maxDistance + ", " +
+ "netOrder=" + netOrder.getValue() +
+ ")";
+ }
}
public static class SeaOfGatesArcProperties implements Serializable
@@ -344,17 +372,17 @@ public class SeaOfGates
public void setWidthOverride(Double w) { overrideWidth = w; }
public Double getWidthOverride() { return overrideWidth; }
- public void setSpacingOverride(Double s, int axis)
- {
+ public void setSpacingOverride(Double s, int axis)
+ {
if (axis == 0) overrideSpacingX = s;
else overrideSpacingY = s;
}
-
- public Double getSpacingOverride(int axis)
- {
- return (axis == 0) ? overrideSpacingX : overrideSpacingY;
+
+ public Double getSpacingOverride(int axis)
+ {
+ return (axis == 0) ? overrideSpacingX : overrideSpacingY;
}
-
+
public void setWidthOf2X(Double w) { widthOf2X = w; }
public Double getWidthOf2X() { return widthOf2X; }
@@ -483,12 +511,12 @@ public class SeaOfGates
{
canPlaceContactDownToAvoidedLayer = false;
continue;
- }
+ }
if (parts[0].equalsIgnoreCase("PreventContactUpToAvoidedLayer"))
{
canPlaceContactUpToAvoidedLayer = false;
continue;
- }
+ }
if (parts[0].equalsIgnoreCase("NoContactRotation"))
{
canRotateContacts = false;
@@ -639,11 +667,6 @@ public class SeaOfGates
}
continue;
}
-
-// if (parts[0].toLowerCase().startsWith("ArcSpacingOverride") && parts.length >= 3)
-// {
-// int axis = (parts[0].substring(parts[0].length()-1).equals("X")) ? 0 : 1;
-// }
if (parts[0].equalsIgnoreCase("NetworkOverride") && parts.length >= 2)
{
String netName = parts[1];
@@ -673,11 +696,11 @@ public class SeaOfGates
continue;
}
continue;
- }
+ }
}
}
}
-
+
/**
* Method to import the control file for routing.
* @param fileName the name of the control file.
@@ -711,8 +734,6 @@ public class SeaOfGates
if (buf == null) break;
if (buf.length() == 0 || buf.startsWith(";")) continue;
- //String[] parts = buf.split(" ");
- // Using StringTokenizer to deal with white spaces
List<String> slist = new ArrayList<String>();
StringTokenizer p = new StringTokenizer(buf, " ", false);
while (p.hasMoreTokens())
@@ -738,7 +759,7 @@ public class SeaOfGates
if (parts[0].equalsIgnoreCase("RoutingBoundsLayer"))
{
- // define routing bound layer
+ // define routing bound layer
assert(parts.length > 1);
routingBoundsLayerName = parts[1];
continue;
@@ -789,6 +810,11 @@ public class SeaOfGates
assert(parts.length > 1);
// just getting first element
List<ArcProto> apList = getArcProtoList(parts[1], lineReader.getLineNumber(), curTech, extraLayers);
+ if (apList == null)
+ {
+ System.out.println("ERROR parsing line " + lineReader.getLineNumber() + " of file");
+ continue;
+ }
for (ArcProto ap: apList)
{
int level = ap.getFunction().getLevel();
@@ -803,6 +829,11 @@ public class SeaOfGates
assert(parts.length > 1);
// just getting first element
List<ArcProto> apList = getArcProtoList(parts[1], lineReader.getLineNumber(), curTech, extraLayers);
+ if (apList == null)
+ {
+ System.out.println("ERROR parsing line " + lineReader.getLineNumber() + " of file");
+ continue;
+ }
for (ArcProto ap: apList)
{
int level = ap.getFunction().getLevel();
@@ -817,7 +848,7 @@ public class SeaOfGates
for(int i=1; i<parts.length; i++)
{
List<ArcProto> apList = getArcProtoList(parts[i], lineReader.getLineNumber(), curTech, extraLayers);
- allowed.addAll(apList);
+ if (apList != null) allowed.addAll(apList);
}
for(Iterator<ArcProto> it = curTech.getArcs(); it.hasNext(); )
{
@@ -833,7 +864,7 @@ public class SeaOfGates
for(int i=1; i<parts.length; i++)
{
List<ArcProto> apList = getArcProtoList(parts[i], lineReader.getLineNumber(), curTech, extraLayers);
- allowed.addAll(apList);
+ if (apList != null) allowed.addAll(apList);
}
for(ArcProto ap : allowed)
setTaperOnly(ap, true);
@@ -844,6 +875,8 @@ public class SeaOfGates
{
tmpList.clear();
List<ArcProto> apList = getArcProtoList(parts[1], lineReader.getLineNumber(), curTech, extraLayers);
+ if (apList == null) continue;
+
// Checking there is previous definition of those layers
for (ArcProto arc : apList)
{
@@ -861,7 +894,7 @@ public class SeaOfGates
double spacingX = TextUtils.atof(parts[3]);
spacingX = TextUtils.convertFromDistance(spacingX, curTech, UnitScale.MICRO);
setDefaultSpacingOverride(arc, spacingX, 0);
-
+
double spacingY = TextUtils.atof(parts[4]);
spacingY = TextUtils.convertFromDistance(spacingY, curTech, UnitScale.MICRO);
setDefaultSpacingOverride(arc, spacingY, 1);
@@ -880,6 +913,7 @@ public class SeaOfGates
{
tmpList.clear();
List<ArcProto> apList = getArcProtoList(parts[1], lineReader.getLineNumber(), curTech, extraLayers);
+ if (apList == null) continue;
for (ArcProto arc : apList)
{
double taperLength = TextUtils.atof(parts[2]);
@@ -898,6 +932,7 @@ public class SeaOfGates
continue;
}
List<ArcProto> apList = getArcProtoList(parts[1], lineReader.getLineNumber(), curTech, extraLayers);
+ if (apList == null) continue;
int maskNum = SeaOfGatesTrack.getSpecificMaskNumber(parts[1]);
for (ArcProto ap : apList)
{
@@ -915,6 +950,7 @@ public class SeaOfGates
continue;
}
List<ArcProto> apList = getArcProtoList(parts[1], lineReader.getLineNumber(), curTech, extraLayers);
+ if (apList == null) continue;
if (apList.size() < 1)
{
System.out.println("ERROR: unknown arc on line " + lineReader.getLineNumber());
@@ -943,6 +979,7 @@ public class SeaOfGates
}
List<ArcProto> apList = getArcProtoList(parts[1], lineReader.getLineNumber(), curTech, extraLayers);
+ if (apList == null) continue;
int maskNum = SeaOfGatesTrack.getSpecificMaskNumber(parts[1]);
for (ArcProto ap : apList)
{
@@ -1050,6 +1087,7 @@ public class SeaOfGates
for(int i=1; i<parts.length; i++)
{
List<ArcProto> apList = getArcProtoList(parts[i], lineReader.getLineNumber(), curTech, extraLayers);
+ if (apList == null) continue;
for (ArcProto ap : apList)
layersToOverride.add(ap);
}
@@ -1061,6 +1099,7 @@ public class SeaOfGates
for(int i=1; i<parts.length; i += 2)
{
List<ArcProto> apList = getArcProtoList(parts[i], lineReader.getLineNumber(), curTech, extraLayers);
+ if (apList == null) continue;
for (ArcProto ap : apList)
{
double v = TextUtils.atof(parts[i+1]);
@@ -1076,6 +1115,7 @@ public class SeaOfGates
for(int i=1; i<parts.length; i += 2)
{
List<ArcProto> apList = getArcProtoList(parts[i], lineReader.getLineNumber(), curTech, extraLayers);
+ if (apList == null) continue;
for (ArcProto ap : apList)
{
double v = TextUtils.atof(parts[i+1]);
@@ -1313,7 +1353,7 @@ public class SeaOfGates
ArcProto ap = tech.findArcProto(layerName);
return ap;
}
-
+
/**
* Function to determine the direction of the primary spacing value
* @param ap ArcProto representing the metal arc
@@ -1595,7 +1635,7 @@ public class SeaOfGates
* @return true if the layer is favored.
*/
public boolean isFavored(ArcProto ap) { return favoredArcs.contains(ap); }
-
+
/**
* Method to set whether a given layer is available only for tapers.
* Tapers are ends of a route that take the width of the endpoint node.
@@ -1661,7 +1701,7 @@ public class SeaOfGates
}
/**
- * Method to tell whether a given layer should use a different spacing along a given axis
+ * Method to tell whether a given layer should use a different spacing along a given axis
* when routing the Cell. 0 for X, 1 for Y.
* @param ap the ArcProto of the layer in question.
* @return the arc spacing to use (null to use the arc's default).
@@ -1674,7 +1714,7 @@ public class SeaOfGates
}
/**
- * Method to set whether a given layer should use a different spacing along a given axis
+ * Method to set whether a given layer should use a different spacing along a given axis
* when routing the Cell. 0 for X, 1 for Y.
* @param ap the ArcProto of the layer in question.
* @param s the new spacing to use (null to use the default).
@@ -1870,7 +1910,6 @@ public class SeaOfGates
* @param net the name of the network.
* @param ap the ArcProto being routed on the network.
* @param spacing the arc spacing to use (null to remove the override).
- * @param axis direction for the spacing value
*/
public void setSpacingOverrideForArcOnNet(String net, ArcProto ap, Double spacing)
{
@@ -1946,7 +1985,7 @@ public class SeaOfGates
* @param s String representing the regular expression
*/
public void setAcceptOnly2XPrimitives(String s) {acceptOnly2XPrimitives = s; }
-
+
/**
* Method to return the name of the layer to be used to limit routing bounds.
* @return the name of the layer to be used to limit routing bounds (null if no limiting being done).
diff --git a/com/sun/electric/tool/routing/SimpleWirer.java b/com/sun/electric/tool/routing/SimpleWirer.java
index 00d41a9..4402a49 100644
--- a/com/sun/electric/tool/routing/SimpleWirer.java
+++ b/com/sun/electric/tool/routing/SimpleWirer.java
@@ -4,7 +4,7 @@
*
* File: SimpleWirer.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/VerticalRoute.java b/com/sun/electric/tool/routing/VerticalRoute.java
index 344a473..e6ba9b3 100644
--- a/com/sun/electric/tool/routing/VerticalRoute.java
+++ b/com/sun/electric/tool/routing/VerticalRoute.java
@@ -4,7 +4,7 @@
*
* File: VerticalRoute.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -571,7 +571,7 @@ public class VerticalRoute {
/**
* Method to check whether an equivalent PortProto has been added to the list.
* @param pp
- * @return
+ * @return true if it is in the list.
*/
private boolean isPortProtoContained(Object pp)
{
diff --git a/com/sun/electric/tool/routing/experimentalAStar1/AStarBlockageWorker.java b/com/sun/electric/tool/routing/experimentalAStar1/AStarBlockageWorker.java
index e3885bb..32c8f18 100644
--- a/com/sun/electric/tool/routing/experimentalAStar1/AStarBlockageWorker.java
+++ b/com/sun/electric/tool/routing/experimentalAStar1/AStarBlockageWorker.java
@@ -5,7 +5,7 @@
* File: AStarBlockageWorker.java
* Written by: Christian Julg, Jonas Thedering (Team 1)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar1/AStarMaster.java b/com/sun/electric/tool/routing/experimentalAStar1/AStarMaster.java
index 9aae65c..f1c6de3 100644
--- a/com/sun/electric/tool/routing/experimentalAStar1/AStarMaster.java
+++ b/com/sun/electric/tool/routing/experimentalAStar1/AStarMaster.java
@@ -5,7 +5,7 @@
* File: AStarMaster.java
* Written by: Christian Julg, Jonas Thedering (Team 1)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar1/AStarRoutingFrame.java b/com/sun/electric/tool/routing/experimentalAStar1/AStarRoutingFrame.java
index 319c51f..bb1188f 100644
--- a/com/sun/electric/tool/routing/experimentalAStar1/AStarRoutingFrame.java
+++ b/com/sun/electric/tool/routing/experimentalAStar1/AStarRoutingFrame.java
@@ -5,7 +5,7 @@
* File: AStarRoutingFrame.java
* Written by: Christian Julg, Jonas Thedering (Team 1)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -260,7 +260,7 @@ public class AStarRoutingFrame extends BenchmarkRouter {
* @param blockages
* @param cell
* @param segmentsToRoute
- * @return
+ * @return parameters.
*/
private Map findBoundingBox(List<RoutingGeometry> blockages, Cell cell, List<RoutingSegment> segmentsToRoute) {
diff --git a/com/sun/electric/tool/routing/experimentalAStar1/AStarWorker.java b/com/sun/electric/tool/routing/experimentalAStar1/AStarWorker.java
index 21c2277..50f9591 100644
--- a/com/sun/electric/tool/routing/experimentalAStar1/AStarWorker.java
+++ b/com/sun/electric/tool/routing/experimentalAStar1/AStarWorker.java
@@ -5,7 +5,7 @@
* File: AStarWorker.java
* Written by: Christian Julg, Jonas Thedering (Team 1)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar1/BenchmarkRouter.java b/com/sun/electric/tool/routing/experimentalAStar1/BenchmarkRouter.java
index 70edc03..480bacd 100644
--- a/com/sun/electric/tool/routing/experimentalAStar1/BenchmarkRouter.java
+++ b/com/sun/electric/tool/routing/experimentalAStar1/BenchmarkRouter.java
@@ -5,7 +5,7 @@
* File: BenchmarkRouter.java
* Written by: Christian Julg, Jonas Thedering (Team 1)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar1/CellPrinter.java b/com/sun/electric/tool/routing/experimentalAStar1/CellPrinter.java
index 5c29de2..082d73f 100644
--- a/com/sun/electric/tool/routing/experimentalAStar1/CellPrinter.java
+++ b/com/sun/electric/tool/routing/experimentalAStar1/CellPrinter.java
@@ -5,7 +5,7 @@
* File: CellPrinter.java
* Written by: Christian Julg, Jonas Thedering (Team 1)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar1/EndPoint.java b/com/sun/electric/tool/routing/experimentalAStar1/EndPoint.java
index 3740327..08e79c3 100644
--- a/com/sun/electric/tool/routing/experimentalAStar1/EndPoint.java
+++ b/com/sun/electric/tool/routing/experimentalAStar1/EndPoint.java
@@ -5,7 +5,7 @@
* File: EndPoint.java
* Written by: Christian Julg, Jonas Thedering (Team 1)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar1/EndPointMarker.java b/com/sun/electric/tool/routing/experimentalAStar1/EndPointMarker.java
index ea1d86b..60815b2 100644
--- a/com/sun/electric/tool/routing/experimentalAStar1/EndPointMarker.java
+++ b/com/sun/electric/tool/routing/experimentalAStar1/EndPointMarker.java
@@ -5,7 +5,7 @@
* File: EndPointMarker.java
* Written by: Christian Julg, Jonas Thedering (Team 1)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar1/Goal.java b/com/sun/electric/tool/routing/experimentalAStar1/Goal.java
index 9d5723d..78c3eb0 100644
--- a/com/sun/electric/tool/routing/experimentalAStar1/Goal.java
+++ b/com/sun/electric/tool/routing/experimentalAStar1/Goal.java
@@ -5,7 +5,7 @@
* File: Goal.java
* Written by: Christian Julg, Jonas Thedering (Team 1)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar1/Map.java b/com/sun/electric/tool/routing/experimentalAStar1/Map.java
index 642dc44..07b6a52 100644
--- a/com/sun/electric/tool/routing/experimentalAStar1/Map.java
+++ b/com/sun/electric/tool/routing/experimentalAStar1/Map.java
@@ -5,7 +5,7 @@
* File: Map.java
* Written by: Christian Julg, Jonas Thedering (Team 1)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar1/Net.java b/com/sun/electric/tool/routing/experimentalAStar1/Net.java
index 339f17f..a0f341e 100644
--- a/com/sun/electric/tool/routing/experimentalAStar1/Net.java
+++ b/com/sun/electric/tool/routing/experimentalAStar1/Net.java
@@ -5,7 +5,7 @@
* File: Net.java
* Written by: Christian Julg, Jonas Thedering (Team 1)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar1/Node.java b/com/sun/electric/tool/routing/experimentalAStar1/Node.java
index 7599660..5c1df0f 100644
--- a/com/sun/electric/tool/routing/experimentalAStar1/Node.java
+++ b/com/sun/electric/tool/routing/experimentalAStar1/Node.java
@@ -5,7 +5,7 @@
* File: Node.java
* Written by: Christian Julg, Jonas Thedering (Team 1)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar1/ObjectPool.java b/com/sun/electric/tool/routing/experimentalAStar1/ObjectPool.java
index 9b828fc..97bf5ae 100644
--- a/com/sun/electric/tool/routing/experimentalAStar1/ObjectPool.java
+++ b/com/sun/electric/tool/routing/experimentalAStar1/ObjectPool.java
@@ -5,7 +5,7 @@
* File: ObjectPool.java
* Written by: Christian Julg, Jonas Thedering (Team 1)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar1/Path.java b/com/sun/electric/tool/routing/experimentalAStar1/Path.java
index 60d5ef4..ebc25d3 100644
--- a/com/sun/electric/tool/routing/experimentalAStar1/Path.java
+++ b/com/sun/electric/tool/routing/experimentalAStar1/Path.java
@@ -5,7 +5,7 @@
* File: Path.java
* Written by: Christian Julg, Jonas Thedering (Team 1)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar1/Poolable.java b/com/sun/electric/tool/routing/experimentalAStar1/Poolable.java
index 05127ba..adfa71d 100644
--- a/com/sun/electric/tool/routing/experimentalAStar1/Poolable.java
+++ b/com/sun/electric/tool/routing/experimentalAStar1/Poolable.java
@@ -5,7 +5,7 @@
* File: Poolable.java
* Written by: Christian Julg, Jonas Thedering (Team 1)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar1/PriorityQueue.java b/com/sun/electric/tool/routing/experimentalAStar1/PriorityQueue.java
index 217859e..7d3b358 100644
--- a/com/sun/electric/tool/routing/experimentalAStar1/PriorityQueue.java
+++ b/com/sun/electric/tool/routing/experimentalAStar1/PriorityQueue.java
@@ -5,7 +5,7 @@
* File: PriorityQueue.java
* Written by: Christian Julg, Jonas Thedering (Team 1)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar1/QuadTree.java b/com/sun/electric/tool/routing/experimentalAStar1/QuadTree.java
index e6ee144..b365187 100644
--- a/com/sun/electric/tool/routing/experimentalAStar1/QuadTree.java
+++ b/com/sun/electric/tool/routing/experimentalAStar1/QuadTree.java
@@ -5,7 +5,7 @@
* File: QuadTree.java
* Written by: Christian Julg, Jonas Thedering (Team 1)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar1/SplayTree.java b/com/sun/electric/tool/routing/experimentalAStar1/SplayTree.java
index 22007e4..4a80024 100644
--- a/com/sun/electric/tool/routing/experimentalAStar1/SplayTree.java
+++ b/com/sun/electric/tool/routing/experimentalAStar1/SplayTree.java
@@ -5,7 +5,7 @@
* File: SplayTree.java
* Written by: Christian Julg, Jonas Thedering (Team 1)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar1/Storage.java b/com/sun/electric/tool/routing/experimentalAStar1/Storage.java
index d5e014d..84b5536 100644
--- a/com/sun/electric/tool/routing/experimentalAStar1/Storage.java
+++ b/com/sun/electric/tool/routing/experimentalAStar1/Storage.java
@@ -5,7 +5,7 @@
* File: Storage.java
* Written by: Christian Julg, Jonas Thedering (Team 1)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/AStarRouter.java b/com/sun/electric/tool/routing/experimentalAStar2/AStarRouter.java
index 2a13c38..cf0d70b 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/AStarRouter.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/AStarRouter.java
@@ -5,7 +5,7 @@
* File: AStarRouter.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -105,7 +105,7 @@ public class AStarRouter extends BenchmarkRouter
* coordinates, or other similar unit conversions.
*
* @param c
- * @return
+ * @return the unit coordinate.
*/
private int cellUnitToNode(double c)
{
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/BenchmarkRouter.java b/com/sun/electric/tool/routing/experimentalAStar2/BenchmarkRouter.java
index c2bce88..5194898 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/BenchmarkRouter.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/BenchmarkRouter.java
@@ -5,7 +5,7 @@
* File: BenchmarkRouter.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStar.java b/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStar.java
index 8c57372..678b9f7 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStar.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStar.java
@@ -5,7 +5,7 @@
* File: AStar.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStarClosedListBase.java b/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStarClosedListBase.java
index ac7c028..e23b96e 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStarClosedListBase.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStarClosedListBase.java
@@ -5,7 +5,7 @@
* File: AStarClosedListBase.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStarGoalBase.java b/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStarGoalBase.java
index 100e39f..2818c6c 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStarGoalBase.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStarGoalBase.java
@@ -5,7 +5,7 @@
* File: AStarGoalBase.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStarMapBase.java b/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStarMapBase.java
index f928052..cea1c58 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStarMapBase.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStarMapBase.java
@@ -5,7 +5,7 @@
* File: AStarMapBase.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStarMapVisitorBase.java b/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStarMapVisitorBase.java
index c3a16ab..76096d3 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStarMapVisitorBase.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStarMapVisitorBase.java
@@ -5,7 +5,7 @@
* File: AStarMapVisitorBase.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStarNode.java b/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStarNode.java
index b4d4e46..e8f31bb 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStarNode.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStarNode.java
@@ -5,7 +5,7 @@
* File: AStarNode.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStarNodeBase.java b/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStarNodeBase.java
index 16f13f4..f91c2ca 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStarNodeBase.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStarNodeBase.java
@@ -5,7 +5,7 @@
* File: AStarNodeBase.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStarOpenListBase.java b/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStarOpenListBase.java
index 2359cf9..e20b7d1 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStarOpenListBase.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStarOpenListBase.java
@@ -5,7 +5,7 @@
* File: AStarOpenListBase.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStarRegionNode.java b/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStarRegionNode.java
index 73232dc..58dcb18 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStarRegionNode.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/algorithm/AStarRegionNode.java
@@ -5,7 +5,7 @@
* File: AStarRegionNode.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/algorithm/ExternalVisitor.java b/com/sun/electric/tool/routing/experimentalAStar2/algorithm/ExternalVisitor.java
index 3ce6399..618e8ff 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/algorithm/ExternalVisitor.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/algorithm/ExternalVisitor.java
@@ -5,7 +5,7 @@
* File: ExternalVisitor.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/concurrency/GlobalRouteJob.java b/com/sun/electric/tool/routing/experimentalAStar2/concurrency/GlobalRouteJob.java
index ca35c12..4f82700 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/concurrency/GlobalRouteJob.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/concurrency/GlobalRouteJob.java
@@ -5,7 +5,7 @@
* File: GlobalRouteJob.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/concurrency/LocalRouteJob.java b/com/sun/electric/tool/routing/experimentalAStar2/concurrency/LocalRouteJob.java
index d6f1e7f..5c0b494 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/concurrency/LocalRouteJob.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/concurrency/LocalRouteJob.java
@@ -5,7 +5,7 @@
* File: LocalRouteJob.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/concurrency/RouteJob.java b/com/sun/electric/tool/routing/experimentalAStar2/concurrency/RouteJob.java
index 1120928..2ea78ff 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/concurrency/RouteJob.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/concurrency/RouteJob.java
@@ -5,7 +5,7 @@
* File: RouteJob.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/concurrency/RoutingMain.java b/com/sun/electric/tool/routing/experimentalAStar2/concurrency/RoutingMain.java
index e21d439..3655143 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/concurrency/RoutingMain.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/concurrency/RoutingMain.java
@@ -5,7 +5,7 @@
* File: RoutingMain.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/datastructures/Point3D.java b/com/sun/electric/tool/routing/experimentalAStar2/datastructures/Point3D.java
index d7c9375..4cc2ee1 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/datastructures/Point3D.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/datastructures/Point3D.java
@@ -5,7 +5,7 @@
* File: Point3D.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/goal/RegionGoal.java b/com/sun/electric/tool/routing/experimentalAStar2/goal/RegionGoal.java
index f9571ad..1f1a07a 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/goal/RegionGoal.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/goal/RegionGoal.java
@@ -5,7 +5,7 @@
* File: RegionGoal.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/goal/SimpleGoal.java b/com/sun/electric/tool/routing/experimentalAStar2/goal/SimpleGoal.java
index 0afbc5f..f45b368 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/goal/SimpleGoal.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/goal/SimpleGoal.java
@@ -5,7 +5,7 @@
* File: SimpleGoal.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/goal/SimpleGoalEightNeighbours.java b/com/sun/electric/tool/routing/experimentalAStar2/goal/SimpleGoalEightNeighbours.java
index a729d90..80f748f 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/goal/SimpleGoalEightNeighbours.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/goal/SimpleGoalEightNeighbours.java
@@ -5,7 +5,7 @@
* File: SimpleGoalEightNeighbours.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/machine/AStarMachine.java b/com/sun/electric/tool/routing/experimentalAStar2/machine/AStarMachine.java
index 8a48871..fafa2d7 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/machine/AStarMachine.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/machine/AStarMachine.java
@@ -5,7 +5,7 @@
* File: AStarMachine.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/machine/AStarMachineFast.java b/com/sun/electric/tool/routing/experimentalAStar2/machine/AStarMachineFast.java
index 3e52771..ae0c7c4 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/machine/AStarMachineFast.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/machine/AStarMachineFast.java
@@ -5,7 +5,7 @@
* File: AStarMachineFast.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/machine/AStarMachineSimple.java b/com/sun/electric/tool/routing/experimentalAStar2/machine/AStarMachineSimple.java
index bdc7265..9bddede 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/machine/AStarMachineSimple.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/machine/AStarMachineSimple.java
@@ -5,7 +5,7 @@
* File: AStarMachineSimple.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/machine/AStarNodeFactory.java b/com/sun/electric/tool/routing/experimentalAStar2/machine/AStarNodeFactory.java
index 800cb5a..43f6e2d 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/machine/AStarNodeFactory.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/machine/AStarNodeFactory.java
@@ -5,7 +5,7 @@
* File: AStarNodeFactory.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/machine/AStarRegionMachine.java b/com/sun/electric/tool/routing/experimentalAStar2/machine/AStarRegionMachine.java
index 51c9f68..ecee0dd 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/machine/AStarRegionMachine.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/machine/AStarRegionMachine.java
@@ -5,7 +5,7 @@
* File: AStarRegionMachine.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/map/FieldMap.java b/com/sun/electric/tool/routing/experimentalAStar2/map/FieldMap.java
index 978fbac..59160c3 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/map/FieldMap.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/map/FieldMap.java
@@ -5,7 +5,7 @@
* File: FieldMap.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/map/HashedInfiniteMap.java b/com/sun/electric/tool/routing/experimentalAStar2/map/HashedInfiniteMap.java
index 114f68c..25fdd6b 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/map/HashedInfiniteMap.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/map/HashedInfiniteMap.java
@@ -5,7 +5,7 @@
* File: HashedInfiniteMap.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/map/HashedInfiniteMapEightNeighbours.java b/com/sun/electric/tool/routing/experimentalAStar2/map/HashedInfiniteMapEightNeighbours.java
index d4a764a..c6ae418 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/map/HashedInfiniteMapEightNeighbours.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/map/HashedInfiniteMapEightNeighbours.java
@@ -5,7 +5,7 @@
* File: HashedInfiniteMapEightNeighbours.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/map/Region.java b/com/sun/electric/tool/routing/experimentalAStar2/map/Region.java
index c2d8039..8b7fe6b 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/map/Region.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/map/Region.java
@@ -5,7 +5,7 @@
* File: Region.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/map/RegionBoundingBox.java b/com/sun/electric/tool/routing/experimentalAStar2/map/RegionBoundingBox.java
index 999ab48..d757047 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/map/RegionBoundingBox.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/map/RegionBoundingBox.java
@@ -5,7 +5,7 @@
* File: RegionBoundingBox.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/memorymanager/AStarNodeObjectPool.java b/com/sun/electric/tool/routing/experimentalAStar2/memorymanager/AStarNodeObjectPool.java
index 4ba2831..0e96f61 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/memorymanager/AStarNodeObjectPool.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/memorymanager/AStarNodeObjectPool.java
@@ -5,7 +5,7 @@
* File: AStarNodeObjectPool.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/memorymanager/AStarRegionNodeObjectPool.java b/com/sun/electric/tool/routing/experimentalAStar2/memorymanager/AStarRegionNodeObjectPool.java
index 13028eb..172e858 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/memorymanager/AStarRegionNodeObjectPool.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/memorymanager/AStarRegionNodeObjectPool.java
@@ -5,7 +5,7 @@
* File: AStarRegionNodeObjectPool.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/memorymanager/LinkedListObjectPool.java b/com/sun/electric/tool/routing/experimentalAStar2/memorymanager/LinkedListObjectPool.java
index 59e6967..442160e 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/memorymanager/LinkedListObjectPool.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/memorymanager/LinkedListObjectPool.java
@@ -5,7 +5,7 @@
* File: LinkedListObjectPool.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/memorymanager/ObjectFactory.java b/com/sun/electric/tool/routing/experimentalAStar2/memorymanager/ObjectFactory.java
index a4be5f0..78eef8c 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/memorymanager/ObjectFactory.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/memorymanager/ObjectFactory.java
@@ -5,7 +5,7 @@
* File: ObjectFactory.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/memorymanager/ObjectPool.java b/com/sun/electric/tool/routing/experimentalAStar2/memorymanager/ObjectPool.java
index 887da73..4971ab0 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/memorymanager/ObjectPool.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/memorymanager/ObjectPool.java
@@ -5,7 +5,7 @@
* File: ObjectPool.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/storage/AStarClosedListHashMap.java b/com/sun/electric/tool/routing/experimentalAStar2/storage/AStarClosedListHashMap.java
index c79568a..7127709 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/storage/AStarClosedListHashMap.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/storage/AStarClosedListHashMap.java
@@ -5,7 +5,7 @@
* File: AStarClosedListHashMap.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/storage/AStarClosedListReferencing.java b/com/sun/electric/tool/routing/experimentalAStar2/storage/AStarClosedListReferencing.java
index 6b216ae..f9ba83b 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/storage/AStarClosedListReferencing.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/storage/AStarClosedListReferencing.java
@@ -5,7 +5,7 @@
* File: AStarClosedListReferencing.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/storage/AStarOpenListCheapList.java b/com/sun/electric/tool/routing/experimentalAStar2/storage/AStarOpenListCheapList.java
index 9557b10..98a415a 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/storage/AStarOpenListCheapList.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/storage/AStarOpenListCheapList.java
@@ -5,7 +5,7 @@
* File: AStarOpenListCheapList.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar2/storage/AStarOpenListPriorityQueue.java b/com/sun/electric/tool/routing/experimentalAStar2/storage/AStarOpenListPriorityQueue.java
index b429f81..982d7ba 100644
--- a/com/sun/electric/tool/routing/experimentalAStar2/storage/AStarOpenListPriorityQueue.java
+++ b/com/sun/electric/tool/routing/experimentalAStar2/storage/AStarOpenListPriorityQueue.java
@@ -5,7 +5,7 @@
* File: AStarOpenLitPriorityQueue.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/AStarRouter.java b/com/sun/electric/tool/routing/experimentalAStar3/AStarRouter.java
index 5b23f5f..224bdd9 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/AStarRouter.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/AStarRouter.java
@@ -5,7 +5,7 @@
* File: AStarRouter.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -124,7 +124,7 @@ public class AStarRouter extends BenchmarkRouter
* coordinates, or other similar unit conversions.
*
* @param c
- * @return
+ * @return the unit coordinates.
*/
private int cellUnitToNode(double c)
{
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/BenchmarkRouter.java b/com/sun/electric/tool/routing/experimentalAStar3/BenchmarkRouter.java
index d57b056..0db4e14 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/BenchmarkRouter.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/BenchmarkRouter.java
@@ -5,7 +5,7 @@
* File: BenchmarkRouter.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStar.java b/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStar.java
index 8c9e472..a913d33 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStar.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStar.java
@@ -5,7 +5,7 @@
* File: AStar.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStarClosedListBase.java b/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStarClosedListBase.java
index e65b121..4b3bcec 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStarClosedListBase.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStarClosedListBase.java
@@ -5,7 +5,7 @@
* File: AStarClosedListBase.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStarGoalBase.java b/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStarGoalBase.java
index 4a377fe..a94a072 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStarGoalBase.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStarGoalBase.java
@@ -5,7 +5,7 @@
* File: AStarGoalBase.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStarMapBase.java b/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStarMapBase.java
index ee17cc9..4edc430 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStarMapBase.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStarMapBase.java
@@ -5,7 +5,7 @@
* File: AStarMapBase.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStarMapVisitorBase.java b/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStarMapVisitorBase.java
index 2f8b34d..6d1ae9f 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStarMapVisitorBase.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStarMapVisitorBase.java
@@ -5,7 +5,7 @@
* File: AStarMapVisitorBase.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStarNode.java b/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStarNode.java
index 502c1c9..8330663 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStarNode.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStarNode.java
@@ -5,7 +5,7 @@
* File: AStarNode.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStarNodeBase.java b/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStarNodeBase.java
index 4d1eb54..1bd5d08 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStarNodeBase.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStarNodeBase.java
@@ -5,7 +5,7 @@
* File: AStarNodeBase.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStarOpenListBase.java b/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStarOpenListBase.java
index 46dde3a..02da35d 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStarOpenListBase.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStarOpenListBase.java
@@ -5,7 +5,7 @@
* File: AStarOpenListBase.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStarRegionNode.java b/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStarRegionNode.java
index 7ef33d3..d9915f2 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStarRegionNode.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/algorithm/AStarRegionNode.java
@@ -5,7 +5,7 @@
* File: AStarRegionNode.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/algorithm/ExternalVisitor.java b/com/sun/electric/tool/routing/experimentalAStar3/algorithm/ExternalVisitor.java
index f6101e2..d800f1d 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/algorithm/ExternalVisitor.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/algorithm/ExternalVisitor.java
@@ -5,7 +5,7 @@
* File: ExternalVisitor.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/concurrency/GlobalRouteJob.java b/com/sun/electric/tool/routing/experimentalAStar3/concurrency/GlobalRouteJob.java
index d36ef6e..d837c85 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/concurrency/GlobalRouteJob.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/concurrency/GlobalRouteJob.java
@@ -5,7 +5,7 @@
* File: GlobalRouteJob.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/concurrency/LocalRouteJob.java b/com/sun/electric/tool/routing/experimentalAStar3/concurrency/LocalRouteJob.java
index b57d84e..416136b 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/concurrency/LocalRouteJob.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/concurrency/LocalRouteJob.java
@@ -5,7 +5,7 @@
* File: LocalRouteJob.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/concurrency/RouteJob.java b/com/sun/electric/tool/routing/experimentalAStar3/concurrency/RouteJob.java
index dfd65ea..5b0bc65 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/concurrency/RouteJob.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/concurrency/RouteJob.java
@@ -5,7 +5,7 @@
* File: RouteJob.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/concurrency/RoutingMain.java b/com/sun/electric/tool/routing/experimentalAStar3/concurrency/RoutingMain.java
index 1a1212f..52d2049 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/concurrency/RoutingMain.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/concurrency/RoutingMain.java
@@ -5,7 +5,7 @@
* File: RoutingMain.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -340,7 +340,7 @@ public class RoutingMain // implements Runnable
* @param terminalGlobalCellY
* = job.routingSegment.getStartEnd().getLocation().getY()
* @param job
- * @return
+ * @return the quadrant number.
*/
private int getQuadrantOfTerminalInGlobalNode(Point3D terminalGlobalNodeCoords,
double terminalGlobalCellX, double terminalGlobalCellY, RouteJob job) {
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/datastructures/Array2D.java b/com/sun/electric/tool/routing/experimentalAStar3/datastructures/Array2D.java
index a932df8..b52f5ee 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/datastructures/Array2D.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/datastructures/Array2D.java
@@ -5,7 +5,7 @@
* File: Array2D.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/datastructures/Array3D.java b/com/sun/electric/tool/routing/experimentalAStar3/datastructures/Array3D.java
index 963e1c2..d6cb880 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/datastructures/Array3D.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/datastructures/Array3D.java
@@ -5,7 +5,7 @@
* File: Array3D.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/datastructures/Point3D.java b/com/sun/electric/tool/routing/experimentalAStar3/datastructures/Point3D.java
index d7249b8..abbd465 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/datastructures/Point3D.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/datastructures/Point3D.java
@@ -5,7 +5,7 @@
* File: Point3D.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/datastructures/PriorityQueue.java b/com/sun/electric/tool/routing/experimentalAStar3/datastructures/PriorityQueue.java
index 15b5a18..17cf708 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/datastructures/PriorityQueue.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/datastructures/PriorityQueue.java
@@ -5,7 +5,7 @@
* File: PriorityQueue.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/goal/RegionGoal.java b/com/sun/electric/tool/routing/experimentalAStar3/goal/RegionGoal.java
index 51fe692..7b6eab5 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/goal/RegionGoal.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/goal/RegionGoal.java
@@ -5,7 +5,7 @@
* File: RegionGoal.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/goal/SimpleGoal.java b/com/sun/electric/tool/routing/experimentalAStar3/goal/SimpleGoal.java
index 8229f79..89da9ed 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/goal/SimpleGoal.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/goal/SimpleGoal.java
@@ -5,7 +5,7 @@
* File: SimpleGoal.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/goal/SimpleGoalEightNeighbours.java b/com/sun/electric/tool/routing/experimentalAStar3/goal/SimpleGoalEightNeighbours.java
index 963b981..623883d 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/goal/SimpleGoalEightNeighbours.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/goal/SimpleGoalEightNeighbours.java
@@ -5,7 +5,7 @@
* File: SimpleGoalEightNeighbours.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/machine/AStarMachine.java b/com/sun/electric/tool/routing/experimentalAStar3/machine/AStarMachine.java
index a8301f4..73ffd48 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/machine/AStarMachine.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/machine/AStarMachine.java
@@ -5,7 +5,7 @@
* File: AStarMachine.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/machine/AStarMachineFast.java b/com/sun/electric/tool/routing/experimentalAStar3/machine/AStarMachineFast.java
index 83eba30..5e71af3 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/machine/AStarMachineFast.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/machine/AStarMachineFast.java
@@ -5,7 +5,7 @@
* File: AStarMachineFast.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/machine/AStarMachineSimple.java b/com/sun/electric/tool/routing/experimentalAStar3/machine/AStarMachineSimple.java
index 8e6143a..82c77d0 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/machine/AStarMachineSimple.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/machine/AStarMachineSimple.java
@@ -5,7 +5,7 @@
* File: AStarMachineSimple.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/machine/AStarNodeFactory.java b/com/sun/electric/tool/routing/experimentalAStar3/machine/AStarNodeFactory.java
index ed6a6ef..1c95675 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/machine/AStarNodeFactory.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/machine/AStarNodeFactory.java
@@ -5,7 +5,7 @@
* File: AStarNodeFactory.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/machine/AStarRegionMachine.java b/com/sun/electric/tool/routing/experimentalAStar3/machine/AStarRegionMachine.java
index 139dfd6..cb2b745 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/machine/AStarRegionMachine.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/machine/AStarRegionMachine.java
@@ -5,7 +5,7 @@
* File: AStarRegionMachine.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/map/FieldMap.java b/com/sun/electric/tool/routing/experimentalAStar3/map/FieldMap.java
index fe55766..88e5f15 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/map/FieldMap.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/map/FieldMap.java
@@ -5,7 +5,7 @@
* File: FieldMap.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/map/HashedInfiniteMap.java b/com/sun/electric/tool/routing/experimentalAStar3/map/HashedInfiniteMap.java
index 10cac7f..4a75577 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/map/HashedInfiniteMap.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/map/HashedInfiniteMap.java
@@ -5,7 +5,7 @@
* File: HashedInfiniteMap.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/map/HashedInfiniteMapEightNeighbours.java b/com/sun/electric/tool/routing/experimentalAStar3/map/HashedInfiniteMapEightNeighbours.java
index 8987380..9f72dce 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/map/HashedInfiniteMapEightNeighbours.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/map/HashedInfiniteMapEightNeighbours.java
@@ -5,7 +5,7 @@
* File: HashedInfiniteMapEightNeighbours.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/map/Region.java b/com/sun/electric/tool/routing/experimentalAStar3/map/Region.java
index 4ee63de..e7e8fef 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/map/Region.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/map/Region.java
@@ -5,7 +5,7 @@
* File: Region.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/map/RegionBoundingBox.java b/com/sun/electric/tool/routing/experimentalAStar3/map/RegionBoundingBox.java
index 77c31cb..a772da1 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/map/RegionBoundingBox.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/map/RegionBoundingBox.java
@@ -5,7 +5,7 @@
* File: RegionBoundingBox.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/memorymanager/AStarNodeObjectPool.java b/com/sun/electric/tool/routing/experimentalAStar3/memorymanager/AStarNodeObjectPool.java
index 2b549d9..6e56321 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/memorymanager/AStarNodeObjectPool.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/memorymanager/AStarNodeObjectPool.java
@@ -5,7 +5,7 @@
* File: AStarNodeObjectPool.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/memorymanager/AStarRegionNodeObjectPool.java b/com/sun/electric/tool/routing/experimentalAStar3/memorymanager/AStarRegionNodeObjectPool.java
index 6913bc9..c85f8e1 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/memorymanager/AStarRegionNodeObjectPool.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/memorymanager/AStarRegionNodeObjectPool.java
@@ -5,7 +5,7 @@
* File: AStarRegionNodeObjectPool.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/memorymanager/LinkedListObjectPool.java b/com/sun/electric/tool/routing/experimentalAStar3/memorymanager/LinkedListObjectPool.java
index e0b3b16..5b0330b 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/memorymanager/LinkedListObjectPool.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/memorymanager/LinkedListObjectPool.java
@@ -5,7 +5,7 @@
* File: LinkedListObjectPool.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/memorymanager/ObjectFactory.java b/com/sun/electric/tool/routing/experimentalAStar3/memorymanager/ObjectFactory.java
index 7272764..f18cc56 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/memorymanager/ObjectFactory.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/memorymanager/ObjectFactory.java
@@ -5,7 +5,7 @@
* File: ObjectFactory.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/memorymanager/ObjectPool.java b/com/sun/electric/tool/routing/experimentalAStar3/memorymanager/ObjectPool.java
index e0d7e28..286fa17 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/memorymanager/ObjectPool.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/memorymanager/ObjectPool.java
@@ -5,7 +5,7 @@
* File: ObjectPool.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/storage/AStarClosedListHashMap.java b/com/sun/electric/tool/routing/experimentalAStar3/storage/AStarClosedListHashMap.java
index 969523b..0674f85 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/storage/AStarClosedListHashMap.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/storage/AStarClosedListHashMap.java
@@ -5,7 +5,7 @@
* File: AStarClosedListHashMap.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/storage/AStarClosedListReferencing.java b/com/sun/electric/tool/routing/experimentalAStar3/storage/AStarClosedListReferencing.java
index ae1f1fd..bd842a2 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/storage/AStarClosedListReferencing.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/storage/AStarClosedListReferencing.java
@@ -5,7 +5,7 @@
* File: AStarClosedListReferencing.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/storage/AStarOpenListCheapList.java b/com/sun/electric/tool/routing/experimentalAStar3/storage/AStarOpenListCheapList.java
index 782e712..84e30e7 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/storage/AStarOpenListCheapList.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/storage/AStarOpenListCheapList.java
@@ -5,7 +5,7 @@
* File: AStarOpenListCheapList.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/storage/AStarOpenListPriorityQueue.java b/com/sun/electric/tool/routing/experimentalAStar3/storage/AStarOpenListPriorityQueue.java
index 72a5851..b954b30 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/storage/AStarOpenListPriorityQueue.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/storage/AStarOpenListPriorityQueue.java
@@ -5,7 +5,7 @@
* File: AStarOpenListPriorityQueue.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalAStar3/storage/AStarOpenListPriorityQueue2.java b/com/sun/electric/tool/routing/experimentalAStar3/storage/AStarOpenListPriorityQueue2.java
index a33e373..5c133b8 100644
--- a/com/sun/electric/tool/routing/experimentalAStar3/storage/AStarOpenListPriorityQueue2.java
+++ b/com/sun/electric/tool/routing/experimentalAStar3/storage/AStarOpenListPriorityQueue2.java
@@ -5,7 +5,7 @@
* File: AStarOpenListPriorityQueue2.java
* Written by: Christian Harnisch, Ingo Besenfelder, Michael Neumann (Team 3)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore1/BenchmarkRouter.java b/com/sun/electric/tool/routing/experimentalLeeMoore1/BenchmarkRouter.java
index 4e04b2a..acbe9e4 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore1/BenchmarkRouter.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore1/BenchmarkRouter.java
@@ -5,7 +5,7 @@
* File: BenchmarkRouter.java
* Written by: Andreas Uebelhoer, Alexander Bieles, Emre Selegin (Team 6)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore1/ConnectionPoints.java b/com/sun/electric/tool/routing/experimentalLeeMoore1/ConnectionPoints.java
index 7dc2693..5e16a6b 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore1/ConnectionPoints.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore1/ConnectionPoints.java
@@ -5,7 +5,7 @@
* File: ConnectionPoints.java
* Written by: Andreas Uebelhoer, Alexander Bieles, Emre Selegin (Team 6)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore1/FindVirtualEndInterface.java b/com/sun/electric/tool/routing/experimentalLeeMoore1/FindVirtualEndInterface.java
index 3667715..2e90dda 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore1/FindVirtualEndInterface.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore1/FindVirtualEndInterface.java
@@ -5,7 +5,7 @@
* File: FindVirtualEndInterface.java
* Written by: Andreas Uebelhoer, Alexander Bieles, Emre Selegin (Team 6)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore1/FindVirtualEnd_ProjectedAndRandomized.java b/com/sun/electric/tool/routing/experimentalLeeMoore1/FindVirtualEnd_ProjectedAndRandomized.java
index b7818d2..c3958ab 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore1/FindVirtualEnd_ProjectedAndRandomized.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore1/FindVirtualEnd_ProjectedAndRandomized.java
@@ -5,7 +5,7 @@
* File: FindVirtualEnd_ProjectedAndRandomized.java
* Written by: Andreas Uebelhoer, Alexander Bieles, Emre Selegin (Team 6)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore1/FindVirtualEnd_Simple.java b/com/sun/electric/tool/routing/experimentalLeeMoore1/FindVirtualEnd_Simple.java
index bc772d8..6c8f80c 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore1/FindVirtualEnd_Simple.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore1/FindVirtualEnd_Simple.java
@@ -5,7 +5,7 @@
* File: FindVirtualEnd_Simple.java
* Written by: Andreas Uebelhoer, Alexander Bieles, Emre Selegin (Team 6)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore1/LeeMoore/Route.java b/com/sun/electric/tool/routing/experimentalLeeMoore1/LeeMoore/Route.java
index e5a5443..04fb72a 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore1/LeeMoore/Route.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore1/LeeMoore/Route.java
@@ -5,7 +5,7 @@
* File: Route.java
* Written by: Andreas Uebelhoer, Alexander Bieles, Emre Selegin (Team 6)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore1/LeeMoore/RoutingArray.java b/com/sun/electric/tool/routing/experimentalLeeMoore1/LeeMoore/RoutingArray.java
index 3a3c788..dc7f0be 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore1/LeeMoore/RoutingArray.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore1/LeeMoore/RoutingArray.java
@@ -5,7 +5,7 @@
* File: RoutingArray.java
* Written by: Andreas Uebelhoer, Alexander Bieles, Emre Selegin (Team 6)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -464,7 +464,7 @@ public class RoutingArray {
* @param r route to save the result in
* @param length length of the route to find
* @param b borders to trace in
- * @return
+ * @return the Route.
*/
private Route trace(Route r, int length, ThreadBorders b) {
if (DEBUG) {
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore1/LeeMoore/Tupel.java b/com/sun/electric/tool/routing/experimentalLeeMoore1/LeeMoore/Tupel.java
index 7bf3bae..39d6dc7 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore1/LeeMoore/Tupel.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore1/LeeMoore/Tupel.java
@@ -5,7 +5,7 @@
* File: Tupel.java
* Written by: Andreas Uebelhoer, Alexander Bieles, Emre Selegin (Team 6)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore1/RoutingPart.java b/com/sun/electric/tool/routing/experimentalLeeMoore1/RoutingPart.java
index ca0ff82..1baf5ea 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore1/RoutingPart.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore1/RoutingPart.java
@@ -5,7 +5,7 @@
* File: RoutingPart.java
* Written by: Andreas Uebelhoer, Alexander Bieles, Emre Selegin (Team 6)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore1/ThreadBorders.java b/com/sun/electric/tool/routing/experimentalLeeMoore1/ThreadBorders.java
index 29552a3..4f7cc5c 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore1/ThreadBorders.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore1/ThreadBorders.java
@@ -5,7 +5,7 @@
* File: ThreadBorders.java
* Written by: Andreas Uebelhoer, Alexander Bieles, Emre Selegin (Team 6)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore1/Wiring.java b/com/sun/electric/tool/routing/experimentalLeeMoore1/Wiring.java
index 576c7c4..f3e5f2e 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore1/Wiring.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore1/Wiring.java
@@ -5,7 +5,7 @@
* File: Wiring.java
* Written by: Andreas Uebelhoer, Alexander Bieles, Emre Selegin (Team 6)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -359,7 +359,7 @@ public class Wiring {
* this method is used for multiterminal routing (not yet functional)
* @param rs
* @param edgePoints
- * @return
+ * @return true if ends are reversed.
*/
private static boolean containsEndReversed(RoutingSegment rs, List<Tupel> edgePoints) {
Tupel t1 = edgePoints.get(0);
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore1/WorkPartition.java b/com/sun/electric/tool/routing/experimentalLeeMoore1/WorkPartition.java
index c30b265..b7111ba 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore1/WorkPartition.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore1/WorkPartition.java
@@ -5,7 +5,7 @@
* File: WorkPartition.java
* Written by: Andreas Uebelhoer, Alexander Bieles, Emre Selegin (Team 6)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore1/WorkPool.java b/com/sun/electric/tool/routing/experimentalLeeMoore1/WorkPool.java
index 0eb6118..cf83ea0 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore1/WorkPool.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore1/WorkPool.java
@@ -5,7 +5,7 @@
* File: WorkPool.java
* Written by: Andreas Uebelhoer, Alexander Bieles, Emre Selegin (Team 6)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore1/WorkerThread.java b/com/sun/electric/tool/routing/experimentalLeeMoore1/WorkerThread.java
index 9920d0a..3f3fe51 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore1/WorkerThread.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore1/WorkerThread.java
@@ -5,7 +5,7 @@
* File: WorkerThread.java
* Written by: Andreas Uebelhoer, Alexander Bieles, Emre Selegin (Team 6)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore1/yana.java b/com/sun/electric/tool/routing/experimentalLeeMoore1/yana.java
index 9372bac..c4ff07a 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore1/yana.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore1/yana.java
@@ -5,7 +5,7 @@
* File: Yana.java
* Written by: Andreas Uebelhoer, Alexander Bieles, Emre Selegin (Team 6)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore2/AlgoVisualizerV3.java b/com/sun/electric/tool/routing/experimentalLeeMoore2/AlgoVisualizerV3.java
index 4f88231..d24de9c 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore2/AlgoVisualizerV3.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore2/AlgoVisualizerV3.java
@@ -5,7 +5,7 @@
* File: AlgoVisualizerV3.java
* Written by: Alexander Herzog (Team 4)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore2/BenchmarkRouter.java b/com/sun/electric/tool/routing/experimentalLeeMoore2/BenchmarkRouter.java
index 9094283..2e372d3 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore2/BenchmarkRouter.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore2/BenchmarkRouter.java
@@ -5,7 +5,7 @@
* File: BenchmarkRouter.java
* Written by: Alexander Herzog (Team 4)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore2/DemandTemplateHandler.java b/com/sun/electric/tool/routing/experimentalLeeMoore2/DemandTemplateHandler.java
index 5e93931..8acca82 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore2/DemandTemplateHandler.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore2/DemandTemplateHandler.java
@@ -5,7 +5,7 @@
* File: DemandTemplateHandler.java
* Written by: Alexander Herzog (Team 4)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore2/DetailedRouter.java b/com/sun/electric/tool/routing/experimentalLeeMoore2/DetailedRouter.java
index 09bba09..3c84fab 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore2/DetailedRouter.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore2/DetailedRouter.java
@@ -5,7 +5,7 @@
* File: DetailedRouter.java
* Written by: Alexander Herzog, Martin Fietz (Team 4)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore2/DetailedRouterWorker.java b/com/sun/electric/tool/routing/experimentalLeeMoore2/DetailedRouterWorker.java
index 5766354..55c9a80 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore2/DetailedRouterWorker.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore2/DetailedRouterWorker.java
@@ -5,7 +5,7 @@
* File: DetailedRouterWorker.java
* Written by: Alexander Herzog, Martin Fietz (Team 4)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore2/GlobalRouterAnalysis.java b/com/sun/electric/tool/routing/experimentalLeeMoore2/GlobalRouterAnalysis.java
index 097089a..06e4e34 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore2/GlobalRouterAnalysis.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore2/GlobalRouterAnalysis.java
@@ -5,7 +5,7 @@
* File: GlobalRouterAnalysis.java
* Written by: Alexander Herzog (Team 4)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore2/GlobalRouterPathFinder.java b/com/sun/electric/tool/routing/experimentalLeeMoore2/GlobalRouterPathFinder.java
index 9132ab0..782e51c 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore2/GlobalRouterPathFinder.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore2/GlobalRouterPathFinder.java
@@ -5,7 +5,7 @@
* File: GlobalRouterPathFinder.java
* Written by: Alexander Herzog (Team 4)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore2/GlobalRouterThreadV3.java b/com/sun/electric/tool/routing/experimentalLeeMoore2/GlobalRouterThreadV3.java
index c186cf5..e3f9bc3 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore2/GlobalRouterThreadV3.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore2/GlobalRouterThreadV3.java
@@ -5,7 +5,7 @@
* File: GlobalRouterThreadV3.java
* Written by: Alexander Herzog (Team 4)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore2/GlobalRouterV3.java b/com/sun/electric/tool/routing/experimentalLeeMoore2/GlobalRouterV3.java
index c00fe85..09affbc 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore2/GlobalRouterV3.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore2/GlobalRouterV3.java
@@ -5,7 +5,7 @@
* File: GlobalRouterV3.java
* Written by: Alexander Herzog (Team 4)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore2/RoutingFrameLeeMoore.java b/com/sun/electric/tool/routing/experimentalLeeMoore2/RoutingFrameLeeMoore.java
index e1fdae4..bc64531 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore2/RoutingFrameLeeMoore.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore2/RoutingFrameLeeMoore.java
@@ -5,7 +5,7 @@
* File: RoutingFrameLeeMoore.java
* Written by: Alexander Herzog, Martin Fietz (Team 4)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore3/BenchmarkRouter.java b/com/sun/electric/tool/routing/experimentalLeeMoore3/BenchmarkRouter.java
index 213cc3c..208d24f 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore3/BenchmarkRouter.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore3/BenchmarkRouter.java
@@ -5,7 +5,7 @@
* File: BenchmarkRouter.java
* Written by: Dennis Appelt, Sven Janko (Team 2)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore3/CouldNotCalculateVirtualTerminalException.java b/com/sun/electric/tool/routing/experimentalLeeMoore3/CouldNotCalculateVirtualTerminalException.java
index 6a9491d..22af854 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore3/CouldNotCalculateVirtualTerminalException.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore3/CouldNotCalculateVirtualTerminalException.java
@@ -5,7 +5,7 @@
* File: CouldNotCalculateVirtualTerminalException.java
* Written by: Dennis Appelt, Sven Janko (Team 2)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore3/DataGrid.java b/com/sun/electric/tool/routing/experimentalLeeMoore3/DataGrid.java
index 69f5f60..0adab66 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore3/DataGrid.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore3/DataGrid.java
@@ -5,7 +5,7 @@
* File: DataGrid.java
* Written by: Dennis Appelt, Sven Janko (Team 2)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore3/DistanceRatingFunction.java b/com/sun/electric/tool/routing/experimentalLeeMoore3/DistanceRatingFunction.java
index a58629d..aa8b759 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore3/DistanceRatingFunction.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore3/DistanceRatingFunction.java
@@ -5,7 +5,7 @@
* File: DistanceRatingFunction.java
* Written by: Dennis Appelt, Sven Janko (Team 2)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore3/ForcedDirectionRatingFunction.java b/com/sun/electric/tool/routing/experimentalLeeMoore3/ForcedDirectionRatingFunction.java
index c047930..1beda56 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore3/ForcedDirectionRatingFunction.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore3/ForcedDirectionRatingFunction.java
@@ -5,7 +5,7 @@
* File: ForcedDirectionRatingFunction.java
* Written by: Dennis Appelt, Sven Janko (Team 2)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore3/Gridpoint.java b/com/sun/electric/tool/routing/experimentalLeeMoore3/Gridpoint.java
index 11fae11..693b728 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore3/Gridpoint.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore3/Gridpoint.java
@@ -5,7 +5,7 @@
* File: Gridpoint.java
* Written by: Dennis Appelt, Sven Janko (Team 2)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore3/OutOfBoundsRatingFunction.java b/com/sun/electric/tool/routing/experimentalLeeMoore3/OutOfBoundsRatingFunction.java
index 0646aa8..270211b 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore3/OutOfBoundsRatingFunction.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore3/OutOfBoundsRatingFunction.java
@@ -5,7 +5,7 @@
* File: OutOfBoundsRatingFunction.java
* Written by: Dennis Appelt, Sven Janko (Team 2)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore3/Rating.java b/com/sun/electric/tool/routing/experimentalLeeMoore3/Rating.java
index db00927..c8ca66d 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore3/Rating.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore3/Rating.java
@@ -5,7 +5,7 @@
* File: Rating.java
* Written by: Dennis Appelt, Sven Janko (Team 2)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore3/RatingFunction.java b/com/sun/electric/tool/routing/experimentalLeeMoore3/RatingFunction.java
index 9d45d21..1d20999 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore3/RatingFunction.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore3/RatingFunction.java
@@ -5,7 +5,7 @@
* File: RatingFunction.java
* Written by: Dennis Appelt, Sven Janko (Team 2)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore3/RatingNotFoundException.java b/com/sun/electric/tool/routing/experimentalLeeMoore3/RatingNotFoundException.java
index f53fdc5..32ffe86 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore3/RatingNotFoundException.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore3/RatingNotFoundException.java
@@ -5,7 +5,7 @@
* File: RatingNotFoundException.java
* Written by: Dennis Appelt, Sven Janko (Team 2)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore3/RoutingFrameLeeMoore.java b/com/sun/electric/tool/routing/experimentalLeeMoore3/RoutingFrameLeeMoore.java
index addb7db..155faed 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore3/RoutingFrameLeeMoore.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore3/RoutingFrameLeeMoore.java
@@ -5,7 +5,7 @@
* File: RoutingFrameLeeMoore.java
* Written by: Dennis Appelt, Sven Janko (Team 2)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalLeeMoore3/ShiftInDirectionRatingFunction.java b/com/sun/electric/tool/routing/experimentalLeeMoore3/ShiftInDirectionRatingFunction.java
index e488674..990746d 100644
--- a/com/sun/electric/tool/routing/experimentalLeeMoore3/ShiftInDirectionRatingFunction.java
+++ b/com/sun/electric/tool/routing/experimentalLeeMoore3/ShiftInDirectionRatingFunction.java
@@ -5,7 +5,7 @@
* File: ShiftInDirectionRatingFunction.java
* Written by: Dennis Appelt, Sven Janko (Team 2)
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalSample/RoutingFrameSample.java b/com/sun/electric/tool/routing/experimentalSample/RoutingFrameSample.java
index 2de5e3f..2eeea5b 100644
--- a/com/sun/electric/tool/routing/experimentalSample/RoutingFrameSample.java
+++ b/com/sun/electric/tool/routing/experimentalSample/RoutingFrameSample.java
@@ -4,7 +4,7 @@
*
* File: RoutingFrameSample.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/experimentalSeaOfGates/RoutingFrameSeaOfGates.java b/com/sun/electric/tool/routing/experimentalSeaOfGates/RoutingFrameSeaOfGates.java
index 4756e7d..b3300d6 100644
--- a/com/sun/electric/tool/routing/experimentalSeaOfGates/RoutingFrameSeaOfGates.java
+++ b/com/sun/electric/tool/routing/experimentalSeaOfGates/RoutingFrameSeaOfGates.java
@@ -6,7 +6,7 @@
* Routing tool: Sea of Gates routing
* Written by: Steven M. Rubin
*
- * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/metrics/DetouringAmountMetric.java b/com/sun/electric/tool/routing/metrics/DetouringAmountMetric.java
index 94df973..9a0a752 100644
--- a/com/sun/electric/tool/routing/metrics/DetouringAmountMetric.java
+++ b/com/sun/electric/tool/routing/metrics/DetouringAmountMetric.java
@@ -4,7 +4,7 @@
*
* File: DetoruingAmountMetric.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/metrics/EvennessMetric.java b/com/sun/electric/tool/routing/metrics/EvennessMetric.java
index 0e26863..566ecf1 100644
--- a/com/sun/electric/tool/routing/metrics/EvennessMetric.java
+++ b/com/sun/electric/tool/routing/metrics/EvennessMetric.java
@@ -4,7 +4,7 @@
*
* File: EvennessMetric.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/metrics/HalfPerimeterWireLengthMetric.java b/com/sun/electric/tool/routing/metrics/HalfPerimeterWireLengthMetric.java
index 50638f6..2ad3c28 100644
--- a/com/sun/electric/tool/routing/metrics/HalfPerimeterWireLengthMetric.java
+++ b/com/sun/electric/tool/routing/metrics/HalfPerimeterWireLengthMetric.java
@@ -4,7 +4,7 @@
*
* File: WireQualityMetric.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/metrics/RoutingMetric.java b/com/sun/electric/tool/routing/metrics/RoutingMetric.java
index ca22385..88bcf76 100644
--- a/com/sun/electric/tool/routing/metrics/RoutingMetric.java
+++ b/com/sun/electric/tool/routing/metrics/RoutingMetric.java
@@ -4,7 +4,7 @@
*
* File: RoutingMetric.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/metrics/StackedViasAmountMetric.java b/com/sun/electric/tool/routing/metrics/StackedViasAmountMetric.java
index 163d8ae..ce40172 100644
--- a/com/sun/electric/tool/routing/metrics/StackedViasAmountMetric.java
+++ b/com/sun/electric/tool/routing/metrics/StackedViasAmountMetric.java
@@ -4,7 +4,7 @@
*
* File: StackedViasAmountMetric.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/metrics/ViaAmountMetric.java b/com/sun/electric/tool/routing/metrics/ViaAmountMetric.java
index 52c4527..077be9f 100644
--- a/com/sun/electric/tool/routing/metrics/ViaAmountMetric.java
+++ b/com/sun/electric/tool/routing/metrics/ViaAmountMetric.java
@@ -4,7 +4,7 @@
*
* File: ViaAmountMetric.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/metrics/WireLengthMetric.java b/com/sun/electric/tool/routing/metrics/WireLengthMetric.java
index 1d25951..678e645 100644
--- a/com/sun/electric/tool/routing/metrics/WireLengthMetric.java
+++ b/com/sun/electric/tool/routing/metrics/WireLengthMetric.java
@@ -4,7 +4,7 @@
*
* File: WireLengthMetric.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/metrics/WireQualityMetric.java b/com/sun/electric/tool/routing/metrics/WireQualityMetric.java
index b826b3e..4c75b55 100644
--- a/com/sun/electric/tool/routing/metrics/WireQualityMetric.java
+++ b/com/sun/electric/tool/routing/metrics/WireQualityMetric.java
@@ -4,7 +4,7 @@
*
* File: WireQualityMetric.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -79,8 +79,8 @@ public class WireQualityMetric extends RoutingMetric<QualityResults> {
public String toString()
{
StringBuffer buffer = new StringBuffer(nets.size() + " ");
- if (Job.getDebug())
- buffer.append(nets.toString());
+// if (Job.getDebug())
+// buffer.append(nets.toString());
return buffer.toString();
}
}
@@ -306,7 +306,7 @@ public class WireQualityMetric extends RoutingMetric<QualityResults> {
* Method to initialize quality measurements including
* machine information and instance to store quality values
* @param name net or cell name associated with results.
- * @return
+ * @return the quality results.
* @throws Exception UnknownHostException in case machine address can't be open
*/
protected QualityResults startLogging(String name) throws UnknownHostException
diff --git a/com/sun/electric/tool/routing/metrics/WiringOverflow.java b/com/sun/electric/tool/routing/metrics/WiringOverflow.java
index 6e33a7b..561bf6d 100644
--- a/com/sun/electric/tool/routing/metrics/WiringOverflow.java
+++ b/com/sun/electric/tool/routing/metrics/WiringOverflow.java
@@ -4,7 +4,7 @@
*
* File: WiringOverflow.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/routing/seaOfGates/SeaOfGatesCellBuilder.java b/com/sun/electric/tool/routing/seaOfGates/SeaOfGatesCellBuilder.java
index c1fb172..8604565 100644
--- a/com/sun/electric/tool/routing/seaOfGates/SeaOfGatesCellBuilder.java
+++ b/com/sun/electric/tool/routing/seaOfGates/SeaOfGatesCellBuilder.java
@@ -4,7 +4,7 @@
*
* File: SeaOfGatesCellBuilder.java
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -33,7 +33,6 @@ import com.sun.electric.database.ImmutableNodeInst;
import com.sun.electric.database.Snapshot;
import com.sun.electric.database.geometry.EGraphics;
import com.sun.electric.database.geometry.EPoint;
-import com.sun.electric.database.geometry.ERectangle;
import com.sun.electric.database.geometry.Poly;
import com.sun.electric.database.hierarchy.View;
import com.sun.electric.database.id.ArcProtoId;
@@ -45,22 +44,18 @@ import com.sun.electric.database.id.PrimitiveNodeId;
import com.sun.electric.database.prototype.PortCharacteristic;
import com.sun.electric.database.text.CellName;
import com.sun.electric.database.text.Name;
-import com.sun.electric.database.text.TextUtils;
import com.sun.electric.database.variable.TextDescriptor;
import com.sun.electric.technology.AbstractShapeBuilder;
-import com.sun.electric.technology.EdgeH;
-import com.sun.electric.technology.EdgeV;
import com.sun.electric.technology.Layer;
import com.sun.electric.technology.PrimitiveNode;
import com.sun.electric.technology.PrimitivePort;
import com.sun.electric.technology.TechPool;
-import com.sun.electric.technology.Technology;
import com.sun.electric.technology.technologies.Generic;
import com.sun.electric.tool.Job;
import com.sun.electric.tool.Tool;
import com.sun.electric.tool.routing.Routing.SoGContactsStrategy;
-import com.sun.electric.util.math.FixpCoord;
-import com.sun.electric.util.math.GenMath;
+import com.sun.electric.tool.routing.seaOfGates.SeaOfGatesHandlers.ContactKey;
+import com.sun.electric.tool.routing.seaOfGates.SeaOfGatesHandlers.ContactTemplate;
import com.sun.electric.util.math.Orientation;
import java.util.ArrayList;
@@ -77,33 +72,34 @@ import java.util.Set;
import java.util.TreeMap;
/**
- *
- * @author dn146861
+ * Class for creating final circuitry in Sea of Gates router.
+ * @author Dmitry Nadezhin
*/
class SeaOfGatesCellBuilder {
private static final boolean FINDEXISTINGCELLS = true;
private final EditingPreferences ep;
- // oldSnapshot
+
+ // oldSnapshot
private final Snapshot oldSnapshot;
private final Tool oldTool;
private final Environment oldEnvironment;
private final CellTree oldCellTree;
private final CellBackup oldCellBackup;
-// private final CellTree[] oldCellTrees;
private final TechPool oldTechPool;
private final CellRevision oldCellRevision;
private final ImmutableCell oldCell;
final CellId cellId;
final String resultCellName;
final SoGContactsStrategy contactPlacementAction;
+
// curSnapshot
private Snapshot curSnapshot;
private final List<CellBackup> curCellBackups;
-// private CellTree curCellTree;
private CellBackup curCellBackup;
private Map<ContactKey,ContactTemplate> contactTemplates = new HashMap<ContactKey,ContactTemplate>();
+
// nodes
private final BitSet curNodes = new BitSet();
private int curNodesCount;
@@ -112,13 +108,14 @@ class SeaOfGatesCellBuilder {
private final IdentityHashMap<PrimitiveNodeId, MaxNodeSuffix> maxNodeSuffixes = new IdentityHashMap<PrimitiveNodeId, MaxNodeSuffix>();
private final IdentityHashMap<SeaOfGatesEngine.RouteNode, ImmutableNodeInst> addedNodesToNodeInst = new IdentityHashMap<SeaOfGatesEngine.RouteNode, ImmutableNodeInst>();
private final IdentityHashMap<SeaOfGatesEngine.RouteNode, PortProtoId> addedNodesToPortProtoId = new IdentityHashMap<SeaOfGatesEngine.RouteNode, PortProtoId>();
+
// arcs
private final List<ImmutableArcInst> curArcs = new ArrayList<ImmutableArcInst>();
private int maxArcSuffix;
// result CellBackup
private final MyShapeBuilder resultShapeBuilder;
-
+
SeaOfGatesCellBuilder(Snapshot snapshot, CellId cellId, String resultCellName, SoGContactsStrategy contactPlacementAction, EditingPreferences ep) {
this.ep = ep;
@@ -131,12 +128,10 @@ class SeaOfGatesCellBuilder {
oldEnvironment = oldSnapshot.environment;
oldCellTree = snapshot.getCellTree(cellId);
oldCellBackup = oldCellTree.top;
-// oldCellTrees = oldCellTree.getSubTrees();
oldTechPool = oldCellTree.techPool;
oldCellRevision = oldCellBackup.cellRevision;
oldCell = oldCellRevision.d;
-
curCellBackups = new ArrayList<CellBackup>();
if (resultCellName != null) {
CellId resultCellId = cellId.libId.newCellId(CellName.newName(resultCellName, View.LAYOUT, 1));
@@ -152,7 +147,7 @@ class SeaOfGatesCellBuilder {
int cellIndex = cellTree.top.cellRevision.d.cellId.cellIndex;
while (curCellBackups.size() <= cellIndex) {
curCellBackups.add(null);
- }
+ }
curCellBackups.set(cellIndex, cellTree.top);
}
}
@@ -207,7 +202,6 @@ class SeaOfGatesCellBuilder {
}
curSnapshot = oldSnapshot;
-// curCellTree = oldCellTree;
curCellBackup = oldCellBackup;
}
@@ -220,10 +214,10 @@ class SeaOfGatesCellBuilder {
*/
private ContactTemplate getTemplateForContact(PrimitiveNode pNp, EPoint size, int techBits)
{
- ContactKey contactKey = new ContactKey(pNp, size, techBits);
+ SeaOfGatesHandlers.ContactKey contactKey = new SeaOfGatesHandlers.ContactKey(pNp, size, techBits);
return contactTemplates.get(contactKey);
}
-
+
/**
* Method to create a CellId to describe a given primitive node, when encapsulated
* @param pNp the contact to package.
@@ -234,27 +228,19 @@ class SeaOfGatesCellBuilder {
private void makeTemplateForContact(PrimitiveNode pNp, EPoint size, int techBits)
{
assert pNp.getFunction().isContact();
- ContactKey contactKey = new ContactKey(pNp, size, techBits);
+ SeaOfGatesHandlers.ContactKey contactKey = new SeaOfGatesHandlers.ContactKey(pNp, size, techBits);
Name nodeName = pNp.getPrimitiveFunction(techBits).getBasename().findSuffixed(0);
- nodeName = (contactPlacementAction == SoGContactsStrategy.SOGCONTACTSUSEEXISTINGSUBCELLS) ?
+ nodeName = (contactPlacementAction == SoGContactsStrategy.SOGCONTACTSUSEEXISTINGSUBCELLS) ?
pNp.getPrimitiveFunction(techBits).getBasename().findSuffixed(0) : Name.findName(contactKey.toString());
CellBackup contactCellBackup = null;
Orientation contactTemplateOrientation = Orientation.IDENT;
if (FINDEXISTINGCELLS && contactPlacementAction != SoGContactsStrategy.SOGCONTACTSFORCESUBCELLS)
{
-//System.out.println("LOOKING FOR A MATCH FOR PRIMITIVE "+contactKey);
ImmutableNodeInst n = ImmutableNodeInst.newInstance(0, pNp.getId(), nodeName, TextDescriptor.EMPTY, Orientation.IDENT,
EPoint.ORIGIN, size, 0, techBits, TextDescriptor.EMPTY);
MyShapeBuilder conShape = new MyShapeBuilder();
pNp.genShape(conShape, n);
-//System.out.println("Con shape:");
-//for (ImmutableNodeInst sn: conShape.nodes)
-//{
-// PrimitiveNode pn = oldTechPool.getPrimitiveNode((PrimitiveNodeId) sn.protoId);
-// assert pn.getFunction() == PrimitiveNode.Function.NODE;
-// System.out.println(" " + pn + " " + sn.size + " " + sn.anchor);
-//}
MyShapeBuilder conShapeRot = new MyShapeBuilder();
pNp.genShape(conShapeRot, n.withOrient(Orientation.R));
for (CellBackup cellBackup: curCellBackups)
@@ -263,20 +249,18 @@ class SeaOfGatesCellBuilder {
if (cellBackup.cellRevision.d.cellId.libId != cellId.libId) continue;
if (doesCellMatch(cellBackup, conShape))
{
-//System.out.println(" FOUND CELL "+cellBackup.cellRevision.d.cellId+" THAT MATCHES PRIMITIVE "+contactKey);
contactCellBackup = cellBackup;
break;
}
if (doesCellMatch(cellBackup, conShapeRot))
{
-//System.out.println(" FOUND CELL "+cellBackup.cellRevision.d.cellId+" THAT (WHEN ROTATED) MATCHES PRIMITIVE "+contactKey);
contactCellBackup = cellBackup;
contactTemplateOrientation = Orientation.R;
break;
}
}
}
-
+
CellId contactCellId;
if (contactCellBackup != null)
{
@@ -286,16 +270,15 @@ class SeaOfGatesCellBuilder {
{
// Contact cell has exports, Pick the first.
ExportId eId = contactCellBackup.cellRevision.exports.iterator().next().exportId;
- ContactTemplate contactTemplate = new ContactTemplate(contactCellId, contactTemplateOrientation, eId);
+ SeaOfGatesHandlers.ContactTemplate contactTemplate = new SeaOfGatesHandlers.ContactTemplate(contactCellId, contactTemplateOrientation, eId);
contactTemplates.put(contactKey, contactTemplate);
return;
}
// Instantiate universal pin instead of pure layer node
pNp = Generic.tech().universalPinNode;
- nodeName = (contactPlacementAction == SoGContactsStrategy.SOGCONTACTSUSEEXISTINGSUBCELLS) ?
+ nodeName = (contactPlacementAction == SoGContactsStrategy.SOGCONTACTSUSEEXISTINGSUBCELLS) ?
pNp.getPrimitiveFunction(techBits).getBasename().findSuffixed(0) : Name.findName(contactKey.toString());
- }
- else
+ } else
{
if (contactPlacementAction == SoGContactsStrategy.SOGCONTACTSUSEEXISTINGSUBCELLS) return;
// Create a new contact cell
@@ -308,17 +291,17 @@ class SeaOfGatesCellBuilder {
contactCellBackup = CellBackup.newInstance(c, oldTechPool);
curCellBackups.set(contactCellId.cellIndex, contactCellBackup);
}
-
+
// Create ImmutableNodeInst
int nodeId = contactCellBackup.cellRevision.getMaxNodeId() + 1;
TextDescriptor nameTd = ep.getNodeTextDescriptor();
EPoint anchor = EPoint.ORIGIN;
int flags = 0;
TextDescriptor protoTd = ep.getInstanceTextDescriptor();
- ImmutableNodeInst n =
+ ImmutableNodeInst n =
ImmutableNodeInst.newInstance(nodeId, pNp.getId(), nodeName, nameTd, Orientation.IDENT,
anchor, size, flags, techBits, protoTd);
-
+
// Create ImmuatbleExport
String portName = "port";
ExportId exportId = contactCellId.newPortId(portName);
@@ -327,7 +310,7 @@ class SeaOfGatesCellBuilder {
boolean bodyOnly = false;
ImmutableExport e = ImmutableExport.newInstance(exportId, Name.findName(portName), portTd,
nodeId, pNp.getPort(0).getId(), alwaysDrawn, bodyOnly, PortCharacteristic.UNKNOWN);
-
+
// Insert node instance into new nodes array
ImmutableNodeInst[] nodesArray = new ImmutableNodeInst[contactCellBackup.cellRevision.nodes.size() + 1];
ImmutableNodeInst nodeToInsert = n;
@@ -348,18 +331,18 @@ class SeaOfGatesCellBuilder {
nodesArray[nodeIndex++] = nodeToInsert;
}
assert nodeIndex == nodesArray.length;
-
+
// Update CellBackup
ImmutableExport[] exportsArray = { e };
contactCellBackup = contactCellBackup.with(contactCellBackup.cellRevision.d,
nodesArray, null, exportsArray, oldTechPool);
curCellBackups.set(contactCellId.cellIndex, contactCellBackup);
-
+
// save ContactTemplate
- ContactTemplate contactTemplate = new ContactTemplate(contactCellId, contactTemplateOrientation, exportId);
+ SeaOfGatesHandlers.ContactTemplate contactTemplate = new SeaOfGatesHandlers.ContactTemplate(contactCellId, contactTemplateOrientation, exportId);
contactTemplates.put(contactKey, contactTemplate);
}
-
+
private boolean doesCellMatch(CellBackup contactCellBackup, MyShapeBuilder sb)
{
List<ImmutableNodeInst> shapeNodes = sb.nodes;
@@ -403,7 +386,7 @@ class SeaOfGatesCellBuilder {
PrimitiveNodeId protoId = (PrimitiveNodeId) rn.getProtoId();
PrimitiveNode pNp = oldTechPool.getPrimitiveNode(protoId);
if (!pNp.getFunction().isContact()) continue;
- ContactTemplate contactTemplate = getTemplateForContact(pNp, rn.getSize(), rn.getTechBits());
+ SeaOfGatesHandlers.ContactTemplate contactTemplate = getTemplateForContact(pNp, rn.getSize(), rn.getTechBits());
if (contactTemplate == null)
{
makeTemplateForContact(pNp, rn.getSize(), rn.getTechBits());
@@ -442,7 +425,7 @@ class SeaOfGatesCellBuilder {
Orientation orient = Orientation.IDENT;
if (pNp.getFunction().isContact())
{
- ContactTemplate contactTemplate = getTemplateForContact(pNp, rn.getSize(), rn.getTechBits());
+ SeaOfGatesHandlers.ContactTemplate contactTemplate = getTemplateForContact(pNp, rn.getSize(), rn.getTechBits());
if (contactTemplate != null)
{
// place cell "c" instead of primitive "protoId"
@@ -480,7 +463,9 @@ class SeaOfGatesCellBuilder {
if (protoId != pnId) {
resultShapeBuilder.nodes.add(n);
} else {
+ int startNodeId = resultShapeBuilder.getNextNodeId();
oldTechPool.getPrimitiveNode(pnId).genShape(resultShapeBuilder, n);
+ n = resultShapeBuilder.nodes.get(startNodeId);
}
} else {
maxSuffix.add(n);
@@ -502,7 +487,6 @@ class SeaOfGatesCellBuilder {
if (ra.getName() != null) newName = Name.findName(ra.getName());
if (newName != null && !newName.isTempname())
{
-// System.out.println("NAMING NETWORK "+newName);
name = newName;
} else
{
@@ -581,143 +565,18 @@ class SeaOfGatesCellBuilder {
resolution.clearRoutes();
}
- private static class ContactKey
- {
- final PrimitiveNode pNp;
- final EPoint size;
- final int techBits;
-
- ContactKey(PrimitiveNode pNp, EPoint size, int techBits)
- {
- if (pNp == null || size == null) throw new NullPointerException();
- this.pNp = pNp;
- this.size = size;
- this.techBits = techBits;
- }
-
- @Override
- public boolean equals(Object o)
- {
- if (o instanceof ContactKey)
- {
- ContactKey that = (ContactKey) o;
- return this.pNp.equals(that.pNp) && this.size.equals(that.size) && this.techBits == that.techBits;
- }
- return false;
- }
-
- @Override
- public int hashCode()
- {
- return 89 * pNp.hashCode() + size.hashCode() + techBits;
- }
-
- @Override
- public String toString() {
- assert(pNp instanceof PrimitiveNode);
-
- PrimitiveNode pn = (PrimitiveNode)pNp;
- double scale = pn.getTechnology().getScale();
- ERectangle base = pn.getBaseRectangle();
-// double wid = size.getX() + base.getWidth();
-// double hei = size.getY() + base.getHeight();
-// String s = pNp.getName();
-// if (techBits != 0)
-// s += "-" + techBits;
-
- double[] xExt = new double[2];
- double[] yExt = new double[2];
- double[] viaSize = new double[2];
- double[] viaSpacing = new double[2];
- String[] names = new String[2];
- int count = 0;
-
- for (Technology.NodeLayer node : pn.getNodeLayers())
- {
- Layer l = node.getLayer();
-
- if (l.getFunction().isContact())
- {
- // via size
- viaSize[0] = (FixpCoord.fixpToLambda(node.getMulticutSizeX().getFixp())); // x value
- viaSize[1] = (FixpCoord.fixpToLambda(node.getMulticutSizeY().getFixp())); // y value
- // via spacing
- // @TODO assuming 1x1 cuts
- viaSpacing[0] = (FixpCoord.fixpToLambda(node.getMulticutSep1D().getFixp())); // x value
- viaSpacing[1] = (FixpCoord.fixpToLambda(node.getMulticutSep1D().getFixp())); // y value
- continue;
- }
- String tmp = l.getName();
- assert(count < 2);
- // two potential substitutions
- tmp = tmp.replaceAll("_MASK_1", "CA");
- tmp = tmp.replaceAll("_MASK_2", "CB");
- names[(count+1)%2] = tmp; // the upper layer must be first in names. First layer is alwayss the bottom
- EdgeH leftEdge = node.getLeftEdge();
- EdgeH rightEdge = node.getRightEdge();
- EdgeV topEdge = node.getTopEdge();
- EdgeV bottomEdge = node.getBottomEdge();
- long portLowX = leftEdge.getFixpValue(size);
- long portHighX = rightEdge.getFixpValue(size);
- long portLowY = bottomEdge.getFixpValue(size);
- long portHighY = topEdge.getFixpValue(size);
- xExt[count] = FixpCoord.fixpToLambda(portHighX-portLowX);
- yExt[count] = FixpCoord.fixpToLambda(portHighY-portLowY);
- count++;
-
- }
- // do extra process with vias once values have been identified
- for (int i = 0; i < 2; i++)
- {
- xExt[i] = (xExt[i] - viaSize[0])*scale/2;
- yExt[i] = (yExt[i] - viaSize[1])*scale/2;
- }
-
- // using -1 as number of fractions to force zero digits
- String newName = names[0] + "_" + names[1] + "_"; // first the upper in names
- newName += "X_"
- + TextUtils.formatDouble(viaSize[0]*scale, -1) + "_" + TextUtils.formatDouble(viaSize[1]*scale, -1)
- + "_1_1_"
- + TextUtils.formatDouble(viaSpacing[0]*scale, -1) + "_" + TextUtils.formatDouble(viaSpacing[1]*scale, -1) + "_"
- + TextUtils.formatDouble(xExt[0], -1) + "_" + TextUtils.formatDouble(yExt[0], -1) + "_"
- + TextUtils.formatDouble(xExt[1], -1) + "_" + TextUtils.formatDouble(yExt[1], -1);
- //System.out.println(" name " + newName);
- //System.out.println(s + "-" + TextUtils.formatDouble(wid, 0) + "-" + TextUtils.formatDouble(hei, 0));
- //return s + "-" + TextUtils.formatDouble(wid, 0) + "-" + TextUtils.formatDouble(hei, 0);
- return newName;
- }
-
- CellName getDefaultCellName() {
- return CellName.parseName(this + ";1{lay}");
- }
- }
-
- private static class ContactTemplate
- {
- final CellId cellId;
- final Orientation orient;
- final ExportId exportId;
-
- ContactTemplate(CellId cellId, Orientation orient, ExportId exportId)
- {
- this.cellId = cellId;
- this.orient = orient;
- this.exportId = exportId;
- }
- }
-
private class MyShapeBuilder extends AbstractShapeBuilder {
private final CellId cellId;
private final TextDescriptor nameTd = ep.getNodeTextDescriptor();
private final TextDescriptor protoTd = ep.getInstanceTextDescriptor();
private CellBackup cellBackup;
private final List<ImmutableNodeInst> nodes = new ArrayList<ImmutableNodeInst>();
-
+
MyShapeBuilder() {
cellId = null;
cellBackup = null;
}
-
+
MyShapeBuilder(CellId cellId) {
setup(oldTechPool);
this.cellId = cellId;
@@ -733,11 +592,11 @@ class SeaOfGatesCellBuilder {
int getNextNodeId() {
return nodes.size();
}
-
+
Name getNextName() {
return Name.findName("plnode@" + getNextNodeId());
}
-
+
@Override
protected void addPoly(int numPoints, Poly.Type style, Layer layer, EGraphics graphicsOverride, PrimitivePort pp)
{
@@ -789,7 +648,7 @@ class SeaOfGatesCellBuilder {
Orientation.IDENT, anchor, size,
0, 0, protoTd));
}
-
+
CellBackup commit() {
cellBackup = cellBackup.with(cellBackup.cellRevision.d,
nodes.toArray(new ImmutableNodeInst[nodes.size()]),
@@ -797,52 +656,6 @@ class SeaOfGatesCellBuilder {
return cellBackup;
}
}
-
- private void makeGridBox(long[] gridCoords, EPoint tailLocation, boolean tailExtended, EPoint headLocation, boolean headExtended, long gridExtend)
- {
- long et = tailExtended ? gridExtend : 0;
- long eh = headExtended ? gridExtend : 0;
- long m;
- long lx, ly, hx, hy;
- int angle = GenMath.figureAngle(tailLocation, headLocation);
- switch (angle) {
- case -1:
- case 0:
- m = tailLocation.getGridY();
- lx = tailLocation.getGridX() - et;
- ly = m - gridExtend;
- hx = headLocation.getGridX() + eh;
- hy = m + gridExtend;
- break;
- case 900:
- m = tailLocation.getGridX();
- lx = m - gridExtend;
- ly = tailLocation.getGridY() - et;
- hx = m + gridExtend;
- hy = headLocation.getGridY() + eh;
- break;
- case 1800:
- m = tailLocation.getGridY();
- lx = headLocation.getGridX() - eh;
- ly = m - gridExtend;
- hx = tailLocation.getGridX() + et;
- hy = m + gridExtend;
- break;
- case 2700:
- m = tailLocation.getGridX();
- lx = m - gridExtend;
- ly = headLocation.getGridY() - eh;
- hx = m + gridExtend;
- hy = tailLocation.getGridY() + et;
- break;
- default:
- throw new AssertionError();
- }
- gridCoords[0] = lx;
- gridCoords[1] = ly;
- gridCoords[2] = hx;
- gridCoords[3] = hy;
- }
Snapshot commit() {
ImmutableNodeInst[] newNodes;
@@ -937,11 +750,11 @@ class SeaOfGatesCellBuilder {
return index >= 0 ? index : -(index + 1);
}
- private int searchArcInsertionPoint(String basename) {
- assert basename.endsWith("@0");
- char nextChar = (char) (basename.charAt(basename.length() - 2) + 1);
- String nextName = basename.substring(0, basename.length() - 2) + nextChar;
- int index = oldCellRevision.arcs.searchByName(nextName);
- return index >= 0 ? index : -(index + 1);
- }
+// private int searchArcInsertionPoint(String basename) {
+// assert basename.endsWith("@0");
+// char nextChar = (char) (basename.charAt(basename.length() - 2) + 1);
+// String nextName = basename.substring(0, basename.length() - 2) + nextChar;
+// int index = oldCellRevision.arcs.searchByName(nextName);
+// return index >= 0 ? index : -(index + 1);
+// }
}
diff --git a/com/sun/electric/tool/routing/seaOfGates/SeaOfGatesEngine.java b/com/sun/electric/tool/routing/seaOfGates/SeaOfGatesEngine.java
index b07be25..59167fa 100644
--- a/com/sun/electric/tool/routing/seaOfGates/SeaOfGatesEngine.java
+++ b/com/sun/electric/tool/routing/seaOfGates/SeaOfGatesEngine.java
@@ -6,7 +6,7 @@
* Routing tool: Sea of Gates routing
* Written by: Steven M. Rubin
*
- * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -65,6 +65,7 @@ import com.sun.electric.technology.Technology.NodeLayer;
import com.sun.electric.technology.technologies.Generic;
import com.sun.electric.tool.Job;
import com.sun.electric.tool.drc.DRC;
+import com.sun.electric.tool.routing.Routing.SoGNetOrder;
import com.sun.electric.tool.routing.SeaOfGates;
import com.sun.electric.tool.routing.SeaOfGates.SeaOfGatesArcProperties;
import com.sun.electric.tool.routing.SeaOfGates.SeaOfGatesCellParameters;
@@ -87,7 +88,10 @@ import com.sun.electric.util.math.Orientation;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.io.Serializable;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
@@ -137,9 +141,8 @@ import java.util.regex.Pattern;
public abstract class SeaOfGatesEngine
{
// code switches
+ /** true to allow multiple destinations. */ private static final boolean MULTIPLEDESTINATIONS = true;
/** true to run both directions and choose best */ private static final boolean CHECKBOTHDIRECTIONS = false;
- /** true to use new minimum area detection */ private static final boolean MINAREACHECK = true;
- /** true to use new via spacing calculation */ private static final boolean NEWVIACALC = true;
/** true to ignore grid errors at start of route */ private static final boolean NOGRIDPENALTYATSOURCE = true;
/** true to route to any point on the destination */ private static final boolean ANYPOINTONDESTINATION = true;
@@ -160,14 +163,14 @@ public abstract class SeaOfGatesEngine
/** Bit set in network ID for user-supplied blockage. */ private static final int BLOCKAGEFAKEUSERSUPPLIED = 8;
/** Number of bits to shift to skip blockage bits */ private static final int SHIFTBLOCKBITS = 4;
- public static SearchVertex svAborted = new SearchVertex(0, 0, 0, 0, 0, null, null, 0, null, 0);
- public static SearchVertex svExhausted = new SearchVertex(0, 0, 0, 0, 0, null, null, 0, null, 0);
- public static SearchVertex svLimited = new SearchVertex(0, 0, 0, 0, 0, null, null, 0, null, 0);
- public static SearchVertex svAbandoned = new SearchVertex(0, 0, 0, 0, 0, null, null, 0, null, 0);
+ public static SearchVertex svAborted = new SearchVertex(0, 0, 0, 0, 0, null, null, 0, null, 0, null);
+ public static SearchVertex svExhausted = new SearchVertex(0, 0, 0, 0, 0, null, null, 0, null, 0, null);
+ public static SearchVertex svLimited = new SearchVertex(0, 0, 0, 0, 0, null, null, 0, null, 0, null);
+ public static SearchVertex svAbandoned = new SearchVertex(0, 0, 0, 0, 0, null, null, 0, null, 0, null);
/** number of metal layers in the technology. */ private static int numMetalLayers;
- /** Environment */ private Environment env;
+ /** Environment */ private Environment env;
/** Cell in which routing occurs. */ private Cell cell;
/** true to run to/from and from/to routing in parallel */ private boolean parallelDij;
/** for logging errors */ private ErrorLogger errorLogger;
@@ -194,12 +197,15 @@ public abstract class SeaOfGatesEngine
/** metal gridding range for the cell. */ private double[] metalGridRange;
/** spacing rules for a given metal layer. */ private double[] metalSurroundX, metalSurroundY;
/** minimum spacing between the corners of two vias. */ private double[] viaSurround;
+ /** spacing between 3 or 4 diagonal vias. */ private double[] viaDiagonalDistance;
+ /** spacing vias with different mask colors. */ private double[] viaColorDiffSpacing;
+ /** method for secret via rules. */ private Method[] secretViaSpacingRules;
/** minimum size of two vias. */ private double[] viaSize;
/** R-Trees for routing blockages */ private BlockageTrees rTrees;
/** converts Networks to unique integers */ private Map<Network, Integer> netIDs;
/** preferences */ private SeaOfGates.SeaOfGatesOptions prefs;
- /** interaction with outer environment */ private Handler handler;
- /** EditingPreferences */ private EditingPreferences ep;
+ /** interaction with outer environment */ private Handler handler;
+ /** EditingPreferences */ private EditingPreferences ep;
/** cell-specific parameters */ private SeaOfGatesCellParameters sogp;
/** taps that need to be added to spine routes */ private List<NeededRoute> tapRoutes;
/** true to keep messages quiet */ private boolean messagesQuiet;
@@ -239,18 +245,22 @@ public abstract class SeaOfGatesEngine
*/
public void routeIt(Handler handler, Cell cell, boolean quiet, List<ArcInst> arcsToRoute, SeaOfGatesCellParameters sogp)
{
- messagesQuiet = quiet;
// initialize routing
+ messagesQuiet = quiet;
this.handler = handler;
ep = handler.getEditingPreferences();
env = cell.getDatabase().getEnvironment();
this.sogp = sogp;
- this.tapRoutes = new ArrayList<NeededRoute>();
+ tapRoutes = new ArrayList<NeededRoute>();
this.cell = cell;
cellBounds = cell.getBounds();
tech = cell.getTechnology();
+ // printing preferences for debugging purposes
+ if (Job.getDebug())
+ System.out.println("Preferences " + prefs);
+
// find the routing bounds limit
routingBoundsLimit = null;
String routingBoundsLayerName = sogp.getRoutingBoundsLayerName();
@@ -259,7 +269,8 @@ public abstract class SeaOfGatesEngine
Layer boundsLayer = tech.findLayer(routingBoundsLayerName);
if (boundsLayer == null)
{
- System.out.println("WARNING: Routing bounds layer '" + routingBoundsLayerName + "' not found in technology " + tech.getTechName());
+ if (!RoutingDebug.isActive())
+ System.out.println("WARNING: Routing bounds layer '" + routingBoundsLayerName + "' not found in technology " + tech.getTechName());
} else
{
List<NodeInst> boundsLayerNodes = new ArrayList<NodeInst>();
@@ -281,18 +292,21 @@ public abstract class SeaOfGatesEngine
}
if (boundsLayerNodes.size() == 0)
{
- System.out.println("WARNING: No nodes found with the routing bounds layer '" + routingBoundsLayerName + "'");
+ if (!RoutingDebug.isActive())
+ System.out.println("WARNING: No nodes found with the routing bounds layer '" + routingBoundsLayerName + "'");
} else if (boundsLayerNodes.size() > 1)
{
- System.out.println("WARNING: Found " + boundsLayerNodes.size() + " nodes with the routing bounds layer, must have only 1.");
+ if (!RoutingDebug.isActive())
+ System.out.println("WARNING: Found " + boundsLayerNodes.size() + " nodes with the routing bounds layer, must have only 1.");
} else
{
NodeInst ni = boundsLayerNodes.get(0);
routingBoundsLimit = ni.getBounds();
- System.out.println("NOTE: No routes will extend beyond " + TextUtils.formatDistance(routingBoundsLimit.getMinX()) +
- "<=X<=" + TextUtils.formatDistance(routingBoundsLimit.getMaxX()) + " AND " +
- TextUtils.formatDistance(routingBoundsLimit.getMinY()) + "<=Y<=" +
- TextUtils.formatDistance(routingBoundsLimit.getMaxY()));
+ if (!RoutingDebug.isActive())
+ System.out.println("NOTE: No routes will extend beyond " + TextUtils.formatDistance(routingBoundsLimit.getMinX()) +
+ "<=X<=" + TextUtils.formatDistance(routingBoundsLimit.getMaxX()) + " AND " +
+ TextUtils.formatDistance(routingBoundsLimit.getMinY()) + "<=Y<=" +
+ TextUtils.formatDistance(routingBoundsLimit.getMaxY()));
}
}
}
@@ -306,6 +320,43 @@ public abstract class SeaOfGatesEngine
// get arcs to route
List<String> netsToRoute = sogp.getNetsToRoute();
+
+ // Sort names based arc distances
+ if (prefs.netOrder == SoGNetOrder.SOGNETORDERDESCENDING || prefs.netOrder == SoGNetOrder.SOGNETORDERASCENDING)
+ Collections.sort(netsToRoute, new SortArcByDistance(cell, prefs.netOrder));
+ else if (netsToRoute != null && prefs.netOrder == SoGNetOrder.SOGNETORDERBUS)
+ {
+ Map<String,BusBitsNumberClass> busMap = new HashMap<String,BusBitsNumberClass>(); // counting number of bits per bus
+ List<String> simpleNets = new ArrayList<String>();
+
+ for (String s : netsToRoute)
+ {
+ int index = s.indexOf("[");
+ if (index != -1)
+ {
+ String bus = s.substring(0, index);
+ BusBitsNumberClass list = busMap.get(bus);
+ if (list == null)
+ {
+ list = new BusBitsNumberClass(bus);
+ busMap.put(bus, list);
+ }
+ list.bits.add(s.substring(index));
+ }
+ else
+ simpleNets.add(s);
+ }
+
+ // sort busses based on number of bits
+ List<BusBitsNumberClass> listToSort = new ArrayList<BusBitsNumberClass>(busMap.values());
+ Collections.sort(listToSort, new SortByBusBitsNumberClass());
+ netsToRoute.clear();
+ // adding the multiple connection nets first
+ for (BusBitsNumberClass bus: listToSort)
+ netsToRoute.addAll(bus.getNets());
+ netsToRoute.addAll(simpleNets);
+ }
+
if (netsToRoute != null && netsToRoute.size() > 0)
{
// overriding nets are listed in the Sea-of-Gates Cell Properties, see if the user selected an overriding subset
@@ -324,14 +375,31 @@ public abstract class SeaOfGatesEngine
arcsToRoute = new ArrayList<ArcInst>();
for(String netName : netsToRoute)
{
+ Network net = null;
ArcInst ai = cell.findArc(netName);
- if (ai == null)
+ if (ai != null) net = netList.getNetwork(ai, 0); else
+ {
+ Netlist nl = cell.getNetlist();
+ for(Iterator<Network> it = nl.getNetworks(); it.hasNext(); )
+ {
+ Network n = it.next();
+ for(Iterator<String> nIt = n.getNames(); nIt.hasNext(); )
+ {
+ String nn = nIt.next();
+ if (nn.equals(netName))
+ {
+ net = n;
+ break;
+ }
+ }
+ if (net != null) break;
+ }
+ }
+ if (net == null)
{
System.out.println("WARNING: Could not find network '" + netName + "' which was requested by the Sea-of-Gates Cell Properties");
continue;
}
- Network net = netList.getNetwork(ai, 0);
- if (net == null) continue;
for(Iterator<ArcInst> it = net.getArcs(); it.hasNext() ;)
{
ai = it.next();
@@ -339,7 +407,8 @@ public abstract class SeaOfGatesEngine
arcsToRoute.add(ai);
}
}
- System.out.println("Routing " + arcsToRoute.size() + " arcs from the list given in the Sea-of-Gates Cell Properties");
+ if (!RoutingDebug.isActive())
+ System.out.println("Routing " + arcsToRoute.size() + " arcs from the list given in the Sea-of-Gates Cell Properties");
}
}
if (arcsToRoute == null)
@@ -375,7 +444,8 @@ public abstract class SeaOfGatesEngine
info("Sea-of-gates router finding " + allRoutes.size() + " paths on " + routeBatches.length + " networks in cell " + cell.describe(false));
if (hadNonmanhattan.booleanValue())
{
- String info = "Found nonmanhattan geometry (" + linesInNonMahnattan.size() + " points). This may cause larger rectangular blockages, which may block too much.";
+ String info = "Found nonmanhattan geometry (" + linesInNonMahnattan.size() +
+ " points). This may cause larger rectangular blockages, which may block too much.";
if (linesInNonMahnattan.size() > 100)
{
linesInNonMahnattan = linesInNonMahnattan.subList(0, 100); // just show first 100
@@ -460,7 +530,7 @@ public abstract class SeaOfGatesEngine
for(NeededRoute nr : allRoutes)
nr.checkGridValidity();
- // if debugging, stop now
+ // if debugging, mark route to debug
if (RoutingDebug.isActive() && allRoutes.size() > 0)
{
String whichRoute = RoutingDebug.getDesiredRouteToDebug();
@@ -522,7 +592,7 @@ public abstract class SeaOfGatesEngine
{
setProgressNote("Adding taps to spine routes...");
info("------------------ Adding taps to spine routes...");
-
+
// do the routing again
if (numberOfThreads > 1) doRoutingParallel(numberOfThreads, tapRoutes); else
doRouting(tapRoutes);
@@ -563,7 +633,7 @@ public abstract class SeaOfGatesEngine
errorLogger.deleteMessages(oldMessage);
}
}
-
+
if (numberOfThreads > 1) doRoutingParallel(numberOfThreads, redoRoutes); else
doRouting(redoRoutes);
handler.flush(true);
@@ -586,7 +656,7 @@ public abstract class SeaOfGatesEngine
summarize(routeBatches, allRoutes);
// dumpSpacing();
}
-
+
// clean up
handler.termLogging(errorLogger);
handler.stopProgressDialog();
@@ -614,18 +684,14 @@ public abstract class SeaOfGatesEngine
for (int b = 0; b < routeBatches.length; b++)
{
RouteBatch rb = routeBatches[b];
- RouteResolution res = rb.resolution;
-
- // remove the original unrouted nodes/arcs
- for (ArcInst aiKill : rb.unroutedArcs) res.killArc(aiKill);
- for (NodeInst niKill : rb.unroutedNodes) res.killNode(niKill);
-
- // now add new Unrouted arcs from the Steiner tree calculations
+ for (ArcInst ai : rb.unroutedArcs) ai.kill();
for(NeededRoute nr : rb.routesInBatch)
- res.addUnrouted(nr.aPi, nr.bPi, nr.getName());
- handler.instantiate(res);
+ {
+ EPoint aPt = nr.aPi.getCenter();
+ EPoint bPt = nr.bPi.getCenter();
+ ArcInst.makeInstance(Generic.tech().unrouted_arc, ep, nr.aPi, nr.bPi, aPt, bPt, nr.getName());
+ }
}
- handler.flush(true);
sogp.setSteinerDone(true);
sogp.saveParameters(ep);
}
@@ -651,7 +717,7 @@ public abstract class SeaOfGatesEngine
info(sogQual.printAverageResults());
}
-
+
public String getRoutedNetRatio()
{
String value = "";
@@ -896,8 +962,8 @@ public abstract class SeaOfGatesEngine
// show the existing route
List<PolyBase> polysInConnection = new ArrayList<PolyBase>();
Point[] points = new Point[2];
- points[0] = PolyBase.fromLambda(nr.aX, nr.aY);
- points[1] = PolyBase.fromLambda(nr.bX, nr.bY);
+ points[0] = PolyBase.fromLambda(nr.aEndpoints.getCenterX(), nr.aEndpoints.getCenterY());
+ points[1] = PolyBase.fromLambda(nr.bEndpoints.getCenterX(), nr.bEndpoints.getCenterY());
polysInConnection.add(new PolyBase(points));
for(int i=0; i<numMetalLayers; i++)
{
@@ -941,7 +1007,7 @@ public abstract class SeaOfGatesEngine
if (b.getNetID() == null) continue;
if (b.getNetID().intValue() == net.intValue())
{
- ERectangle rect = b.bound;
+ ERectangle rect = b.getBounds();
polysInConnection.add(new PolyBase(rect));
}
} else
@@ -1048,7 +1114,14 @@ public abstract class SeaOfGatesEngine
*/
void instantiate(RouteResolution resolution);
- /**
+ /**
+ * Method to tell the name of the cell where routing results are stored.
+ * If null, results are placed back in the original cell.
+ * @return the name of the routing results cell.
+ */
+ String getRoutingCellName();
+
+ /**
* flush changes
* Can be called only from database thread
* @param force unconditionally perform the final flush
@@ -1114,12 +1187,23 @@ public abstract class SeaOfGatesEngine
int tapNumber = 1;
for(SearchVertex sv : nr.spineTapMap.keySet())
{
+ int thisTapNumber = tapNumber++;
PortInst aPi = nr.spineTapMap.get(sv);
ArcProto aArc = getMetalArcOnPort(aPi);
ImmutableNodeInst ini = nr.spineTapNIMap.get(aPi);
if (ini != null)
{
NodeInst ni = cell.getNodeById(ini.nodeId);
+ if (handler.getRoutingCellName() != null)
+ {
+ String realCellName = handler.getRoutingCellName() + "{lay}";
+ Cell realCell = cell.getLibrary().findNodeProto(realCellName);
+ if (realCell != null)
+ {
+ NodeInst otherNi = realCell.getNodeById(ini.nodeId);
+ if (otherNi != null) ni = otherNi;
+ }
+ }
if (ni != null)
{
// schedule the route to make the tap
@@ -1128,14 +1212,16 @@ public abstract class SeaOfGatesEngine
if (aArc != null && bArc != null)
{
String routeName = nr.routeName;
- if (routeName.endsWith("(spine)"))
- routeName = routeName.substring(0, routeName.length()-1) + " tap " + tapNumber + ")";
+ if (routeName.endsWith("spine)"))
+ routeName = routeName.substring(0, routeName.length()-1) + " tap " + thisTapNumber + ")";
NeededRoute nrTap = new NeededRoute(routeName, aPi, bPi, aArc, bArc, null, nr.minWidth);
- if (nrTap.invalidPort(true, aPi) || nrTap.invalidPort(false, bPi)) continue;
nrTap.setNetID(nr.netID);
+ boolean aInvalid = nrTap.invalidPort(true, true, aPi);
+ boolean bInvalid = nrTap.invalidPort(false, true, bPi);
+ if (aInvalid || bInvalid) continue;
nrTap.growNetwork();
tapRoutes.add(nrTap);
- nrTap.setBatchInfo(nr.batch, tapNumber++);
+ nrTap.setBatchInfo(nr.batch, thisTapNumber);
}
}
}
@@ -1165,843 +1251,1953 @@ public abstract class SeaOfGatesEngine
}
}
- /************************************** NEEDEDROUTE: A ROUTE TO BE RUN **************************************/
+ /**
+ * Class to define a single endpoint possibility for a waveform.
+ */
+ public static class PossibleEndpoint
+ {
+ EPoint coord;
+ MetalVia viaToPlace;
+ double viaSizeX, viaSizeY;
+ Orientation viaOrient;
- Map<Integer,List<MutableInteger>> netIDsByValue = new HashMap<Integer,List<MutableInteger>>();
+ PossibleEndpoint(EPoint coord, MetalVia mv, double sX, double sY, Orientation o)
+ {
+ this.coord = coord;
+ viaToPlace = mv;
+ viaSizeX = sX; viaSizeY = sY;
+ viaOrient = o;
+ }
+
+ public EPoint getCoord() { return coord; }
+ }
/**
- * Class to hold a route that must be run.
+ * Class that defines the endpoint of a waveform,
+ * which can be a single point, a rectangle, or a list of coordinates.
*/
- public class NeededRoute
+ public static class PossibleEndpoints
{
- private String routeName;
- private RouteBatch batch;
- private int routeInBatch;
- private final Rectangle2D routeBounds;
- private MutableInteger netID;
- private final double minWidth;
- private Rectangle2D jumpBound;
- private int complexityLimit;
- private int maxDistance;
- private double aX, aY, bX, bY;
- private double aTaperWid, bTaperWid;
- private double aTaperLen, bTaperLen;
- private FixpRectangle aRect, bRect;
- private FixpRectangle aRectGridded, bRectGridded;
- private final PortInst aPi, bPi;
- private int aZ, bZ;
- private int aC, bC;
- private boolean alreadyRouted;
- private Boolean debuggingRouteFromA;
- private MetalVia replaceA, replaceB;
- private int replaceAZ, replaceBZ;
- private int replaceAC, replaceBC;
- private final List<PortInst> spineTaps;
- private final Map<SearchVertex,PortInst> spineTapMap;
- private final Map<PortInst,ImmutableNodeInst> spineTapNIMap;
- private final Poly aPoly, bPoly;
- private Rectangle2D[] buckets;
- private Map<Layer,List<SOGBound>> endBlockages;
- /** true when routed successfully */ private volatile boolean routedSuccess;
- private String errorMessage;
- /** true when this is the second try on the route */ private boolean reroute;
- private SeaOfGatesTrack[][] gridLocationsX, gridLocationsY;
- private Map<SOGBound,Integer> extractList;
- private boolean[] overridePreventArcs, forceGridArcs;
- private double[] overrideMetalWidth, overrideMetalSpacingX, overrideMetalSpacingY;
- private double[][] overrideMetalSpacings;
- private Wavefront winningWF, dirAtoB, dirBtoA;
- private MessageLog loggedMessage;
+ /** The center X/Y coordinates of the endpoint. */ private double x, y;
+ /** The endpoint as a point. */ private EPoint coord;
+ /** The area of the endpoint. */ private FixpRectangle rect;
+ /** The expanded grid of the area of the endpoint. */ private FixpRectangle rectGridded;
+ /** An overriding list of coordinates. */ private List<PossibleEndpoint> choices;
- public NeededRoute(String routeName, PortInst aPi, PortInst bPi, ArcProto aArc, ArcProto bArc,
- List<PortInst> spineTaps, double minWidth)
+ public PossibleEndpoints(double x, double y, FixpRectangle rect, FixpRectangle rectGridded)
{
- // determine the coordinates of the route
- winningWF = null;
- this.routeName = routeName;
- this.minWidth = minWidth;
- this.spineTaps = spineTaps;
- this.complexityLimit = prefs.complexityLimit;
- this.maxDistance = prefs.maxDistance;
- alreadyRouted = false;
- replaceA = replaceB = null;
- replaceAZ = replaceBZ = 0;
- replaceAC = replaceBC = 0;
- if (spineTaps == null)
- {
- spineTapMap = null;
- spineTapNIMap = null;
- } else
- {
- spineTapMap = new HashMap<SearchVertex,PortInst>();
- spineTapNIMap = new HashMap<PortInst,ImmutableNodeInst>();
- }
- overrideMetalWidth = null;
- overrideMetalSpacingX = overrideMetalSpacingY = null;
- overrideMetalSpacings = new double[numMetalLayers][];
+ this.x = x;
+ this.y = y;
+ this.coord = null;
+ this.rect = rect;
+ this.rectGridded = rectGridded;
+ choices = null;
+ }
- for(int z=0; z<numMetalLayers; z++)
+ public void setCenterX(double v) { x = v; coord = null; }
+
+ public void setCenterY(double v) { y = v; coord = null; }
+
+ public void setRect(double x, double y, double w, double h) { rect.setRect(x, y, w, h); }
+
+ public void setGriddedRect(double lX, double hX, double lY, double hY) { rectGridded = FixpRectangle.from(new Rectangle2D.Double(lX, lY, hX-lX, hY-lY)); }
+
+ public void add(PossibleEndpoint pe)
+ {
+ if (choices == null) choices = new ArrayList<PossibleEndpoint>();
+ choices.add(pe);
+ }
+
+
+ public double getCenterX() { return x; }
+
+ public double getCenterY() { return y; }
+
+ public EPoint getCenter()
+ {
+ if (coord == null) coord = EPoint.fromLambda(x, y);
+ return coord;
+ }
+
+ public FixpRectangle getRect() { return rect; }
+
+ public FixpRectangle getGriddedRect() { return rectGridded; }
+
+ public boolean hasEndpoints() { return choices != null; }
+
+ public List<PossibleEndpoint> getEndpoints() { return choices; }
+
+ public void finishedAddingEndpoints()
+ {
+ if (hasEndpoints())
{
- overrideMetalSpacings[z] = null;
- Double overrideWidth = null;
- boolean hadXOverride = false, hadYOverride = false;
- for(int c=0; c<metalArcs[z].length; c++)
+ PossibleEndpoint peFirst = choices.get(0);
+ double lX = peFirst.coord.getX(), hX = peFirst.coord.getX();
+ double lY = peFirst.coord.getY(), hY = peFirst.coord.getY();
+ for(int i=1; i<choices.size(); i++)
{
- Double o = sogp.getDefaultWidthOverride(metalArcs[z][c]);
- if (o == null) continue;
- if (overrideWidth == null || o.doubleValue() > overrideWidth.doubleValue()) overrideWidth = o;
+ PossibleEndpoint pe = choices.get(i);
+ if (pe.coord.getX() < lX) lX = pe.coord.getX();
+ if (pe.coord.getX() > hX) hX = pe.coord.getX();
+ if (pe.coord.getY() < lY) lY = pe.coord.getY();
+ if (pe.coord.getY() > hY) hY = pe.coord.getY();
+ }
+ rect.setRect(lX, lY, hX-lX, hY-lY);
+ rectGridded.setRect(lX, lY, hX-lX, hY-lY);
- SeaOfGatesArcProperties sogap = sogp.getOverridesForArcsOnNet(routeName, metalArcs[z][c]);
- if (sogap != null && sogap.getWidthOverride() != null) overrideWidth = sogap.getWidthOverride();
- if (overrideWidth != null)
- {
- if (overrideMetalWidth == null)
- {
- overrideMetalWidth = new double[numMetalLayers];
- for (int i = 0; i < numMetalLayers; i++)
- {
- if (metalArcs[i] == null) continue;
- for(int cc=0; cc<metalArcs[i].length; cc++)
- overrideMetalWidth[i] = Math.max(metalArcs[i][cc].getDefaultLambdaBaseWidth(ep), minWidth);
- }
- }
- overrideMetalWidth[z] = overrideWidth.doubleValue();
- }
+ // find centermost endpoint
+ boolean pointValid = false;
+ for(PossibleEndpoint pe : choices)
+ {
+ if (DBMath.areEquals(pe.coord.getX(), x) && DBMath.areEquals(pe.coord.getY(), y))
+ pointValid = true;
+ }
- Double overrideSpacingX = sogp.getDefaultSpacingOverride(metalArcs[z][c], 0);
- Double overrideSpacingY = sogp.getDefaultSpacingOverride(metalArcs[z][c], 1);
- if (sogap != null && sogap.getSpacingOverride(0) != null) overrideSpacingX = sogap.getSpacingOverride(0);
- if (sogap != null && sogap.getSpacingOverride(1) != null) overrideSpacingY = sogap.getSpacingOverride(1);
-
- if (overrideSpacingX != null)
+ if (!pointValid)
+ {
+ double cX = (lX + hX) / 2, cY = (lY + hY) / 2;
+ PossibleEndpoint bestPE = null;
+ double bestDist = Double.MAX_VALUE;
+ for(PossibleEndpoint pe : choices)
{
- hadXOverride = true;
- if (overrideMetalSpacingX == null) // first time?
+ double dx = cX - pe.coord.getX(), dy = cY - pe.coord.getY();
+ double dist = Math.sqrt(dx*dx + dy*dy);
+ if (dist < bestDist)
{
- overrideMetalSpacingX = new double[numMetalLayers];
- for (int i = 0; i < numMetalLayers; i++)
- {
- overrideMetalSpacingX[i] = 0;
- if (metalLayers[i] == null || metalArcs[i] == null) continue;
- for(int cc=0; cc<metalArcs[i].length; cc++)
- {
- DRCTemplate rule = DRC.getSpacingRule(metalLayers[i][cc], null, metalLayers[i][cc], null,
- false, -1, metalArcs[i][cc].getDefaultLambdaBaseWidth(ep), 50);
- if (rule != null)
- overrideMetalSpacingX[i] = rule.getValue(0);
- }
- }
+ bestDist = dist;
+ bestPE = pe;
}
- overrideMetalSpacingX[z] = overrideSpacingX.doubleValue();
}
- if (overrideSpacingY != null)
+ x = bestPE.coord.getX();
+ y = bestPE.coord.getY();
+ coord = bestPE.coord;
+ }
+ }
+ }
+
+ /**
+ * Method to return the closest endpoint to a given coordinate.
+ * @param curX the X coordinate.
+ * @param curY the Y coordinate.
+ * @return the closest endpoint to the given coordinate.
+ */
+ public EPoint getClosestPoint(double curX, double curY)
+ {
+ if (hasEndpoints())
+ {
+ PossibleEndpoint bestPE = null;
+ double bestDist = Double.MAX_VALUE;
+ for(PossibleEndpoint pe : choices)
+ {
+ double dx = curX - pe.coord.getX(), dy = curY - pe.coord.getY();
+ double dist = Math.sqrt(dx*dx + dy*dy);
+ if (dist < bestDist)
{
- hadYOverride = true;
- if (overrideMetalSpacingY == null) // first time?
- {
- overrideMetalSpacingY = new double[numMetalLayers];
- for (int i = 0; i < numMetalLayers; i++)
- {
- overrideMetalSpacingY[i] = 0;
- if (metalLayers[i] == null || metalArcs[i] == null) continue;
- for(int cc=0; cc<metalArcs[i].length; cc++)
- {
- DRCTemplate rule = DRC.getSpacingRule(metalLayers[i][cc], null, metalLayers[i][cc], null,
- false, -1, metalArcs[i][cc].getDefaultLambdaBaseWidth(ep), 50);
- if (rule != null)
- {
- if (rule.getNumValues() <= 1) overrideMetalSpacingY[i] = rule.getValue(0); else
- overrideMetalSpacingY[i] = rule.getValue(1);
- }
- }
- }
- }
- overrideMetalSpacingY[z] = overrideSpacingY.doubleValue();
+ bestDist = dist;
+ bestPE = pe;
}
}
- if (hadXOverride && hadYOverride)
- overrideMetalSpacings[z] = new double[] {overrideMetalSpacingX[z], overrideMetalSpacingY[z]};
+ if (bestPE != null) return bestPE.getCoord();
}
+ return EPoint.fromLambda(x, y);
+ }
- this.aPi = aPi;
- this.bPi = bPi;
- aPoly = aPi.getPoly();
- bPoly = bPi.getPoly();
-
- // determine area of endpoints
- aRect = aPoly.getBounds2D();
- bRect = bPoly.getBounds2D();
-
- if (bRect.getMaxX() < aRect.getMinX())
- {
- bX = upToGrain(bRect.getCenterX());
- aX = downToGrain(aRect.getCenterX());
- } else if (bRect.getMinX() > aRect.getMaxX())
- {
- bX = downToGrain(bRect.getCenterX());
- aX = upToGrain(aRect.getCenterX());
- } else
+ /**
+ * Method to determine if a given point is a destination point.
+ * @param curX the X coordinate.
+ * @param curY the Y coordinate.
+ * @return true if this point is a valid destination point.
+ */
+ public boolean isToPoint(double curX, double curY)
+ {
+ if (hasEndpoints())
{
- double xVal = (Math.max(bRect.getMinX(), aRect.getMinX()) + Math.min(bRect.getMaxX(), aRect.getMaxX())) / 2;
- bX = aX = upToGrain(xVal);
+ for(PossibleEndpoint pe : choices)
+ {
+ if (DBMath.areEquals(pe.coord.getX(), curX) && DBMath.areEquals(pe.coord.getY(), curY))
+ return true;
+ }
+ return false;
}
- if (bRect.getMaxY() < aRect.getMinY())
- {
- bY = upToGrain(bRect.getCenterY());
- aY = downToGrain(aRect.getCenterY());
- } else if (bRect.getMinY() > aRect.getMaxY())
- {
- bY = downToGrain(bRect.getCenterY());
- aY = upToGrain(aRect.getCenterY());
- } else
+ return DBMath.pointInRect(EPoint.fromLambda(curX, curY), rect);
+ }
+
+ /**
+ * Method to determine if a given coordinate is on Y and within a nonzero range of X coordinates.
+ * @param curX the X coordinate.
+ * @param curY the Y coordinate.
+ * @return true if the given coordinate is on Y and within a nonzero range of X coordinates.
+ */
+ public boolean isWithinNonzeroX(double curX, double curY)
+ {
+ if (rectGridded.getWidth() == 0 || !DBMath.areEquals(curX, x)) return false;
+
+ if (hasEndpoints())
{
- double yVal = (Math.max(bRect.getMinY(), aRect.getMinY()) + Math.min(bRect.getMaxY(), aRect.getMaxY())) / 2;
- bY = aY = upToGrain(yVal);
+ for(PossibleEndpoint pe : choices)
+ {
+ if (DBMath.areEquals(pe.coord.getX(), curX) && DBMath.areEquals(pe.coord.getY(), curY))
+ return true;
+ }
+ return false;
}
- aZ = aArc.getFunction().getLevel() - 1;
- bZ = bArc.getFunction().getLevel() - 1;
- aC = aArc.getMaskLayer();
- bC = bArc.getMaskLayer();
-
- double lowX = Math.min(aRect.getMinX(), bRect.getMinX()), highX = Math.max(aRect.getMaxX(), bRect.getMaxX());
- double lowY = Math.min(aRect.getMinY(), bRect.getMinY()), highY = Math.max(aRect.getMaxY(), bRect.getMaxY());
-
- // first construct a grid for an immense bound
- // original value was 100
- double gap = DRC.getWorstSpacingDistance(tech, -1) * maxDistance;
- Rectangle2D testBounds = new Rectangle2D.Double(lowX - gap, lowY - gap, highX - lowX + gap * 2, highY - lowY + gap * 2);
- buildGrids(testBounds);
-
- // now expand the end bounds to reach grid locations
- double aLX = getLowerXGrid(aZ, aRect.getMinX()).getCoordinate();
- double aHX = getUpperXGrid(aZ, aRect.getMaxX()).getCoordinate();
- double aLY = getLowerYGrid(aZ, aRect.getMinY()).getCoordinate();
- double aHY = getUpperYGrid(aZ, aRect.getMaxY()).getCoordinate();
- aRectGridded = FixpRectangle.from(new Rectangle2D.Double(aLX, aLY, aHX-aLX, aHY-aLY));
- double bLX = getLowerXGrid(bZ, bRect.getMinX()).getCoordinate();
- double bHX = getUpperXGrid(bZ, bRect.getMaxX()).getCoordinate();
- double bLY = getLowerYGrid(bZ, bRect.getMinY()).getCoordinate();
- double bHY = getUpperYGrid(bZ, bRect.getMaxY()).getCoordinate();
- bRectGridded = FixpRectangle.from(new Rectangle2D.Double(bLX, bLY, bHX-bLX, bHY-bLY));
+ return DBMath.areEquals(curY, y);
+ }
- // now define bounds as the gridded envelope of a smaller bound
- double maxStrayFromRouteBoundsX = gap, maxStrayFromRouteBoundsY = gap;
- double griddedLowX = Math.min(getLowerXGrid(aZ, lowX-maxStrayFromRouteBoundsX).getCoordinate(), getLowerXGrid(bZ, lowX-maxStrayFromRouteBoundsX).getCoordinate());
- double griddedHighX = Math.max(getUpperXGrid(aZ, highX+maxStrayFromRouteBoundsX).getCoordinate(), getUpperXGrid(bZ, highX+maxStrayFromRouteBoundsX).getCoordinate());
- double griddedLowY = Math.min(getLowerYGrid(aZ, lowY-maxStrayFromRouteBoundsY).getCoordinate(), getLowerYGrid(bZ, lowY-maxStrayFromRouteBoundsY).getCoordinate());
- double griddedHighY = Math.max(getUpperYGrid(aZ, highY+maxStrayFromRouteBoundsY).getCoordinate(), getUpperYGrid(bZ, highY+maxStrayFromRouteBoundsY).getCoordinate());
- if (routingBoundsLimit != null)
- {
- if (griddedLowX < routingBoundsLimit.getMinX()) griddedLowX = routingBoundsLimit.getMinX();
- if (griddedHighX > routingBoundsLimit.getMaxX()) griddedHighX = routingBoundsLimit.getMaxX();
- if (griddedLowY < routingBoundsLimit.getMinY()) griddedLowY = routingBoundsLimit.getMinY();
- if (griddedHighY > routingBoundsLimit.getMaxY()) griddedHighY = routingBoundsLimit.getMaxY();
- }
- routeBounds = new Rectangle2D.Double(griddedLowX, griddedLowY, griddedHighX - griddedLowX, griddedHighY - griddedLowY);
- jumpBound = new Rectangle2D.Double(Math.min(aX, bX), Math.min(aY, bY), Math.abs(aX-bX), Math.abs(aY-bY));
+ /**
+ * Method to determine if a given coordinate is on X and within a nonzero range of Y coordinates.
+ * @param curX the X coordinate.
+ * @param curY the Y coordinate.
+ * @return true if the given coordinate is on X and within a nonzero range of Y coordinates.
+ */
+ public boolean isWithinNonzeroY(double curX, double curY)
+ {
+ if (rectGridded.getHeight() == 0 || !DBMath.areEquals(curY, y)) return false;
- // set overrides for this specific route
- overridePreventArcs = null;
- List<ArcProto> arcs = sogp.getArcsOnNet(routeName);
- if (arcs != null && arcs.size() > 0)
+ if (hasEndpoints())
{
- overridePreventArcs = new boolean[numMetalLayers];
- for(int i=0; i<numMetalLayers; i++) overridePreventArcs[i] = true;
- for(ArcProto ap : arcs)
+ for(PossibleEndpoint pe : choices)
{
- int metNum = ap.getFunction().getLevel() - 1;
- overridePreventArcs[metNum] = false;
+ if (DBMath.areEquals(pe.coord.getX(), curX) && DBMath.areEquals(pe.coord.getY(), curY))
+ return true;
}
- }
- forceGridArcs = new boolean[numMetalLayers];
- for(int i=0; i<numMetalLayers; i++)
- {
- forceGridArcs[i] = false;
- for(int c=0; c<metalArcs[i].length; c++)
- if (sogp.isGridForced(metalArcs[i][c])) forceGridArcs[i] = true;
+ return false;
}
- // determine the taper widths
- aTaperWid = getTaperWidth(aPi, aZ);
- bTaperWid = getTaperWidth(bPi, bZ);
- aTaperLen = taperLength[aZ];
- bTaperLen = taperLength[bZ];
- if (aTaperWid == getUntaperedArcWidth(aZ)) aTaperLen = -1;
- if (bTaperWid == getUntaperedArcWidth(bZ)) bTaperLen = -1;
+ return DBMath.areEquals(curX, x);
}
- public boolean getRoutedSucess() { return routedSuccess; }
- public Wavefront getWavefront() { return winningWF; }
- public Wavefront getWavefrontAtoB() { return dirAtoB; }
- public Wavefront getWavefrontBtoA() { return dirBtoA; }
- public String getErrorMessage() { return errorMessage; }
-
- public void setDebugging(Boolean fromA) { debuggingRouteFromA = fromA; }
-
/**
- * Method to check the validity of the endpoints with respect to forced gridding.
- * If the grid is being forced and the endpoints are not on grid,
- * routing may fail (and a warning will be issued here).
+ * Method to return the closest X coordinate to a given value.
+ * @param curX the given value.
+ * @return the closest X coordinate to a given value.
*/
- public void checkGridValidity()
+ public double getClosestX(double curX)
{
- if (forceGridArcs[aZ])
- {
- boolean hor = true;
- if (sogp.isHorizontalEven())
- {
- if ((aZ%2) == 0) hor = false;
- } else
- {
- if ((aZ%2) != 0) hor = false;
- }
- if (!hor && !isOnXGrid(aZ, getAX()))
- {
- List<EPoint> offGrid = new ArrayList<EPoint>(); offGrid.add(EPoint.fromLambda(aX, aY)); offGrid.add(EPoint.fromLambda(aX, aY));
- warn("Route " + routeName + ", end (" + TextUtils.formatDistance(aX) + "," + TextUtils.formatDistance(aY) + "," +
- describeMetal(aZ,aC) + ") is not on X grid (nearest X grids are at " + TextUtils.formatDistance(getLowerXGrid(aZ, aX).getCoordinate()) +
- " and " + TextUtils.formatDistance(getUpperXGrid(aZ, aX).getCoordinate()) + "). Route may fail.", cell, offGrid, null);
- }
- if (hor && !isOnYGrid(aZ, aY))
- {
- List<EPoint> offGrid = new ArrayList<EPoint>(); offGrid.add(EPoint.fromLambda(aX, aY)); offGrid.add(EPoint.fromLambda(aX, aY));
- warn("Route " + routeName + ", end (" + TextUtils.formatDistance(aX) + "," + TextUtils.formatDistance(aY) + "," +
- describeMetal(aZ,aC) + ") is not on Y grid (nearest Y grids are at " + TextUtils.formatDistance(getLowerYGrid(aZ, aY).getCoordinate()) +
- " and " + TextUtils.formatDistance(getUpperYGrid(aZ, aY).getCoordinate()) + "). Route may fail.", cell, offGrid, null);
- }
- }
- if (forceGridArcs[bZ])
+ if (hasEndpoints())
{
- boolean hor = true;
- if (sogp.isHorizontalEven())
- {
- if ((bZ%2) == 0) hor = false;
- } else
- {
- if ((bZ%2) != 0) hor = false;
- }
- if (!hor && !isOnXGrid(bZ, bX))
- {
- List<EPoint> offGrid = new ArrayList<EPoint>(); offGrid.add(EPoint.fromLambda(bX, bY)); offGrid.add(EPoint.fromLambda(bX, bY));
- warn("Route " + routeName + ", end (" + TextUtils.formatDistance(bX) + "," + TextUtils.formatDistance(bY) + "," +
- describeMetal(bZ,bC) + ") is not on X grid (nearest X grids are at " + TextUtils.formatDistance(getLowerXGrid(bZ, bX).getCoordinate()) +
- " and " + TextUtils.formatDistance(getUpperXGrid(bZ, bX).getCoordinate()) + "). Route may fail.", cell, offGrid, null);
- }
- if (hor && !isOnYGrid(bZ, bY))
+ PossibleEndpoint bestPE = null;
+ double bestDist = Double.MAX_VALUE;
+ for(PossibleEndpoint pe : choices)
{
- List<EPoint> offGrid = new ArrayList<EPoint>(); offGrid.add(EPoint.fromLambda(bX, bY)); offGrid.add(EPoint.fromLambda(bX, bY));
- warn("Route " + routeName + ", end (" + TextUtils.formatDistance(bX) + "," + TextUtils.formatDistance(bY) + "," +
- describeMetal(bZ,bC) + ") is not on Y grid (nearest Y grids are at " + TextUtils.formatDistance(getLowerYGrid(bZ, bY).getCoordinate()) +
- " and " + TextUtils.formatDistance(getUpperYGrid(bZ, bY).getCoordinate()) + "). Route may fail.", cell, offGrid, null);
+ double dist = Math.abs(curX - pe.coord.getX());
+ if (dist < bestDist)
+ {
+ bestDist = dist;
+ bestPE = pe;
+ }
}
+ if (bestPE != null) return bestPE.getCoord().getX();
}
+ return x;
}
- public FixpRectangle getAGriddedRect() { return aRectGridded; }
-
- public FixpRectangle getBGriddedRect() { return bRectGridded; }
-
- public SeaOfGatesTrack[][] getXRoutingGrid() { return gridLocationsX; }
-
- public SeaOfGatesTrack[][] getYRoutingGrid() { return gridLocationsY; }
-
/**
- * Method to construct grids for all layers in the vicinity of this route.
+ * Method to return the closest Y coordinate to a given value.
+ * @param curY the given value.
+ * @return the closest Y coordinate to a given value.
*/
- public void buildGrids(Rectangle2D bounds)
+ public double getClosestY(double curY)
{
- gridLocationsX = new SeaOfGatesTrack[numMetalLayers][];
- gridLocationsY = new SeaOfGatesTrack[numMetalLayers][];
-
- // first make the grid positions for each layer
- for(int metNum=1; metNum<=numMetalLayers; metNum++)
+ if (hasEndpoints())
{
- int metIndex = metNum - 1;
- SeaOfGatesTrack[] thisGrid = metalGrid[metIndex];
- if (thisGrid == null) continue;
- if (!sogp.isForceHorVer() && !sogp.isFavorHorVer()) continue;
- boolean hor = true;
- if (sogp.isHorizontalEven())
- {
- if ((metNum%2) != 0) hor = false;
- } else
- {
- if ((metNum%2) == 0) hor = false;
- }
- double offset = thisGrid[0].getCoordinate();
- double range = thisGrid[thisGrid.length-1].getCoordinate() - offset;
- range += thisGrid[1].getCoordinate() - thisGrid[0].getCoordinate();
- if (range > 0)
+ PossibleEndpoint bestPE = null;
+ double bestDist = Double.MAX_VALUE;
+ for(PossibleEndpoint pe : choices)
{
- List<SeaOfGatesTrack> values = new ArrayList<SeaOfGatesTrack>();
- double low, high;
- if (hor)
- {
- low = bounds.getMinY();
- high = bounds.getMaxY();
- } else
- {
- low = bounds.getMinX();
- high = bounds.getMaxX();
- }
- double lowGroup = Math.floor((low - offset) / range) * range;
- double highGroup = Math.ceil((high - offset) / range) * range;
- for(double v = lowGroup; v <= highGroup; v += range)
- {
- for(int i=0; i<thisGrid.length; i++)
- {
- double val = v + thisGrid[i].getCoordinate();
- int maskNum = thisGrid[i].getMaskNum();
- if (val >= low && val <= high)
- values.add(new SeaOfGatesTrack(val, maskNum));
- }
- }
- if (values.size() >= 2)
+ double dist = Math.abs(curY - pe.coord.getY());
+ if (dist < bestDist)
{
- if (hor)
- {
- gridLocationsY[metIndex] = makeArrayOfUniqueTracks(values);
- } else
- {
- gridLocationsX[metIndex] = makeArrayOfUniqueTracks(values);
- }
+ bestDist = dist;
+ bestPE = pe;
}
}
+ if (bestPE != null) return bestPE.getCoord().getY();
}
+ return y;
+ }
- // now make the intermediate grid positions that combine locations from upper and lower layers
- for(int metNum=1; metNum<=numMetalLayers; metNum++)
+ /**
+ * Method to determine whether the goal is below a given X coordinate.
+ * @param curX the given value.
+ * @return true if the goal is below the given X coordinate.
+ */
+ public boolean isBelowX(double curX)
+ {
+ if (hasEndpoints())
{
- int metIndex = metNum - 1;
- boolean hor = true;
- if (sogp.isHorizontalEven())
- {
- if ((metNum%2) != 0) hor = false;
- } else
+ for(PossibleEndpoint pe : choices)
{
- if ((metNum%2) == 0) hor = false;
+ if (pe.coord.getX() >= curX) return false;
}
+ return true;
+ }
- SeaOfGatesTrack[][] gridLocations;
- SeaOfGatesTrack t1, t2;
- if (hor)
- {
- // horizontal layer: combine X locations from upper and lower layers
- gridLocations = gridLocationsX;
- t1 = getClosestXGrid(aZ, aX);
- t2 = getClosestXGrid(bZ, bX);
- } else
- {
- // vertical layer: combine Y locations from upper and lower layers
- gridLocations = gridLocationsY;
- t1 = getClosestXGrid(aZ, aY);
- t2 = getClosestXGrid(bZ, bY);
- }
- List<SeaOfGatesTrack> values = new ArrayList<SeaOfGatesTrack>();
- boolean realGrid = false;
- if (metIndex > 0)
- realGrid |= gridAlternateLayer(metIndex, -1, values, t1, t2, gridLocations);
- if (metIndex < numMetalLayers-1)
- realGrid |= gridAlternateLayer(metIndex, 1, values, t1, t2, gridLocations);
- if (realGrid)
+ return x < curX;
+ }
+
+ /**
+ * Method to determine whether the goal is above a given X coordinate.
+ * @param curX the given value.
+ * @return true if the goal is above the given X coordinate.
+ */
+ public boolean isAboveX(double curX)
+ {
+ if (hasEndpoints())
+ {
+ for(PossibleEndpoint pe : choices)
{
- gridLocations[metIndex] = makeArrayOfUniqueTracks(values);
+ if (pe.coord.getX() <= curX) return false;
}
+ return true;
}
+
+ return x > curX;
}
- private SeaOfGatesTrack[] makeArrayOfUniqueTracks(List<SeaOfGatesTrack> values)
+ /**
+ * Method to determine whether the goal is below a given Y coordinate.
+ * @param curY the given value.
+ * @return true if the goal is below the given Y coordinate.
+ */
+ public boolean isBelowY(double curY)
{
- Collections.sort(values);
- for(int i=1; i<values.size(); i++)
+ if (hasEndpoints())
{
- if (DBMath.areEquals(values.get(i-1).getCoordinate(), values.get(i).getCoordinate()))
+ for(PossibleEndpoint pe : choices)
{
- values.remove(i);
- i--;
+ if (pe.coord.getY() >= curY) return false;
}
+ return true;
}
- SeaOfGatesTrack[] gridLocations = new SeaOfGatesTrack[values.size()];
- int i=0;
- for(SeaOfGatesTrack v : values) gridLocations[i++] = v;
- return gridLocations;
+
+ return y < curY;
}
/**
- * Method to consider an alternate layer's gridding when building the current layer's gridding information.
- * @param curLayer the metal layer being considered (0-based).
- * @param diff +1 or -1 to indicate the adjoining layer.
- * @param values a Set of Doubles with grid stops in the X/Y axis.
- * @param e1 the A endpoint coordinate (X or Y) to use if needed.
- * @param e1 the B endpoint coordinate (X or Y) to use if needed.
- * @param gridLocations the grid values (entry may be null)
- * @return true if there are real grid values applied from a neighboring layer.
+ * Method to determine whether the goal is above a given Y coordinate.
+ * @param curY the given value.
+ * @return true if the goal is above the given Y coordinate.
*/
- private boolean gridAlternateLayer(int curLayer, int diff, List<SeaOfGatesTrack> values, SeaOfGatesTrack t1, SeaOfGatesTrack t2, SeaOfGatesTrack[][] gridLocations)
+ public boolean isAboveY(double curY)
{
- // if the current layer is blocked, ignore grid building on it
- if (sogp.isPrevented(primaryMetalArc[curLayer])) return false;
-
- // if the alternate layer is blocked, ignore its grid factor
- int altLayer = curLayer + diff;
-
- // if the alternate layer has no grid, use the endpoints of the route
- if (gridLocations[altLayer] == null)
+ if (hasEndpoints())
{
- values.add(t1);
- values.add(t2);
- return false;
+ for(PossibleEndpoint pe : choices)
+ {
+ if (pe.coord.getY() <= curY) return false;
+ }
+ return true;
}
- // alternate layer is gridded, so grid this layer with those stops
- for(int i=0; i<gridLocations[altLayer].length; i++)
- values.add(new SeaOfGatesTrack(gridLocations[altLayer][i].getCoordinate(), gridLocations[altLayer][i].getMaskNum()));
- return true;
+ return y > curY;
}
/**
- * Method to adjust an X value down to the lower grid value.
- * @param metNum the metal layer number (0-based).
- * @param value the X value to be adjusted.
- * @return the closest X grid value at or below the given value.
+ * Method to tell if a given coordinate is a goal point.
+ * @param curX the X coordinate.
+ * @param curY the Y coordinate.
+ * @return true if the given coordinate is a goal point.
*/
- public SeaOfGatesTrack getLowerXGrid(int metNum, double value)
+ public boolean atGoalPoint(double curX, double curY)
{
- return findLowerValue(gridLocationsX[metNum], value);
- }
-
- /**
- * Method to adjust an X value up to the higher grid value.
- * @param metNum the metal layer number (0-based).
- * @param value the X value to be adjusted.
- * @return the closest X grid value at or above the given value.
- */
- public SeaOfGatesTrack getUpperXGrid(int metNum, double value)
- {
- return findUpperValue(gridLocationsX[metNum], value);
- }
+ if (hasEndpoints())
+ {
+ for(PossibleEndpoint pe : choices)
+ {
+ if (DBMath.areEquals(pe.coord.getX(), curX) && DBMath.areEquals(pe.coord.getY(), curY))
+ return true;
+ }
+ return false;
+ }
- /**
- * Method to adjust an X value up to the nearest grid value.
- * @param metNum the metal layer number (0-based).
- * @param value the X value to be adjusted.
- * @return the closest X grid value to the given value.
- */
- public SeaOfGatesTrack getClosestXGrid(int metNum, double value)
- {
- return findClosestValue(gridLocationsX[metNum], value);
+ if (inDestGrid(rectGridded, curX, curY)) return true;
+ return false;
}
/**
- * Method to adjust an Y value down to the lower grid value.
- * @param metNum the metal layer number (0-based).
- * @param value the Y value to be adjusted.
- * @return the closest Y grid value at or below the given value.
+ * Method to tell if a given X coordinate is at a goal point.
+ * @param curX the X coordinate.
+ * @return true if the given X coordinate is at a goal point.
*/
- public SeaOfGatesTrack getLowerYGrid(int metNum, double value)
+ public boolean isOutOfGoalX(double curX)
{
- return findLowerValue(gridLocationsY[metNum], value);
- }
+ if (hasEndpoints())
+ {
+ for(PossibleEndpoint pe : choices)
+ {
+ if (DBMath.areEquals(pe.coord.getX(), curX)) return true;
+ }
+ return false;
+ }
- /**
- * Method to adjust an Y value up to the higher grid value.
- * @param metNum the metal layer number (0-based).
- * @param value the Y value to be adjusted.
- * @return the closest Y grid value at or above the given value.
- */
- public SeaOfGatesTrack getUpperYGrid(int metNum, double value)
- {
- return findUpperValue(gridLocationsY[metNum], value);
+ if (curX > rect.getMaxX() || curX < rect.getMinX()) return true;
+ return false;
}
/**
- * Method to adjust an Y value up to the nearest grid value.
- * @param metNum the metal layer number (0-based).
- * @param value the Y value to be adjusted.
- * @return the closest Y grid value to the given value.
+ * Method to tell if a given Y coordinate is at a goal point.
+ * @param curY the Y coordinate.
+ * @return true if the given Y coordinate is at a goal point.
*/
- public SeaOfGatesTrack getClosestYGrid(int metNum, double value)
- {
- return findClosestValue(gridLocationsY[metNum], value);
- }
-
- public boolean isOnXGrid(int metNum, double value)
- {
- return isOnGrid(gridLocationsX[metNum], value);
- }
-
- public boolean isOnYGrid(int metNum, double value)
- {
- return isOnGrid(gridLocationsY[metNum], value);
- }
-
- private SeaOfGatesTrack findLowerValue(SeaOfGatesTrack[] thisGrid, double value)
+ public boolean isOutOfGoalY(double curY)
{
- if (thisGrid == null) return new SeaOfGatesTrack(value, 0);
- int lo = 0, hi = thisGrid.length - 1;
- if (DBMath.isLessThanOrEqualTo(value, thisGrid[lo].getCoordinate())) return thisGrid[lo];
- if (DBMath.isGreaterThanOrEqualTo(value, thisGrid[hi].getCoordinate())) return thisGrid[hi];
-
- for(int i=0; i<1000; i++)
+ if (hasEndpoints())
{
- int med = (hi + lo) / 2;
- if (DBMath.isGreaterThanOrEqualTo(value, thisGrid[med].getCoordinate()) &&
- DBMath.isLessThan(value, thisGrid[med+1].getCoordinate())) return thisGrid[med];
- if (DBMath.isLessThan(value, thisGrid[med].getCoordinate())) hi = med; else lo = med;
+ for(PossibleEndpoint pe : choices)
+ {
+ if (DBMath.areEquals(pe.coord.getY(), curY)) return true;
+ }
+ return false;
}
- return new SeaOfGatesTrack(value, 0);
- }
-
- private SeaOfGatesTrack findUpperValue(SeaOfGatesTrack[] thisGrid, double value)
- {
- if (thisGrid == null) return new SeaOfGatesTrack(value, 0);
-
- int lo = 0, hi = thisGrid.length - 1;
- if (DBMath.isLessThanOrEqualTo(value, thisGrid[lo].getCoordinate())) return thisGrid[lo];
- if (DBMath.isGreaterThanOrEqualTo(value, thisGrid[hi].getCoordinate())) return thisGrid[hi];
- for(int i=0; i<1000; i++)
- {
- int med = (hi + lo) / 2;
- if (DBMath.isGreaterThan(value, thisGrid[med].getCoordinate()) &&
- DBMath.isLessThanOrEqualTo(value, thisGrid[med+1].getCoordinate())) return thisGrid[med+1];
- if (DBMath.isLessThanOrEqualTo(value, thisGrid[med].getCoordinate())) hi = med; else lo = med;
- }
- return new SeaOfGatesTrack(value, 0);
+ if (curY > rect.getMaxY() || curY < rect.getMinY()) return true;
+ return false;
}
- private SeaOfGatesTrack findClosestValue(SeaOfGatesTrack[] thisGrid, double value)
+ /**
+ * Method to tell if a given coordinate is on one of the goal axes.
+ * @param curX the X coordinate.
+ * @param curY the Y coordinate.
+ * @return true if the given coordinate is on one of the goal axes.
+ */
+ public boolean isOnGoalAxis(double curX, double curY)
{
- if (thisGrid == null) return new SeaOfGatesTrack(value, 0);
-
- int lo = 0, hi = thisGrid.length - 1;
- if (DBMath.isLessThanOrEqualTo(value, thisGrid[lo].getCoordinate())) return thisGrid[lo];
- if (DBMath.isGreaterThanOrEqualTo(value, thisGrid[hi].getCoordinate())) return thisGrid[hi];
-
- for(int i=0; i<1000; i++)
+ if (hasEndpoints())
{
- int med = (hi + lo) / 2;
- if (DBMath.isGreaterThanOrEqualTo(value, thisGrid[med].getCoordinate()) &&
- DBMath.isLessThan(value, thisGrid[med+1].getCoordinate()))
+ for(PossibleEndpoint pe : choices)
{
- if (DBMath.isLessThan(value - thisGrid[med].getCoordinate(), thisGrid[med+1].getCoordinate() - value))
- return thisGrid[med];
- return thisGrid[med+1];
+ if (DBMath.areEquals(pe.coord.getX(), curX) || DBMath.areEquals(pe.coord.getY(), curY))
+ return true;
}
- if (DBMath.isLessThanOrEqualTo(value, thisGrid[med].getCoordinate())) hi = med; else lo = med;
+ return false;
}
- return new SeaOfGatesTrack(value, 0);
+
+ if (DBMath.areEquals(curX, x) || DBMath.areEquals(curY, y)) return true;
+ return false;
}
- private boolean isOnGrid(SeaOfGatesTrack[] thisGrid, double value)
+ /**
+ * Method to return the distance to the closest goal point.
+ * @param curX the X coordinate.
+ * @param curY the Y coordinate.
+ * @return the distance to the closest goal point.
+ */
+ public double getDistToGoal(double curX, double curY)
{
- if (thisGrid != null)
+ if (hasEndpoints())
{
- int lo = 0, hi = thisGrid.length - 1;
- if (DBMath.isLessThan(value, thisGrid[lo].getCoordinate())) return false;
- if (DBMath.isGreaterThan(value, thisGrid[hi].getCoordinate())) return false;
-
- for(int i=0; i<1000; i++)
+ PossibleEndpoint bestPE = null;
+ double bestDist = Double.MAX_VALUE;
+ for(PossibleEndpoint pe : choices)
{
- int med = (hi + lo) / 2;
- if (DBMath.isGreaterThanOrEqualTo(value, thisGrid[med].getCoordinate()) &&
- DBMath.isLessThanOrEqualTo(value, thisGrid[med+1].getCoordinate()))
+ double dx = curX - pe.coord.getX(), dy = curY - pe.coord.getY();
+ double dist = Math.sqrt(dx*dx + dy*dy);
+ if (dist < bestDist)
{
- if (DBMath.areEquals(value, thisGrid[med].getCoordinate()) ||
- DBMath.areEquals(thisGrid[med+1].getCoordinate(), value))
- return true;
- return false;
+ bestDist = dist;
+ bestPE = pe;
}
- if (DBMath.isLessThanOrEqualTo(value, thisGrid[med].getCoordinate())) hi = med; else lo = med;
}
- return false;
+ if (bestPE != null) return bestDist;
}
- return true;
+
+ return Math.sqrt((curX-x)*(curX-x) + (curY-y)*(curY-y));
}
/**
- * Method to round a value up to the nearest routing grain size.
- * @param v the value to round up.
- * @return the granularized value.
+ * Method to find a goal point in a given range of X values and at a given Y value.
+ * @param lowX the low X value.
+ * @param highX the high X value.
+ * @param curY the Y coordinate.
+ * @return the X coordinate of the goal point that satisfies the request (null if none do).
*/
- private double upToGrain(double v)
+ public Double getGoalWithinX(double lowX, double highX, double curY)
{
- return v;
+ if (hasEndpoints())
+ {
+ for(PossibleEndpoint pe : choices)
+ {
+ if (curY == pe.coord.getY() && lowX < pe.coord.getX() && highX > pe.coord.getX())
+ return new Double(pe.coord.getX());
+ }
+ return null;
+ }
+
+ if (curY == y && lowX < x && highX > x) return new Double(x);
+ return null;
}
/**
- * Method to round a value up to the nearest routing grain size.
- * @param v the value to round up.
- * @return the granularized value.
+ * Method to find a goal point in a given range of Y values and at a given X value.
+ * @param curX the X coordinate.
+ * @param lowY the low Y value.
+ * @param highY the high Y value.
+ * @return the Y coordinate of the goal point that satisfies the request (null if none do).
*/
- private double upToGrainAlways(double v)
+ public Double getGoalWithinY(double curX, double lowY, double highY)
{
- return Math.ceil(v);
+ if (hasEndpoints())
+ {
+ for(PossibleEndpoint pe : choices)
+ {
+ if (curX == pe.coord.getX() && lowY < pe.coord.getY() && highY > pe.coord.getY())
+ return new Double(pe.coord.getY());
+ }
+ return null;
+ }
+
+ if (curX == x && lowY < y && highY > y) return new Double(y);
+ return null;
}
/**
- * Method to round a value down to the nearest routing grain size.
- * @param v the value to round down.
- * @return the granularized value.
+ * Method to find a goal point at a Y value and above a given X value.
+ * @param curX the X coordinate.
+ * @param curY the Y coordinate.
+ * @return the X coordinate of the goal point that satisfies the request (null if none do).
*/
- private double downToGrain(double v)
+ public Double getGoalAboveX(double curX, double curY)
{
- return v;
+ if (hasEndpoints())
+ {
+ for(PossibleEndpoint pe : choices)
+ {
+ if (curX > pe.coord.getX() && DBMath.areEquals(curY, pe.coord.getY()))
+ return new Double(pe.coord.getX());
+ }
+ return null;
+ }
+
+ if (curX > x && curY >= rect.getMinY() && curY <= rect.getMaxY()) return new Double(x);
+ return null;
}
/**
- * Method to round a value down to the nearest routing grain size.
- * @param v the value to round down.
- * @return the granularized value.
+ * Method to find a goal point at a Y value and below a given X value.
+ * @param curX the X coordinate.
+ * @param curY the Y coordinate.
+ * @return the X coordinate of the goal point that satisfies the request (null if none do).
*/
- private double downToGrainAlways(double v)
+ public Double getGoalBelowX(double curX, double curY)
{
- return Math.floor(v);
+ if (hasEndpoints())
+ {
+ for(PossibleEndpoint pe : choices)
+ {
+ if (curX < pe.coord.getX() && DBMath.areEquals(curY, pe.coord.getY()))
+ return new Double(pe.coord.getX());
+ }
+ return null;
+ }
+
+ if (curX < x && curY >= rect.getMinY() && curY <= rect.getMaxY()) return new Double(x);
+ return null;
}
/**
- * Method to determine whether a contact can be placed that will connect existing metal to new metal.
- * @param np the contact.
- * @param newMetal the new metal layer (0-based).
- * @param offendingMetal the existing metal layer (0-based).
- * @param offendingMetalColor the mask color of the existing metal layer.
- * @param conX the X coordinate of the contact.
- * @param conY the Y coordinate of the contact.
- * @param conWid the width of the contact.
- * @param conHei the height of the contact.
- * @param orient the orientation of the contact.
- * @return true if the contact fits (the offending metal already exists and the new metal is available).
+ * Method to find a goal point at an X value and above a given Y value.
+ * @param curX the X coordinate.
+ * @param curY the Y coordinate.
+ * @return the Y coordinate of the goal point that satisfies the request (null if none do).
*/
- private boolean canPlaceContact(PrimitiveNode np, int newMetal, int offendingMetal, int offendingMetalColor,
- double conX, double conY, double conWid, double conHei, Orientation orient, boolean endA)
+ public Double getGoalAboveY(double curX, double curY)
{
- NodeInst dummyNi = NodeInst.makeDummyInstance(np, ep, EPoint.fromLambda(conX, conY), conWid, conHei, orient);
- Poly[] conPolys = tech.getShapeOfNode(dummyNi);
- FixpTransform trans = null;
- MutableInteger mi = new MutableInteger(netID.intValue() + (endA ? BLOCKAGEENDA : BLOCKAGEENDB));
- if (orient != Orientation.IDENT) trans = dummyNi.rotateOut();
- for (int p = 0; p < conPolys.length; p++)
+ if (hasEndpoints())
{
- Poly conPoly = conPolys[p];
- Layer conLayer = conPoly.getLayer();
- if (!conLayer.getFunction().isMetal()) continue;
- if (trans != null) conPoly.transform(trans);
- Rectangle2D conRect = conPoly.getBounds2D();
-
- // if this is the offending metal layer, check to see that the geometry already exists
- boolean found = false;
- for(int c=0; c<metalLayers[offendingMetal].length; c++)
- if (conLayer == metalLayers[offendingMetal][c] &&
- conLayer.getFunction().getMaskColor() == offendingMetalColor) found = true;
- if (found)
- {
- if (!isPointInMetal(conRect.getMinX(), conRect.getMinY(), offendingMetal, mi) ||
- !isPointInMetal(conRect.getMinX(), conRect.getMaxY(), offendingMetal, mi) ||
- !isPointInMetal(conRect.getMaxX(), conRect.getMaxY(), offendingMetal, mi) ||
- !isPointInMetal(conRect.getMaxX(), conRect.getMinY(), offendingMetal, mi) ||
- !isPointInMetal(conRect.getCenterX(), conRect.getCenterY(), offendingMetal, mi))
- {
- // offending layer is not there: cannot place contact
- return false;
- }
- }
-
- // if this is the new metal layer, make sure there is room for it
- found = false;
- for(int c=0; c<metalLayers[newMetal].length; c++)
- if (conLayer == metalLayers[newMetal][c]) found = true;
- if (found)
+ for(PossibleEndpoint pe : choices)
{
- double[] fromSurround = getSpacingRule(newMetal, maxDefArcWidth[newMetal], -1);
- double halfWidth = conRect.getWidth() / 2;
- double halfHeight = conRect.getHeight() / 2;
- SOGBound block = getMetalBlockage(netID, newMetal, halfWidth, halfHeight, fromSurround, conRect.getCenterX(), conRect.getCenterY());
- if (block != null) return false;
+ if (curY > pe.coord.getY() && DBMath.areEquals(curX, pe.coord.getX()))
+ return new Double(pe.coord.getY());
}
+ return null;
}
- return true;
+
+ if (curY > y && curX >= rect.getMinX() && curX <= rect.getMaxX()) return new Double(y);
+ return null;
}
/**
- * Method to determine whether a point is covered by a metal layer on a given network.
- * @param x the X coordinate to search.
- * @param y the Y coordinate to search.
- * @param metalNo the metal number to consider.
- * @param netID the netID that must be on the metal (null to ignore this).
- * @return
+ * Method to find a goal point at an X value and below a given Y value.
+ * @param curX the X coordinate.
+ * @param curY the Y coordinate.
+ * @return the Y coordinate of the goal point that satisfies the request (null if none do).
*/
- private boolean isPointInMetal(double x, double y, int metalNo, MutableInteger netID)
+ public Double getGoalBelowY(double curX, double curY)
{
- // get the R-Tree data for the metal layer
- BlockageTree bTree = rTrees.getMetalTree(primaryMetalLayer[metalNo]);
- bTree.lock();
- try {
- if (bTree.isEmpty()) return false;
-
- Rectangle2D searchArea = new Rectangle2D.Double(x, y, 0, 0);
- for (Iterator<SOGBound> sea = bTree.search(searchArea); sea.hasNext();)
+ if (hasEndpoints())
+ {
+ for(PossibleEndpoint pe : choices)
{
- SOGBound sBound = sea.next();
- if (sBound.containsPoint(x, y))
- {
+ if (curY < pe.coord.getY() && DBMath.areEquals(curX, pe.coord.getX()))
+ return new Double(pe.coord.getY());
+ }
+ return null;
+ }
+
+ if (curY < y && curX >= rect.getMinX() && curX <= rect.getMaxX()) return new Double(y);
+ return null;
+ }
+ }
+
+ /************************************** NEEDEDROUTE: A ROUTE TO BE RUN **************************************/
+
+ Map<Integer,List<MutableInteger>> netIDsByValue = new HashMap<Integer,List<MutableInteger>>();
+
+ /**
+ * Class to hold a route that must be run.
+ */
+ public class NeededRoute
+ {
+ private String routeName;
+ private RouteBatch batch;
+ private int routeInBatch;
+ private final Rectangle2D routeBounds;
+ private MutableInteger netID;
+ private final double minWidth;
+ private Rectangle2D jumpBound;
+ private int complexityLimit;
+ private int maxDistance;
+ private PossibleEndpoints aEndpoints, bEndpoints;
+ private double aTaperWid, bTaperWid;
+ private double aTaperLen, bTaperLen;
+ private final PortInst aPi, bPi;
+ private int aZ, bZ;
+ private int aC, bC;
+ private boolean alreadyRouted;
+ private Boolean debuggingRouteFromA;
+ private PossibleEndpoint replaceA, replaceB;
+ private int replaceAZ, replaceBZ;
+ private int replaceAC, replaceBC;
+ private final List<PortInst> spineTaps;
+ private final Map<SearchVertex,PortInst> spineTapMap;
+ private final Map<PortInst,ImmutableNodeInst> spineTapNIMap;
+ private final Poly aPoly, bPoly;
+ private Rectangle2D[] buckets;
+ private Map<Layer,List<SOGBound>> endBlockages;
+ /** true when routed successfully */ private volatile boolean routedSuccess;
+ private String errorMessage;
+ /** true when this is the second try on the route */ private boolean reroute;
+ private SeaOfGatesTrack[][] gridLocationsX, gridLocationsY;
+ private Map<SOGBound,Integer> extractList;
+ private boolean[] overridePreventArcs, forceGridArcs;
+ private double[] overrideMetalWidth, overrideMetalSpacingX, overrideMetalSpacingY;
+ private double[][] overrideMetalSpacings;
+ private Wavefront winningWF, dirAtoB, dirBtoA;
+ private MessageLog loggedMessage;
+
+ public NeededRoute(String routeName, PortInst aPi, PortInst bPi, ArcProto aArc, ArcProto bArc,
+ List<PortInst> spineTaps, double minWidth)
+ {
+ // determine the coordinates of the route
+ winningWF = null;
+ this.routeName = routeName;
+ this.spineTaps = spineTaps;
+ this.complexityLimit = prefs.complexityLimit;
+ this.maxDistance = prefs.maxDistance;
+ alreadyRouted = false;
+ replaceA = replaceB = null;
+ replaceAZ = replaceBZ = 0;
+ replaceAC = replaceBC = 0;
+ if (spineTaps == null)
+ {
+ spineTapMap = null;
+ spineTapNIMap = null;
+ } else
+ {
+ spineTapMap = new HashMap<SearchVertex,PortInst>();
+ spineTapNIMap = new HashMap<PortInst,ImmutableNodeInst>();
+ }
+ overrideMetalWidth = null;
+ overrideMetalSpacingX = overrideMetalSpacingY = null;
+ overrideMetalSpacings = new double[numMetalLayers][];
+
+ // set minimum arc width if there are no width overrides
+ for(int z=0; z<numMetalLayers; z++)
+ {
+ for(int c=0; c<metalArcs[z].length; c++)
+ {
+ if (sogp.getDefaultWidthOverride(metalArcs[z][c]) == null) continue;
+ minWidth = 0;
+ break;
+ }
+ }
+ this.minWidth = minWidth;
+
+ for(int z=0; z<numMetalLayers; z++)
+ {
+ overrideMetalSpacings[z] = null;
+ Double overrideWidth = null;
+ boolean hadXOverride = false, hadYOverride = false;
+ for(int c=0; c<metalArcs[z].length; c++)
+ {
+ Double o = sogp.getDefaultWidthOverride(metalArcs[z][c]);
+ if (o == null) continue;
+ if (overrideWidth == null || o.doubleValue() > overrideWidth.doubleValue()) overrideWidth = o;
+
+ SeaOfGatesArcProperties sogap = sogp.getOverridesForArcsOnNet(routeName, metalArcs[z][c]);
+ if (sogap != null && sogap.getWidthOverride() != null) overrideWidth = sogap.getWidthOverride();
+ if (overrideWidth != null)
+ {
+ if (overrideMetalWidth == null)
+ {
+ overrideMetalWidth = new double[numMetalLayers];
+ for (int i = 0; i < numMetalLayers; i++)
+ {
+ if (metalArcs[i] == null) continue;
+ for(int cc=0; cc<metalArcs[i].length; cc++)
+ overrideMetalWidth[i] = Math.max(metalArcs[i][cc].getDefaultLambdaBaseWidth(ep), minWidth);
+ }
+ }
+ overrideMetalWidth[z] = overrideWidth.doubleValue();
+ }
+
+ Double overrideSpacingX = sogp.getDefaultSpacingOverride(metalArcs[z][c], 0);
+ Double overrideSpacingY = sogp.getDefaultSpacingOverride(metalArcs[z][c], 1);
+ if (sogap != null && sogap.getSpacingOverride(0) != null) overrideSpacingX = sogap.getSpacingOverride(0);
+ if (sogap != null && sogap.getSpacingOverride(1) != null) overrideSpacingY = sogap.getSpacingOverride(1);
+
+ if (overrideSpacingX != null)
+ {
+ hadXOverride = true;
+ if (overrideMetalSpacingX == null) // first time?
+ {
+ overrideMetalSpacingX = new double[numMetalLayers];
+ for (int i = 0; i < numMetalLayers; i++)
+ {
+ overrideMetalSpacingX[i] = 0;
+ if (metalLayers[i] == null || metalArcs[i] == null) continue;
+ for(int cc=0; cc<metalArcs[i].length; cc++)
+ {
+ DRCTemplate rule = DRC.getSpacingRule(metalLayers[i][cc], null, metalLayers[i][cc], null,
+ false, -1, metalArcs[i][cc].getDefaultLambdaBaseWidth(ep), 50);
+ if (rule != null)
+ overrideMetalSpacingX[i] = rule.getValue(0);
+ }
+ }
+ }
+ overrideMetalSpacingX[z] = overrideSpacingX.doubleValue();
+ }
+ if (overrideSpacingY != null)
+ {
+ hadYOverride = true;
+ if (overrideMetalSpacingY == null) // first time?
+ {
+ overrideMetalSpacingY = new double[numMetalLayers];
+ for (int i = 0; i < numMetalLayers; i++)
+ {
+ overrideMetalSpacingY[i] = 0;
+ if (metalLayers[i] == null || metalArcs[i] == null) continue;
+ for(int cc=0; cc<metalArcs[i].length; cc++)
+ {
+ DRCTemplate rule = DRC.getSpacingRule(metalLayers[i][cc], null, metalLayers[i][cc], null,
+ false, -1, metalArcs[i][cc].getDefaultLambdaBaseWidth(ep), 50);
+ if (rule != null)
+ {
+ if (rule.getNumValues() <= 1) overrideMetalSpacingY[i] = rule.getValue(0); else
+ overrideMetalSpacingY[i] = rule.getValue(1);
+ }
+ }
+ }
+ }
+ overrideMetalSpacingY[z] = overrideSpacingY.doubleValue();
+ }
+ }
+ if (hadXOverride && hadYOverride)
+ overrideMetalSpacings[z] = new double[] {overrideMetalSpacingX[z], overrideMetalSpacingY[z]};
+ }
+
+ this.aPi = aPi;
+ this.bPi = bPi;
+ aPoly = aPi.getPoly();
+ bPoly = bPi.getPoly();
+
+ // determine area of endpoints
+ FixpRectangle aRect = aPoly.getBounds2D();
+ FixpRectangle bRect = bPoly.getBounds2D();
+
+ double aX, aY, bX, bY;
+ if (bRect.getMaxX() < aRect.getMinX())
+ {
+ bX = upToGrain(bRect.getCenterX());
+ aX = downToGrain(aRect.getCenterX());
+ } else if (bRect.getMinX() > aRect.getMaxX())
+ {
+ bX = downToGrain(bRect.getCenterX());
+ aX = upToGrain(aRect.getCenterX());
+ } else
+ {
+ double xVal = (Math.max(bRect.getMinX(), aRect.getMinX()) + Math.min(bRect.getMaxX(), aRect.getMaxX())) / 2;
+ bX = aX = upToGrain(xVal);
+ }
+ if (bRect.getMaxY() < aRect.getMinY())
+ {
+ bY = upToGrain(bRect.getCenterY());
+ aY = downToGrain(aRect.getCenterY());
+ } else if (bRect.getMinY() > aRect.getMaxY())
+ {
+ bY = downToGrain(bRect.getCenterY());
+ aY = upToGrain(aRect.getCenterY());
+ } else
+ {
+ double yVal = (Math.max(bRect.getMinY(), aRect.getMinY()) + Math.min(bRect.getMaxY(), aRect.getMaxY())) / 2;
+ bY = aY = upToGrain(yVal);
+ }
+
+ aZ = aArc.getFunction().getLevel() - 1;
+ bZ = bArc.getFunction().getLevel() - 1;
+ aC = aArc.getMaskLayer();
+ bC = bArc.getMaskLayer();
+
+ double lowX = Math.min(aRect.getMinX(), bRect.getMinX()), highX = Math.max(aRect.getMaxX(), bRect.getMaxX());
+ double lowY = Math.min(aRect.getMinY(), bRect.getMinY()), highY = Math.max(aRect.getMaxY(), bRect.getMaxY());
+
+ // first construct a grid for an immense bound
+ // original value was 100
+ double gap = DRC.getWorstSpacingDistance(tech, -1) * maxDistance;
+ Rectangle2D testBounds = new Rectangle2D.Double(lowX - gap, lowY - gap, highX - lowX + gap * 2, highY - lowY + gap * 2);
+ buildGrids(aX, aY, bX, bY, testBounds);
+
+ // now expand the end bounds to reach grid locations
+ double aLX = getLowerXGrid(aZ, aRect.getMinX()).getCoordinate();
+ double aHX = getUpperXGrid(aZ, aRect.getMaxX()).getCoordinate();
+ double aLY = getLowerYGrid(aZ, aRect.getMinY()).getCoordinate();
+ double aHY = getUpperYGrid(aZ, aRect.getMaxY()).getCoordinate();
+ FixpRectangle aRectGridded = FixpRectangle.from(new Rectangle2D.Double(aLX, aLY, aHX-aLX, aHY-aLY));
+ double bLX = getLowerXGrid(bZ, bRect.getMinX()).getCoordinate();
+ double bHX = getUpperXGrid(bZ, bRect.getMaxX()).getCoordinate();
+ double bLY = getLowerYGrid(bZ, bRect.getMinY()).getCoordinate();
+ double bHY = getUpperYGrid(bZ, bRect.getMaxY()).getCoordinate();
+ FixpRectangle bRectGridded = FixpRectangle.from(new Rectangle2D.Double(bLX, bLY, bHX-bLX, bHY-bLY));
+
+ aEndpoints = new PossibleEndpoints(aX, aY, aRect, aRectGridded);
+ bEndpoints = new PossibleEndpoints(bX, bY, bRect, bRectGridded);
+
+ // now define bounds as the gridded envelope of a smaller bound
+ double maxStrayFromRouteBoundsX = gap, maxStrayFromRouteBoundsY = gap;
+ double griddedLowX = Math.min(getLowerXGrid(aZ, lowX-maxStrayFromRouteBoundsX).getCoordinate(), getLowerXGrid(bZ, lowX-maxStrayFromRouteBoundsX).getCoordinate());
+ double griddedHighX = Math.max(getUpperXGrid(aZ, highX+maxStrayFromRouteBoundsX).getCoordinate(), getUpperXGrid(bZ, highX+maxStrayFromRouteBoundsX).getCoordinate());
+ double griddedLowY = Math.min(getLowerYGrid(aZ, lowY-maxStrayFromRouteBoundsY).getCoordinate(), getLowerYGrid(bZ, lowY-maxStrayFromRouteBoundsY).getCoordinate());
+ double griddedHighY = Math.max(getUpperYGrid(aZ, highY+maxStrayFromRouteBoundsY).getCoordinate(), getUpperYGrid(bZ, highY+maxStrayFromRouteBoundsY).getCoordinate());
+ if (routingBoundsLimit != null)
+ {
+ if (griddedLowX < routingBoundsLimit.getMinX()) griddedLowX = routingBoundsLimit.getMinX();
+ if (griddedHighX > routingBoundsLimit.getMaxX()) griddedHighX = routingBoundsLimit.getMaxX();
+ if (griddedLowY < routingBoundsLimit.getMinY()) griddedLowY = routingBoundsLimit.getMinY();
+ if (griddedHighY > routingBoundsLimit.getMaxY()) griddedHighY = routingBoundsLimit.getMaxY();
+ }
+ routeBounds = new Rectangle2D.Double(griddedLowX, griddedLowY, griddedHighX - griddedLowX, griddedHighY - griddedLowY);
+ jumpBound = new Rectangle2D.Double(Math.min(aX, bX), Math.min(aY, bY), Math.abs(aX-bX), Math.abs(aY-bY));
+
+ // set overrides for this specific route
+ overridePreventArcs = null;
+ List<ArcProto> arcs = sogp.getArcsOnNet(routeName);
+ if (arcs != null && arcs.size() > 0)
+ {
+ overridePreventArcs = new boolean[numMetalLayers];
+ for(int i=0; i<numMetalLayers; i++) overridePreventArcs[i] = true;
+ for(ArcProto ap : arcs)
+ {
+ int metNum = ap.getFunction().getLevel() - 1;
+ overridePreventArcs[metNum] = false;
+ }
+ }
+ forceGridArcs = new boolean[numMetalLayers];
+ for(int i=0; i<numMetalLayers; i++)
+ {
+ forceGridArcs[i] = false;
+ for(int c=0; c<metalArcs[i].length; c++)
+ if (sogp.isGridForced(metalArcs[i][c])) forceGridArcs[i] = true;
+ }
+
+ // determine the taper widths
+ aTaperWid = getTaperWidth(aPi, aZ);
+ bTaperWid = getTaperWidth(bPi, bZ);
+ aTaperLen = taperLength[aZ];
+ bTaperLen = taperLength[bZ];
+ if (DBMath.areEquals(aTaperWid, getUntaperedArcWidth(aZ))) aTaperLen = -1;
+ if (DBMath.areEquals(bTaperWid, getUntaperedArcWidth(bZ))) bTaperLen = -1;
+ }
+
+ public boolean getRoutedSucess() { return routedSuccess; }
+ public boolean isAlreadyRouted() { return alreadyRouted; }
+ public Wavefront getWavefront() { return winningWF; }
+ public Wavefront getWavefrontAtoB() { return dirAtoB; }
+ public Wavefront getWavefrontBtoA() { return dirBtoA; }
+ public double getATaperWidth() { return aTaperWid; }
+ public double getBTaperWidth() { return bTaperWid; }
+ public double getATaperLength() { return aTaperLen; }
+ public double getBTaperLength() { return bTaperLen; }
+ public PossibleEndpoints getAPossibleEndpoints() { return aEndpoints; }
+ public PossibleEndpoints getBPossibleEndpoints() { return bEndpoints; }
+ public String getErrorMessage() { return errorMessage; }
+
+ public void setDebugging(Boolean fromA) { debuggingRouteFromA = fromA; }
+
+ /**
+ * Method to check the validity of the endpoints with respect to forced gridding.
+ * If the grid is being forced and the endpoints are not on grid,
+ * routing may fail (and a warning will be issued here).
+ */
+ public void checkGridValidity()
+ {
+ if (forceGridArcs[aZ])
+ {
+ boolean hor = true;
+ if (sogp.isHorizontalEven())
+ {
+ if ((aZ%2) == 0) hor = false;
+ } else
+ {
+ if ((aZ%2) != 0) hor = false;
+ }
+ if (!hor && !isOnXGrid(aZ, getAX()))
+ {
+ List<EPoint> offGrid = new ArrayList<EPoint>(); offGrid.add(aEndpoints.getCenter()); offGrid.add(aEndpoints.getCenter());
+ warn("Route " + routeName + ", end (" + TextUtils.formatDistance(aEndpoints.getCenterX()) + "," + TextUtils.formatDistance(aEndpoints.getCenterY()) + "," +
+ describeMetal(aZ,aC) + ") is not on X grid (nearest X grids are at " + TextUtils.formatDistance(getLowerXGrid(aZ, aEndpoints.getCenterX()).getCoordinate()) +
+ " and " + TextUtils.formatDistance(getUpperXGrid(aZ, aEndpoints.getCenterX()).getCoordinate()) + "). Route may fail.", cell, offGrid, null);
+ }
+ if (hor && !isOnYGrid(aZ, aEndpoints.getCenterY()))
+ {
+ List<EPoint> offGrid = new ArrayList<EPoint>(); offGrid.add(aEndpoints.getCenter()); offGrid.add(aEndpoints.getCenter());
+ warn("Route " + routeName + ", end (" + TextUtils.formatDistance(aEndpoints.getCenterX()) + "," + TextUtils.formatDistance(aEndpoints.getCenterY()) + "," +
+ describeMetal(aZ,aC) + ") is not on Y grid (nearest Y grids are at " + TextUtils.formatDistance(getLowerYGrid(aZ, aEndpoints.getCenterY()).getCoordinate()) +
+ " and " + TextUtils.formatDistance(getUpperYGrid(aZ, aEndpoints.getCenterY()).getCoordinate()) + "). Route may fail.", cell, offGrid, null);
+ }
+ }
+ if (forceGridArcs[bZ])
+ {
+ boolean hor = true;
+ if (sogp.isHorizontalEven())
+ {
+ if ((bZ%2) == 0) hor = false;
+ } else
+ {
+ if ((bZ%2) != 0) hor = false;
+ }
+ if (!hor && !isOnXGrid(bZ, bEndpoints.getCenterX()))
+ {
+ List<EPoint> offGrid = new ArrayList<EPoint>(); offGrid.add(bEndpoints.getCenter()); offGrid.add(bEndpoints.getCenter());
+ warn("Route " + routeName + ", end (" + TextUtils.formatDistance(bEndpoints.getCenterX()) + "," + TextUtils.formatDistance(bEndpoints.getCenterY()) + "," +
+ describeMetal(bZ,bC) + ") is not on X grid (nearest X grids are at " + TextUtils.formatDistance(getLowerXGrid(bZ, bEndpoints.getCenterX()).getCoordinate()) +
+ " and " + TextUtils.formatDistance(getUpperXGrid(bZ, bEndpoints.getCenterX()).getCoordinate()) + "). Route may fail.", cell, offGrid, null);
+ }
+ if (hor && !isOnYGrid(bZ, bEndpoints.getCenterY()))
+ {
+ List<EPoint> offGrid = new ArrayList<EPoint>(); offGrid.add(bEndpoints.getCenter()); offGrid.add(bEndpoints.getCenter());
+ warn("Route " + routeName + ", end (" + TextUtils.formatDistance(bEndpoints.getCenterX()) + "," + TextUtils.formatDistance(bEndpoints.getCenterY()) + "," +
+ describeMetal(bZ,bC) + ") is not on Y grid (nearest Y grids are at " + TextUtils.formatDistance(getLowerYGrid(bZ, bEndpoints.getCenterY()).getCoordinate()) +
+ " and " + TextUtils.formatDistance(getUpperYGrid(bZ, bEndpoints.getCenterY()).getCoordinate()) + "). Route may fail.", cell, offGrid, null);
+ }
+ }
+ }
+
+ public SeaOfGatesTrack[][] getXRoutingGrid() { return gridLocationsX; }
+
+ public SeaOfGatesTrack[][] getYRoutingGrid() { return gridLocationsY; }
+
+ /**
+ * Method to construct grids for all layers in the vicinity of this route.
+ */
+ public void buildGrids(double aX, double aY, double bX, double bY, Rectangle2D bounds)
+ {
+ gridLocationsX = new SeaOfGatesTrack[numMetalLayers][];
+ gridLocationsY = new SeaOfGatesTrack[numMetalLayers][];
+
+ // first make the grid positions for each layer
+ for(int metNum=1; metNum<=numMetalLayers; metNum++)
+ {
+ int metIndex = metNum - 1;
+ SeaOfGatesTrack[] thisGrid = metalGrid[metIndex];
+ if (thisGrid == null) continue;
+ if (!sogp.isForceHorVer() && !sogp.isFavorHorVer()) continue;
+ boolean hor = true;
+ if (sogp.isHorizontalEven())
+ {
+ if ((metNum%2) != 0) hor = false;
+ } else
+ {
+ if ((metNum%2) == 0) hor = false;
+ }
+ double offset = thisGrid[0].getCoordinate();
+ double range = thisGrid[thisGrid.length-1].getCoordinate() - offset;
+ range += thisGrid[1].getCoordinate() - thisGrid[0].getCoordinate();
+ if (range > 0)
+ {
+ List<SeaOfGatesTrack> values = new ArrayList<SeaOfGatesTrack>();
+ double low, high;
+ if (hor)
+ {
+ low = bounds.getMinY();
+ high = bounds.getMaxY();
+ } else
+ {
+ low = bounds.getMinX();
+ high = bounds.getMaxX();
+ }
+ double lowGroup = Math.floor((low - offset) / range) * range;
+ double highGroup = Math.ceil((high - offset) / range) * range;
+ for(double v = lowGroup; v <= highGroup; v += range)
+ {
+ for(int i=0; i<thisGrid.length; i++)
+ {
+ double val = v + thisGrid[i].getCoordinate();
+ int maskNum = thisGrid[i].getMaskNum();
+ if (val >= low && val <= high)
+ values.add(new SeaOfGatesTrack(val, maskNum));
+ }
+ }
+ if (values.size() >= 2)
+ {
+ if (hor)
+ {
+ gridLocationsY[metIndex] = makeArrayOfUniqueTracks(values);
+ } else
+ {
+ gridLocationsX[metIndex] = makeArrayOfUniqueTracks(values);
+ }
+ }
+ }
+ }
+
+ // now make the intermediate grid positions that combine locations from upper and lower layers
+ for(int metNum=1; metNum<=numMetalLayers; metNum++)
+ {
+ int metIndex = metNum - 1;
+ boolean hor = true;
+ if (sogp.isHorizontalEven())
+ {
+ if ((metNum%2) != 0) hor = false;
+ } else
+ {
+ if ((metNum%2) == 0) hor = false;
+ }
+
+ SeaOfGatesTrack[][] gridLocations;
+ SeaOfGatesTrack t1, t2;
+ if (hor)
+ {
+ // horizontal layer: combine X locations from upper and lower layers
+ gridLocations = gridLocationsX;
+ t1 = getClosestXGrid(aZ, aX);
+ t2 = getClosestXGrid(bZ, bX);
+ } else
+ {
+ // vertical layer: combine Y locations from upper and lower layers
+ gridLocations = gridLocationsY;
+ t1 = getClosestXGrid(aZ, aY);
+ t2 = getClosestXGrid(bZ, bY);
+ }
+ List<SeaOfGatesTrack> values = new ArrayList<SeaOfGatesTrack>();
+ boolean realGrid = false;
+ if (metIndex > 0)
+ realGrid |= gridAlternateLayer(metIndex, -1, values, t1, t2, gridLocations);
+ if (metIndex < numMetalLayers-1)
+ realGrid |= gridAlternateLayer(metIndex, 1, values, t1, t2, gridLocations);
+ if (realGrid)
+ {
+ gridLocations[metIndex] = makeArrayOfUniqueTracks(values);
+ }
+ }
+ }
+
+ private SeaOfGatesTrack[] makeArrayOfUniqueTracks(List<SeaOfGatesTrack> values)
+ {
+ Collections.sort(values);
+ for(int i=1; i<values.size(); i++)
+ {
+ if (DBMath.areEquals(values.get(i-1).getCoordinate(), values.get(i).getCoordinate()))
+ {
+ values.remove(i);
+ i--;
+ }
+ }
+ SeaOfGatesTrack[] gridLocations = new SeaOfGatesTrack[values.size()];
+ int i=0;
+ for(SeaOfGatesTrack v : values) gridLocations[i++] = v;
+ return gridLocations;
+ }
+
+ /**
+ * Method to consider an alternate layer's gridding when building the current layer's gridding information.
+ * @param curLayer the metal layer being considered (0-based).
+ * @param diff +1 or -1 to indicate the adjoining layer.
+ * @param values a Set of Doubles with grid stops in the X/Y axis.
+ * @param e1 the A endpoint coordinate (X or Y) to use if needed.
+ * @param e1 the B endpoint coordinate (X or Y) to use if needed.
+ * @param gridLocations the grid values (entry may be null)
+ * @return true if there are real grid values applied from a neighboring layer.
+ */
+ private boolean gridAlternateLayer(int curLayer, int diff, List<SeaOfGatesTrack> values, SeaOfGatesTrack t1, SeaOfGatesTrack t2, SeaOfGatesTrack[][] gridLocations)
+ {
+ // if the current layer is blocked, ignore grid building on it
+ if (sogp.isPrevented(primaryMetalArc[curLayer])) return false;
+
+ // if the alternate layer is blocked, ignore its grid factor
+ int altLayer = curLayer + diff;
+
+ // if the alternate layer has no grid, use the endpoints of the route
+ if (gridLocations[altLayer] == null)
+ {
+ values.add(t1);
+ values.add(t2);
+ return false;
+ }
+
+ // alternate layer is gridded, so grid this layer with those stops
+ for(int i=0; i<gridLocations[altLayer].length; i++)
+ values.add(new SeaOfGatesTrack(gridLocations[altLayer][i].getCoordinate(), gridLocations[altLayer][i].getMaskNum()));
+ return true;
+ }
+
+ /**
+ * Method to adjust an X value down to the lower grid value.
+ * @param metNum the metal layer number (0-based).
+ * @param value the X value to be adjusted.
+ * @return the closest X grid value at or below the given value.
+ */
+ public SeaOfGatesTrack getLowerXGrid(int metNum, double value)
+ {
+ return findLowerValue(gridLocationsX[metNum], value);
+ }
+
+ /**
+ * Method to adjust an X value up to the higher grid value.
+ * @param metNum the metal layer number (0-based).
+ * @param value the X value to be adjusted.
+ * @return the closest X grid value at or above the given value.
+ */
+ public SeaOfGatesTrack getUpperXGrid(int metNum, double value)
+ {
+ return findUpperValue(gridLocationsX[metNum], value);
+ }
+
+ /**
+ * Method to adjust an X value up to the nearest grid value.
+ * @param metNum the metal layer number (0-based).
+ * @param value the X value to be adjusted.
+ * @return the closest X grid value to the given value.
+ */
+ public SeaOfGatesTrack getClosestXGrid(int metNum, double value)
+ {
+ return findClosestValue(gridLocationsX[metNum], value);
+ }
+
+ /**
+ * Method to adjust an Y value down to the lower grid value.
+ * @param metNum the metal layer number (0-based).
+ * @param value the Y value to be adjusted.
+ * @return the closest Y grid value at or below the given value.
+ */
+ public SeaOfGatesTrack getLowerYGrid(int metNum, double value)
+ {
+ return findLowerValue(gridLocationsY[metNum], value);
+ }
+
+ /**
+ * Method to adjust an Y value up to the higher grid value.
+ * @param metNum the metal layer number (0-based).
+ * @param value the Y value to be adjusted.
+ * @return the closest Y grid value at or above the given value.
+ */
+ public SeaOfGatesTrack getUpperYGrid(int metNum, double value)
+ {
+ return findUpperValue(gridLocationsY[metNum], value);
+ }
+
+ /**
+ * Method to adjust an Y value up to the nearest grid value.
+ * @param metNum the metal layer number (0-based).
+ * @param value the Y value to be adjusted.
+ * @return the closest Y grid value to the given value.
+ */
+ public SeaOfGatesTrack getClosestYGrid(int metNum, double value)
+ {
+ return findClosestValue(gridLocationsY[metNum], value);
+ }
+
+ public boolean isOnXGrid(int metNum, double value)
+ {
+ return isOnGrid(gridLocationsX[metNum], value);
+ }
+
+ public boolean isOnYGrid(int metNum, double value)
+ {
+ return isOnGrid(gridLocationsY[metNum], value);
+ }
+
+ private SeaOfGatesTrack findLowerValue(SeaOfGatesTrack[] thisGrid, double value)
+ {
+ if (thisGrid == null) return new SeaOfGatesTrack(value, 0);
+ int lo = 0, hi = thisGrid.length - 1;
+ if (DBMath.isLessThanOrEqualTo(value, thisGrid[lo].getCoordinate())) return thisGrid[lo];
+ if (DBMath.isGreaterThanOrEqualTo(value, thisGrid[hi].getCoordinate())) return thisGrid[hi];
+
+ for(int i=0; i<1000; i++)
+ {
+ int med = (hi + lo) / 2;
+ if (DBMath.isGreaterThanOrEqualTo(value, thisGrid[med].getCoordinate()) &&
+ DBMath.isLessThan(value, thisGrid[med+1].getCoordinate())) return thisGrid[med];
+ if (DBMath.isLessThan(value, thisGrid[med].getCoordinate())) hi = med; else lo = med;
+ }
+ return new SeaOfGatesTrack(value, 0);
+ }
+
+ private SeaOfGatesTrack findUpperValue(SeaOfGatesTrack[] thisGrid, double value)
+ {
+ if (thisGrid == null) return new SeaOfGatesTrack(value, 0);
+
+ int lo = 0, hi = thisGrid.length - 1;
+ if (DBMath.isLessThanOrEqualTo(value, thisGrid[lo].getCoordinate())) return thisGrid[lo];
+ if (DBMath.isGreaterThanOrEqualTo(value, thisGrid[hi].getCoordinate())) return thisGrid[hi];
+
+ for(int i=0; i<1000; i++)
+ {
+ int med = (hi + lo) / 2;
+ if (DBMath.isGreaterThan(value, thisGrid[med].getCoordinate()) &&
+ DBMath.isLessThanOrEqualTo(value, thisGrid[med+1].getCoordinate())) return thisGrid[med+1];
+ if (DBMath.isLessThanOrEqualTo(value, thisGrid[med].getCoordinate())) hi = med; else lo = med;
+ }
+ return new SeaOfGatesTrack(value, 0);
+ }
+
+ private SeaOfGatesTrack findClosestValue(SeaOfGatesTrack[] thisGrid, double value)
+ {
+ if (thisGrid == null) return new SeaOfGatesTrack(value, 0);
+
+ int lo = 0, hi = thisGrid.length - 1;
+ if (DBMath.isLessThanOrEqualTo(value, thisGrid[lo].getCoordinate())) return thisGrid[lo];
+ if (DBMath.isGreaterThanOrEqualTo(value, thisGrid[hi].getCoordinate())) return thisGrid[hi];
+
+ for(int i=0; i<1000; i++)
+ {
+ int med = (hi + lo) / 2;
+ if (DBMath.isGreaterThanOrEqualTo(value, thisGrid[med].getCoordinate()) &&
+ DBMath.isLessThan(value, thisGrid[med+1].getCoordinate()))
+ {
+ if (DBMath.isLessThan(value - thisGrid[med].getCoordinate(), thisGrid[med+1].getCoordinate() - value))
+ return thisGrid[med];
+ return thisGrid[med+1];
+ }
+ if (DBMath.isLessThanOrEqualTo(value, thisGrid[med].getCoordinate())) hi = med; else lo = med;
+ }
+ return new SeaOfGatesTrack(value, 0);
+ }
+
+ private boolean isOnGrid(SeaOfGatesTrack[] thisGrid, double value)
+ {
+ if (thisGrid != null)
+ {
+ int lo = 0, hi = thisGrid.length - 1;
+ if (DBMath.isLessThan(value, thisGrid[lo].getCoordinate())) return false;
+ if (DBMath.isGreaterThan(value, thisGrid[hi].getCoordinate())) return false;
+
+ for(int i=0; i<1000; i++)
+ {
+ int med = (hi + lo) / 2;
+ if (DBMath.isGreaterThanOrEqualTo(value, thisGrid[med].getCoordinate()) &&
+ DBMath.isLessThanOrEqualTo(value, thisGrid[med+1].getCoordinate()))
+ {
+ if (DBMath.areEquals(value, thisGrid[med].getCoordinate()) ||
+ DBMath.areEquals(thisGrid[med+1].getCoordinate(), value))
+ return true;
+ return false;
+ }
+ if (DBMath.isLessThanOrEqualTo(value, thisGrid[med].getCoordinate())) hi = med; else lo = med;
+ }
+ return false;
+ }
+ return true;
+ }
+
+ /**
+ * Method to round a value up to the nearest routing grain size.
+ * @param v the value to round up.
+ * @return the granularized value.
+ */
+ private double upToGrain(double v)
+ {
+ return v;
+ }
+
+ /**
+ * Method to round a value up to the nearest routing grain size.
+ * @param v the value to round up.
+ * @return the granularized value.
+ */
+ private double upToGrainAlways(double v)
+ {
+ return Math.ceil(v);
+ }
+
+ /**
+ * Method to round a value down to the nearest routing grain size.
+ * @param v the value to round down.
+ * @return the granularized value.
+ */
+ private double downToGrain(double v)
+ {
+ return v;
+ }
+
+ /**
+ * Method to round a value down to the nearest routing grain size.
+ * @param v the value to round down.
+ * @return the granularized value.
+ */
+ private double downToGrainAlways(double v)
+ {
+ return Math.floor(v);
+ }
+
+ private class ContactPlacementError
+ {
+ public int metalLayer;
+ public ERectangle offendingRect;
+ public Rectangle2D missingRect;
+
+ public ContactPlacementError(int metalLayer)
+ {
+ this.metalLayer = metalLayer;
+ }
+
+ public String getError(PrimitiveNode pNp)
+ {
+ String msg = pNp.describe(false);
+ if (missingRect != null)
+ {
+ msg += " is missing Metal " + (metalLayer+1) + " at " + TextUtils.formatDistance(missingRect.getMinX()) +
+ "<=X<=" + TextUtils.formatDistance(missingRect.getMaxX()) + " and " + TextUtils.formatDistance(missingRect.getMinY()) +
+ "<=Y<=" + TextUtils.formatDistance(missingRect.getMaxY());
+ } else
+ {
+ msg += " has spacing error to Metal " + (metalLayer+1) + " at " + TextUtils.formatDistance(offendingRect.getMinX()) +
+ "<=X<=" + TextUtils.formatDistance(offendingRect.getMaxX()) + " and " + TextUtils.formatDistance(offendingRect.getMinY()) +
+ "<=Y<=" + TextUtils.formatDistance(offendingRect.getMaxY());
+ }
+ return msg;
+ }
+ }
+
+ /**
+ * Method to determine whether a contact can be placed that will connect existing metal to new metal.
+ * @param np the contact.
+ * @param newMetal the new metal layer (0-based).
+ * @param offendingMetal the existing metal layer (0-based).
+ * @param offendingMetalColor the mask color of the existing metal layer.
+ * @param conX the X coordinate of the contact.
+ * @param conY the Y coordinate of the contact.
+ * @param conWid the width of the contact.
+ * @param conHei the height of the contact.
+ * @param orient the orientation of the contact.
+ * @return null if the contact fits (the offending metal already exists and the new metal is available).
+ * Returns a ContactPlacementError object to describe the problem if there is one.
+ */
+ private ContactPlacementError canPlaceContact(PrimitiveNode np, int newMetal, int offendingMetal, int offendingMetalColor,
+ double conX, double conY, double conWid, double conHei, Orientation orient, Boolean endA)
+ {
+ NodeInst dummyNi = NodeInst.makeDummyInstance(np, ep, EPoint.fromLambda(conX, conY), conWid, conHei, orient);
+ Poly[] conPolys = tech.getShapeOfNode(dummyNi);
+ FixpTransform trans = null;
+ int blockFactor = (endA == null ? 0 : (endA.booleanValue() ? BLOCKAGEENDA : BLOCKAGEENDB));
+ MutableInteger mi = new MutableInteger(netID.intValue() + blockFactor);
+ if (orient != Orientation.IDENT) trans = dummyNi.rotateOut();
+ for (int p = 0; p < conPolys.length; p++)
+ {
+ Poly conPoly = conPolys[p];
+ Layer conLayer = conPoly.getLayer();
+ if (!conLayer.getFunction().isMetal()) continue;
+ if (trans != null) conPoly.transform(trans);
+ Rectangle2D conRect = conPoly.getBounds2D();
+
+ // if this is the offending metal layer, check to see that the geometry already exists
+ boolean found = false;
+ for(int c=0; c<metalLayers[offendingMetal].length; c++)
+ if (conLayer == metalLayers[offendingMetal][c] &&
+ conLayer.getFunction().getMaskColor() == offendingMetalColor) found = true;
+ if (found)
+ {
+ EPoint problem = null;
+ if (!isPointInMetal(conRect.getMinX(), conRect.getMinY(), offendingMetal, mi))
+ problem = EPoint.fromLambda(conRect.getMinX(), conRect.getMinY());
+ if (problem == null && !isPointInMetal(conRect.getMinX(), conRect.getMaxY(), offendingMetal, mi))
+ problem = EPoint.fromLambda(conRect.getMinX(), conRect.getMaxY());
+ if (problem == null && !isPointInMetal(conRect.getMaxX(), conRect.getMaxY(), offendingMetal, mi))
+ problem = EPoint.fromLambda(conRect.getMaxX(), conRect.getMaxY());
+ if (problem == null && !isPointInMetal(conRect.getMaxX(), conRect.getMinY(), offendingMetal, mi))
+ problem = EPoint.fromLambda(conRect.getMaxX(), conRect.getMinY());
+ if (problem == null && !isPointInMetal(conRect.getCenterX(), conRect.getCenterY(), offendingMetal, mi))
+ problem = EPoint.fromLambda(conRect.getCenterX(), conRect.getCenterY());
+ if (problem != null)
+ {
+ // offending layer is not there: cannot place contact
+ ContactPlacementError cpe = new ContactPlacementError(offendingMetal);
+ cpe.missingRect = conRect;
+ return cpe;
+ }
+ }
+
+ // if this is the new metal layer, make sure there is room for it
+ found = false;
+ int color = -1;
+ for(int c=0; c<metalLayers[newMetal].length; c++)
+ if (conLayer == metalLayers[newMetal][c]) { found = true; color = c; }
+ if (found)
+ {
+ double[] fromSurround = getSpacingRule(newMetal, maxDefArcWidth[newMetal], -1);
+ double halfWidth = conRect.getWidth() / 2;
+ double halfHeight = conRect.getHeight() / 2;
+ SOGBound block = getMetalBlockage(netID, newMetal, color, halfWidth, halfHeight, fromSurround,
+ conRect.getCenterX(), conRect.getCenterY());
+ if (block != null)
+ {
+ ContactPlacementError cpe = new ContactPlacementError(newMetal);
+ cpe.offendingRect = block.bound;
+ return cpe;
+ }
+ }
+ }
+ return null;
+ }
+
+ /**
+ * Method to determine whether a point is covered by a metal layer on a given network.
+ * @param x the X coordinate to search.
+ * @param y the Y coordinate to search.
+ * @param metalNo the metal number to consider.
+ * @param netID the netID that must be on the metal (null to ignore this).
+ * @return true if the point is in metal.
+ */
+ private boolean isPointInMetal(double x, double y, int metalNo, MutableInteger netID)
+ {
+ // get the R-Tree data for the metal layer
+ BlockageTree bTree = rTrees.getMetalTree(primaryMetalLayer[metalNo]);
+ bTree.lock();
+ try {
+ if (bTree.isEmpty()) return false;
+
+ Rectangle2D searchArea = new Rectangle2D.Double(x, y, 0, 0);
+ for (Iterator<SOGBound> sea = bTree.search(searchArea); sea.hasNext();)
+ {
+ SOGBound sBound = sea.next();
+ if (sBound.containsPoint(x, y))
+ {
if (netID != null)
{
- if (!sBound.isSameBasicNet(netID)) continue;
- int endBits = BLOCKAGEENDA | BLOCKAGEENDB;
- if ((sBound.getNetID().intValue()&endBits) != (netID.intValue()&endBits)) continue;
+ if (!sBound.isSameBasicNet(netID)) continue;
+ int endBits = BLOCKAGEENDA | BLOCKAGEENDB;
+ if ((sBound.getNetID().intValue()&endBits) != (netID.intValue()&endBits)) continue;
+ }
+ return true;
+ }
+ }
+ } finally {
+ bTree.unlock();
+ }
+ return false;
+ }
+
+ /**
+ * Method to determine the size and orientation of a contact.
+ * @param mv the MetalVia describing the contact.
+ * @param wid where the width will be stored.
+ * @param hei where the height will be stored.
+ * @return the orientation to use.
+ */
+ private Orientation getMVSize(MetalVia mv, double x, double y, double lastX, double lastY, MutableDouble wid, MutableDouble hei)
+ {
+ PrimitiveNode np = mv.via;
+ Orientation orient = Orientation.fromJava(mv.orientation * 10, false, false);
+ SizeOffset so = np.getProtoSizeOffset();
+ double minWid = minWidth;
+ double minHei = minWidth;
+ double xOffset = so.getLowXOffset() + so.getHighXOffset();
+ double yOffset = so.getLowYOffset() + so.getHighYOffset();
+ double conWid = Math.max(np.getDefWidth(ep) - xOffset, minWid) + xOffset;
+ double conHei = Math.max(np.getDefHeight(ep) - yOffset, minHei) + yOffset;
+ if (mv.horMetal >= 0)
+ {
+ double arcWid = getArcWidth(mv.horMetal, x, y, lastX, lastY) + mv.horMetalInset;
+ if (arcWid > conHei) conHei = arcWid;
+ }
+ if (mv.verMetal >= 0)
+ {
+ double arcWid = getArcWidth(mv.verMetal, x, y, lastX, lastY) + mv.verMetalInset;
+ if (arcWid > conWid) conWid = arcWid;
+ }
+ wid.setValue(conWid);
+ hei.setValue(conHei);
+ return orient;
+ }
+
+ /**
+ * Method to tell whether an endpoint of the route is invalid.
+ * @param endA true if the A end is being examined, false for the B end.
+ * @param pi the port of the end being examined.
+ * @return true if the port is invalid and cannot be routed (displays error message if so).
+ */
+ private boolean invalidPort(boolean endA, boolean tap, PortInst pi)
+ {
+ if (MULTIPLEDESTINATIONS)
+ return invalidPortNEW(endA, tap, pi);
+ return invalidPortOLD(endA, tap, pi);
+ }
+
+ /**
+ * Method to tell whether an endpoint of the route is invalid.
+ * @param endA true if the A end is being examined, false for the B end.
+ * @param pi the port of the end being examined.
+ * @return true if the port is invalid and cannot be routed (displays error message if so).
+ */
+ private boolean invalidPortNEW(boolean endA, boolean tap, PortInst pi)
+ {
+ EPoint pt = pi.getCenter();
+ double conX = pt.getX(), conY = pt.getY();
+
+ // first see if any metal layer on this end is available
+ ArcProto[] conns = getPossibleConnections(pi.getPortProto());
+ for (int j = 0; j < conns.length; j++)
+ {
+ ArcProto ap = conns[j];
+ if (ap.getTechnology() != tech) continue;
+ if (!ap.getFunction().isMetal()) continue;
+ if (preventArc(conns[j].getFunction().getLevel() - 1)) continue;
+ return false;
+ }
+
+ // determine location of contact
+ Map<Integer,Map<PrimitiveNode,ContactPlacementError>> whatWasChecked = new HashMap<Integer,Map<PrimitiveNode,ContactPlacementError>>();
+ Map<Integer,java.awt.Point> contactInvalidColors = new HashMap<Integer,java.awt.Point>();
+ int realOffendingMetal = 0;
+ Boolean end = tap ? null : Boolean.valueOf(endA);
+
+ // no metal layers available: see if a contact can be placed to shift to a valid layer
+ if (sogp.isContactAllowedDownToAvoidedLayer() || sogp.isContactAllowedUpToAvoidedLayer())
+ {
+ // list of possible places for a via
+ PossibleEndpoints possibleVias = endA ? aEndpoints : bEndpoints;
+
+ // first see if an adjoining layer is available
+ for (int j = 0; j < conns.length; j++)
+ {
+ ArcProto ap = conns[j];
+ if (ap.getTechnology() != tech) continue;
+ if (!ap.getFunction().isMetal()) continue;
+ int offendingMetal = conns[j].getFunction().getLevel() - 1;
+ int offendingMetalColor = conns[j].getMaskLayer();
+ int newMetal = 0;
+ int newMetalColor = 0;
+ int lowerMetal = offendingMetal - 1;
+ int upperMetal = offendingMetal + 1;
+ List<MetalVia> mvs = null;
+ if (sogp.isContactAllowedUpToAvoidedLayer() && lowerMetal >= 0 && !preventArc(lowerMetal))
+ {
+ // can drop down one metal layer to connect
+ mvs = metalVias[lowerMetal].getVias();
+ newMetal = lowerMetal;
+ }
+ if (sogp.isContactAllowedDownToAvoidedLayer() && upperMetal < numMetalLayers && !preventArc(upperMetal))
+ {
+ // can move up one metal layer to connect
+ mvs = metalVias[upperMetal-1].getVias();
+ newMetal = upperMetal;
+ }
+ if (mvs == null) continue;
+
+ // determine horizontal/vertical orientation
+ boolean hor = true;
+ if (sogp.isHorizontalEven())
+ {
+ if ((newMetal%2) == 0) hor = false;
+ } else
+ {
+ if ((newMetal%2) != 0) hor = false;
+ }
+ if (hor)
+ {
+ SeaOfGatesTrack sogt = getClosestYGrid(newMetal, conY);
+ if (sogt != null) newMetalColor = sogt.getMaskNum();
+ } else
+ {
+ SeaOfGatesTrack sogt = getClosestXGrid(newMetal, conX);
+ if (sogt != null) newMetalColor = sogt.getMaskNum();
+ }
+
+ // see if any contacts can be placed
+ Map<PrimitiveNode,ContactPlacementError> checkedThese = whatWasChecked.get(Integer.valueOf(newMetal));
+ if (checkedThese == null) whatWasChecked.put(Integer.valueOf(newMetal), checkedThese = new HashMap<PrimitiveNode,ContactPlacementError>());
+ boolean hasContacts = false;
+ for (MetalVia mv : mvs)
+ {
+ if (mv.horMetal == offendingMetal && mv.verMetal == newMetal)
+ {
+ if (mv.horMetalColor != offendingMetalColor || mv.verMetalColor != newMetalColor) continue;
+ } else if (mv.verMetal == offendingMetal && mv.horMetal == newMetal)
+ {
+ if (mv.verMetalColor != offendingMetalColor || mv.horMetalColor != newMetalColor) continue;
+ }
+ hasContacts = true;
+ }
+ if (!hasContacts)
+ {
+ realOffendingMetal = offendingMetal;
+ contactInvalidColors.put(Integer.valueOf(newMetal), new java.awt.Point(offendingMetalColor, newMetalColor));
+ }
+
+ // adjust location of contact to be on grid
+ if (forceGridArcs[newMetal])
+ {
+ // determine starting index in the array of possible grid locations
+ int index = 0;
+ if (hor)
+ {
+ if (gridLocationsY[newMetal] != null)
+ {
+ conY = getClosestYGrid(newMetal, conY).getCoordinate();
+ for(index=0; index<gridLocationsY[newMetal].length; index++)
+ if (gridLocationsY[newMetal][index].getCoordinate() == conY) break;
+ }
+ } else
+ {
+ if (gridLocationsX[newMetal] != null)
+ {
+ conX = getClosestXGrid(newMetal, conX).getCoordinate();
+ for(index=0; index<gridLocationsX[newMetal].length; index++)
+ if (gridLocationsX[newMetal][index].getCoordinate() == conX) break;
+ }
+ }
+
+ // try all values on the grid, heading toward goal
+ int startIndex = index;
+
+ for(;;)
+ {
+ if (hor)
+ {
+ if (index < 0 || index >= gridLocationsY[newMetal].length) break;
+ SeaOfGatesTrack sogt = gridLocationsY[newMetal][index];
+ conY = sogt.getCoordinate();
+ newMetalColor = sogt.getMaskNum();
+ if (conY < routeBounds.getMinY() || conY > routeBounds.getMaxY()) break;
+ } else
+ {
+ if (index < 0 || index >= gridLocationsX[newMetal].length) break;
+ SeaOfGatesTrack sogt = gridLocationsX[newMetal][index];
+ conX = sogt.getCoordinate();
+ newMetalColor = sogt.getMaskNum();
+ if (conX < routeBounds.getMinX() || conX > routeBounds.getMaxX()) break;
+ }
+
+ // gather possible contacts at this location
+ boolean foundLocation = false;
+ for (MetalVia mv : mvs)
+ {
+ if (mv.horMetal == offendingMetal && mv.verMetal == newMetal)
+ {
+ if (mv.horMetalColor != offendingMetalColor || mv.verMetalColor != newMetalColor) continue;
+ } else if (mv.verMetal == offendingMetal && mv.horMetal == newMetal)
+ {
+ if (mv.verMetalColor != offendingMetalColor || mv.horMetalColor != newMetalColor) continue;
+ }
+ PrimitiveNode np = mv.via;
+ MutableDouble conWid, conHei;
+ Orientation orient = getMVSize(mv, conX, conY, conX, conY, conWid = new MutableDouble(0), conHei = new MutableDouble(0));
+ ContactPlacementError cpe = canPlaceContact(np, newMetal, offendingMetal, offendingMetalColor, conX, conY,
+ conWid.doubleValue(), conHei.doubleValue(), orient, end);
+ if (cpe != null)
+ {
+ if (checkedThese.get(np) == null) checkedThese.put(np, cpe);
+ } else
+ {
+ // offending layer is already there, so via can be dropped from it
+ PossibleEndpoint vtvl = new PossibleEndpoint(EPoint.fromLambda(conX, conY), mv,
+ conWid.doubleValue(), conHei.doubleValue(), orient);
+ possibleVias.add(vtvl);
+ foundLocation = true;
+ }
+ }
+
+ // if nothing possible and already checked vicinity of endpoint, stop
+ if (!foundLocation && Math.abs(index - startIndex) > 5) break;
+
+ // advance to next possible location
+ index++;
+ }
+
+ // now head in the other direction
+ index = startIndex-1;
+ for(;;)
+ {
+ if (hor)
+ {
+ if (index < 0 || index >= gridLocationsY[newMetal].length) break;
+ SeaOfGatesTrack sogt = gridLocationsY[newMetal][index];
+ conY = sogt.getCoordinate();
+ newMetalColor = sogt.getMaskNum();
+ if (conY < routeBounds.getMinY() || conY > routeBounds.getMaxY()) break;
+ } else
+ {
+ if (index < 0 || index >= gridLocationsX[newMetal].length) break;
+ SeaOfGatesTrack sogt = gridLocationsX[newMetal][index];
+ conX = sogt.getCoordinate();
+ newMetalColor = sogt.getMaskNum();
+ if (conX < routeBounds.getMinX() || conX > routeBounds.getMaxX()) break;
+ }
+
+ // gather possible contacts at this location
+ boolean foundLocation = false;
+ for (MetalVia mv : mvs)
+ {
+ if (mv.horMetal == offendingMetal && mv.verMetal == newMetal)
+ {
+ if (mv.horMetalColor != offendingMetalColor || mv.verMetalColor != newMetalColor) continue;
+ } else if (mv.verMetal == offendingMetal && mv.horMetal == newMetal)
+ {
+ if (mv.verMetalColor != offendingMetalColor || mv.horMetalColor != newMetalColor) continue;
+ }
+ PrimitiveNode np = mv.via;
+ MutableDouble conWid, conHei;
+ Orientation orient = getMVSize(mv, conX, conY, conX, conY, conWid = new MutableDouble(0), conHei = new MutableDouble(0));
+ ContactPlacementError cpe = canPlaceContact(np, newMetal, offendingMetal, offendingMetalColor, conX, conY,
+ conWid.doubleValue(), conHei.doubleValue(), orient, end);
+ if (cpe != null)
+ {
+ if (checkedThese.get(np) == null) checkedThese.put(np, cpe);
+ } else
+ {
+ // offending layer is already there, so via can be dropped from it
+ PossibleEndpoint vtvl = new PossibleEndpoint(EPoint.fromLambda(conX, conY), mv,
+ conWid.doubleValue(), conHei.doubleValue(), orient);
+ possibleVias.add(vtvl);
+ foundLocation = true;
+ }
+ }
+
+ // if nothing possible and already checked vicinity of endpoint, stop
+ if (!foundLocation && Math.abs(index - startIndex) > 5) break;
+
+ // advance to next possible location
+ index--;
+ }
+ } else
+ {
+ // no forced gridding: just find a via at this coordinate
+ for (MetalVia mv : mvs)
+ {
+ if (mv.horMetal == offendingMetal && mv.verMetal == newMetal)
+ {
+ if (mv.horMetalColor != offendingMetalColor || mv.verMetalColor != newMetalColor) continue;
+ } else if (mv.verMetal == offendingMetal && mv.horMetal == newMetal)
+ {
+ if (mv.verMetalColor != offendingMetalColor || mv.horMetalColor != newMetalColor) continue;
+ }
+ MutableDouble conWid = new MutableDouble(0), conHei = new MutableDouble(0);
+ Orientation orient = getMVSize(mv, conX, conY, conX, conY, conWid, conHei);
+ ContactPlacementError cpe = canPlaceContact(mv.via, newMetal, offendingMetal, offendingMetalColor, conX, conY,
+ conWid.doubleValue(), conHei.doubleValue(), orient, end);
+ if (cpe != null) checkedThese.put(mv.via, cpe); else
+ {
+ // can place via here
+ PossibleEndpoint vtvl = new PossibleEndpoint(EPoint.fromLambda(conX, conY), mv,
+ conWid.doubleValue(), conHei.doubleValue(), orient);
+ possibleVias.add(vtvl);
+ }
+ }
+ }
+ if (possibleVias.hasEndpoints())
+ {
+ EPoint otherEnd;
+ if (endA)
+ {
+ otherEnd = bEndpoints.getCenter();
+ } else
+ {
+ otherEnd = aEndpoints.getCenter();
+ }
+ double closestDist = Double.MAX_VALUE;
+ PossibleEndpoint closestEP = null;
+ for(PossibleEndpoint vtvl : possibleVias.getEndpoints())
+ {
+ double dist = vtvl.coord.distance(otherEnd);
+ if (closestEP == null || dist < closestDist)
+ {
+ closestEP = vtvl;
+ closestDist = dist;
+ }
+ }
+ if (endA)
+ {
+ double dX = closestEP.coord.getX()-aEndpoints.getCenterX(), dY = closestEP.coord.getY()-aEndpoints.getCenterY();
+ aEndpoints.setCenterX(closestEP.coord.getX());
+ aEndpoints.setCenterY(closestEP.coord.getY());
+ Point[] pts = aPoly.getPoints();
+ for(int i=0; i<pts.length; i++)
+ pts[i].setLocation(pts[i].getX()+dX, pts[i].getY()+dY);
+ aEndpoints.setRect(aEndpoints.getCenterX(), aEndpoints.getCenterY(), 0, 0);
+ double aLX = getLowerXGrid(aZ, aEndpoints.getRect().getMinX()).getCoordinate();
+ double aHX = getUpperXGrid(aZ, aEndpoints.getRect().getMaxX()).getCoordinate();
+ double aLY = getLowerYGrid(aZ, aEndpoints.getRect().getMinY()).getCoordinate();
+ double aHY = getUpperYGrid(aZ, aEndpoints.getRect().getMaxY()).getCoordinate();
+ aEndpoints.setGriddedRect(aLX, aHX, aLY, aHY);
+ aZ = newMetal;
+ if (forceGridArcs[newMetal])
+ {
+ if (hor)
+ {
+ SeaOfGatesTrack sogt = getClosestYGrid(newMetal, aEndpoints.getCenterY());
+ if (sogt != null) newMetalColor = sogt.getMaskNum();
+ } else
+ {
+ SeaOfGatesTrack sogt = getClosestXGrid(newMetal, aEndpoints.getCenterX());
+ if (sogt != null) newMetalColor = sogt.getMaskNum();
+ }
+ }
+ aC = newMetalColor;
+ jumpBound = new Rectangle2D.Double(Math.min(aEndpoints.getCenterX(), bEndpoints.getCenterX()),
+ Math.min(aEndpoints.getCenterY(), bEndpoints.getCenterY()),
+ Math.abs(aEndpoints.getCenterX()-bEndpoints.getCenterX()),
+ Math.abs(aEndpoints.getCenterY()-bEndpoints.getCenterY()));
+ replaceA = closestEP;
+ replaceAZ = offendingMetal;
+ if (offendingMetalColor > 0)
+ replaceAC = offendingMetalColor-1;
+
+ // reset taper width on this end since contact will be placed
+ aTaperWid = getUntaperedArcWidth(newMetal);
+ aTaperLen = -1;
+ } else
+ {
+ double dX = closestEP.coord.getX()-bEndpoints.getCenterX(), dY = closestEP.coord.getY()-bEndpoints.getCenterY();
+ bEndpoints.setCenterX(closestEP.coord.getX());
+ bEndpoints.setCenterY(closestEP.coord.getY());
+ Point[] pts = bPoly.getPoints();
+ for(int i=0; i<pts.length; i++)
+ pts[i].setLocation(pts[i].getX()+dX, pts[i].getY()+dY);
+ bEndpoints.setRect(bEndpoints.getCenterX(), bEndpoints.getCenterY(), 0, 0);
+ double bLX = getLowerXGrid(bZ, bEndpoints.getRect().getMinX()).getCoordinate();
+ double bHX = getUpperXGrid(bZ, bEndpoints.getRect().getMaxX()).getCoordinate();
+ double bLY = getLowerYGrid(bZ, bEndpoints.getRect().getMinY()).getCoordinate();
+ double bHY = getUpperYGrid(bZ, bEndpoints.getRect().getMaxY()).getCoordinate();
+ bEndpoints.setGriddedRect(bLX, bHX, bLY, bHY);
+ bZ = newMetal;
+ if (forceGridArcs[newMetal])
+ {
+ if (hor)
+ {
+ SeaOfGatesTrack sogt = getClosestYGrid(newMetal, bEndpoints.getCenterY());
+ if (sogt != null) newMetalColor = sogt.getMaskNum();
+ } else
+ {
+ SeaOfGatesTrack sogt = getClosestXGrid(newMetal, bEndpoints.getCenterX());
+ if (sogt != null) newMetalColor = sogt.getMaskNum();
+ }
+ }
+ bC = newMetalColor;
+ jumpBound = new Rectangle2D.Double(Math.min(aEndpoints.getCenterX(), bEndpoints.getCenterX()),
+ Math.min(aEndpoints.getCenterY(), bEndpoints.getCenterY()),
+ Math.abs(aEndpoints.getCenterX()-bEndpoints.getCenterX()),
+ Math.abs(aEndpoints.getCenterY()-bEndpoints.getCenterY()));
+ replaceB = closestEP;
+ replaceBZ = offendingMetal;
+ if (offendingMetalColor > 0)
+ replaceBC = offendingMetalColor-1;
+
+ // reset taper width on this end since contact will be placed
+ bTaperWid = getUntaperedArcWidth(newMetal);
+ bTaperLen = -1;
+ }
+
+ // add contact to blockages
+ NodeInst dummyNi = NodeInst.makeDummyInstance(closestEP.viaToPlace.via, ep, closestEP.coord,
+ closestEP.viaSizeX, closestEP.viaSizeY, closestEP.viaOrient);
+ Poly[] conPolys = tech.getShapeOfNode(dummyNi);
+ FixpTransform trans = null;
+ if (closestEP.viaOrient != Orientation.IDENT) trans = dummyNi.rotateOut();
+ for (int p = 0; p < conPolys.length; p++)
+ {
+ Poly conPoly = conPolys[p];
+ Layer conLayer = conPoly.getLayer();
+ if (trans != null) conPoly.transform(trans);
+ Rectangle2D conRect = conPoly.getBounds2D();
+ Layer.Function fun = conLayer.getFunction();
+ if (fun.isMetal())
+ {
+ addRectangle(conRect, conLayer, netID, false, false);
+ } else if (fun.isContact())
+ {
+ addVia(ERectangle.fromLambda(conRect), conLayer, netID, false);
+ }
+ }
+ possibleVias.finishedAddingEndpoints();
+ return false;
+ }
+ }
+ }
+
+ // cannot place contact or use existing layers, give an error
+ String msg = "Route '" + routeName + "' at (" + TextUtils.formatDistance(pt.getX()) + "," + TextUtils.formatDistance(pt.getY()) +
+ ") from port " + pi.getPortProto().getName() + " on node " + describe(pi.getNodeInst()) + " cannot connect";
+ if (sogp.isContactAllowedDownToAvoidedLayer() || sogp.isContactAllowedUpToAvoidedLayer())
+ {
+ msg += " (allowed to go";
+ if (sogp.isContactAllowedDownToAvoidedLayer())
+ {
+ if (sogp.isContactAllowedUpToAvoidedLayer()) msg += " up/down"; else msg += " down";
+ } else if (sogp.isContactAllowedUpToAvoidedLayer()) msg += " up";
+ msg += " one layer)";
+ }
+
+ if (whatWasChecked.size() > 0)
+ {
+ boolean first = true;
+ for(Integer m : whatWasChecked.keySet())
+ {
+ if (first) msg += " because"; else msg += " and";
+ first = false;
+ java.awt.Point invalidColors = contactInvalidColors.get(m);
+ if (invalidColors != null)
+ {
+ msg += " no contact exists from metal-" + (realOffendingMetal+1) + " mask color " + invalidColors.x +
+ " to metal-" + (m.intValue() + 1) + " mask color " + invalidColors.y;
+ } else
+ {
+ msg += " contact(s) cannot be placed:";
+ Map<PrimitiveNode,ContactPlacementError> contacts = whatWasChecked.get(m);
+ boolean firstPrim = true;
+ for(PrimitiveNode pNp : contacts.keySet())
+ {
+ ContactPlacementError cpe = contacts.get(pNp);
+ if (firstPrim) msg += " "; else msg += " / ";
+ firstPrim = false;
+ msg += cpe.getError(pNp);
}
- return true;
}
}
- } finally {
- bTree.unlock();
- }
- return false;
- }
-
- /**
- * Method to determine the size and orientation of a contact.
- * @param mv the MetalVia describing the contact.
- * @param wid where the width will be stored.
- * @param hei where the height will be stored.
- * @return the orientation to use.
- */
- private Orientation getMVSize(MetalVia mv, double x, double y, double lastX, double lastY, MutableDouble wid, MutableDouble hei)
- {
- PrimitiveNode np = mv.via;
- Orientation orient = Orientation.fromJava(mv.orientation * 10, false, false);
- SizeOffset so = np.getProtoSizeOffset();
- double minWid = minWidth;
- double minHei = minWidth;
- double xOffset = so.getLowXOffset() + so.getHighXOffset();
- double yOffset = so.getLowYOffset() + so.getHighYOffset();
- double conWid = Math.max(np.getDefWidth(ep) - xOffset, minWid) + xOffset;
- double conHei = Math.max(np.getDefHeight(ep) - yOffset, minHei) + yOffset;
- if (mv.horMetal >= 0)
- {
- double arcWid = getArcWidth(mv.horMetal, x, y, lastX, lastY) + mv.horMetalInset;
- if (arcWid > conHei) conHei = arcWid;
- }
- if (mv.verMetal >= 0)
+ } else
{
- double arcWid = getArcWidth(mv.verMetal, x, y, lastX, lastY) + mv.verMetalInset;
- if (arcWid > conWid) conWid = arcWid;
+ msg += " because all connecting layers have been prevented by Routing Preferences";
}
- wid.setValue(conWid);
- hei.setValue(conHei);
- return orient;
+ error(msg);
+ List<PolyBase> polyList = new ArrayList<PolyBase>();
+ polyList.add(new PolyBase(pt.getX(), pt.getY(), 0, 0));
+ errorLogger.logMessageWithLines(msg, polyList, null, cell, 0, true);
+ return true;
}
/**
* Method to tell whether an endpoint of the route is invalid.
* @param endA true if the A end is being examined, false for the B end.
* @param pi the port of the end being examined.
- * @return true if the endpoint is invalid and cannot be routed.
- * Gives error message if true.
+ * @return false if port is valid and can be routed.
+ * True if the endpoint is invalid and cannot be routed (displays error message if so).
*/
- private boolean invalidPort(boolean endA, PortInst pi)
+ private boolean invalidPortOLD(boolean endA, boolean tap, PortInst pi)
{
+ EPoint pt = pi.getCenter();
+ double conX = pt.getX(), conY = pt.getY();
+
// first see if any metal layer on this end is available
ArcProto[] conns = getPossibleConnections(pi.getPortProto());
for (int j = 0; j < conns.length; j++)
@@ -2014,14 +3210,12 @@ public abstract class SeaOfGatesEngine
}
// determine location of contact
- double x = endA ? aX : bX, y = endA ? aY : bY;
- Map<Integer,List<PrimitiveNode>> whatWasChecked = new HashMap<Integer,List<PrimitiveNode>>();
+ Map<Integer,Map<PrimitiveNode,ContactPlacementError>> whatWasChecked = new HashMap<Integer,Map<PrimitiveNode,ContactPlacementError>>();
Map<Integer,java.awt.Point> contactInvalidColors = new HashMap<Integer,java.awt.Point>();
int realOffendingMetal = 0;
+ Boolean end = tap ? null : Boolean.valueOf(endA);
// no metal layers available: see if a contact can be placed to shift to a valid layer
- EPoint pt = pi.getCenter();
- double conX = pt.getX(), conY = pt.getY();
double endCoord = 0;
if (sogp.isContactAllowedDownToAvoidedLayer() || sogp.isContactAllowedUpToAvoidedLayer())
{
@@ -2052,9 +3246,29 @@ public abstract class SeaOfGatesEngine
}
if (mvs == null) continue;
+ // determine horizontal/vertical orientation
+ boolean hor = true;
+ if (sogp.isHorizontalEven())
+ {
+ if ((newMetal%2) == 0) hor = false;
+ } else
+ {
+ if ((newMetal%2) != 0) hor = false;
+ }
+ SeaOfGatesTrack sogt;
+ if (hor)
+ {
+ sogt = getClosestYGrid(newMetal, conY);
+ } else
+ {
+ sogt = getClosestXGrid(newMetal, conX);
+ }
+ if (sogt != null)
+ newMetalColor = sogt.getMaskNum();
+
// see if any contacts can be placed
- List<PrimitiveNode> checkedThese = whatWasChecked.get(Integer.valueOf(newMetal));
- if (checkedThese == null) whatWasChecked.put(Integer.valueOf(newMetal), checkedThese = new ArrayList<PrimitiveNode>());
+ Map<PrimitiveNode,ContactPlacementError> checkedThese = whatWasChecked.get(Integer.valueOf(newMetal));
+ if (checkedThese == null) whatWasChecked.put(Integer.valueOf(newMetal), checkedThese = new HashMap<PrimitiveNode,ContactPlacementError>());
boolean hasContacts = false;
for (MetalVia mv : mvs)
{
@@ -2066,7 +3280,6 @@ public abstract class SeaOfGatesEngine
if (mv.verMetalColor != offendingMetalColor || mv.horMetalColor != newMetalColor) continue;
}
hasContacts = true;
- checkedThese.add(mv.via);
}
if (!hasContacts)
{
@@ -2077,14 +3290,6 @@ public abstract class SeaOfGatesEngine
double viaToPlaceX = 0, viaToPlaceY = 0;
double viaSizeX = 0, viaSizeY = 0;
Orientation viaOrient = Orientation.IDENT;
- boolean hor = true;
- if (sogp.isHorizontalEven())
- {
- if ((newMetal%2) == 0) hor = false;
- } else
- {
- if ((newMetal%2) != 0) hor = false;
- }
// adjust location of contact to be on grid
if (forceGridArcs[newMetal])
@@ -2094,16 +3299,18 @@ public abstract class SeaOfGatesEngine
{
if (gridLocationsY[newMetal] != null)
{
- double otherY = endA ? bY : aY;
+ double otherY = endA ? bEndpoints.getCenterY() : aEndpoints.getCenterY();
if (otherY < conY)
{
- conY = getLowerYGrid(newMetal, conY).getCoordinate();
+ sogt = getLowerYGrid(newMetal, conY);
dir = -1;
} else
{
- conY = getUpperYGrid(newMetal, conY).getCoordinate();
+ sogt = getUpperYGrid(newMetal, conY);
dir = 1;
}
+ conY = sogt.getCoordinate();
+ newMetalColor = sogt.getMaskNum();
for(index=0; index<gridLocationsY[newMetal].length; index++)
if (gridLocationsY[newMetal][index].getCoordinate() == conY) break;
}
@@ -2111,16 +3318,18 @@ public abstract class SeaOfGatesEngine
{
if (gridLocationsX[newMetal] != null)
{
- double otherX = endA ? bX : aX;
+ double otherX = endA ? bEndpoints.getCenterX() : aEndpoints.getCenterX();
if (otherX < conX)
{
- conX = getLowerXGrid(newMetal, conX).getCoordinate();
+ sogt = getLowerXGrid(newMetal, conX);
dir = -1;
} else
{
- conX = getUpperXGrid(newMetal, conX).getCoordinate();
+ sogt = getUpperXGrid(newMetal, conX);
dir = 1;
}
+ conX = sogt.getCoordinate();
+ newMetalColor = sogt.getMaskNum();
for(index=0; index<gridLocationsX[newMetal].length; index++)
if (gridLocationsX[newMetal][index].getCoordinate() == conX) break;
}
@@ -2132,12 +3341,12 @@ public abstract class SeaOfGatesEngine
// code to travel as far as possible rather than stopping at first valid location
if (hor)
{
- endCoord = endA ? bY : aY;
+ endCoord = endA ? bEndpoints.getCenterY() : aEndpoints.getCenterY();
} else
{
- endCoord = endA ? bX : aX;
+ endCoord = endA ? bEndpoints.getCenterX() : aEndpoints.getCenterX();
}
-
+
for(;;)
{
// more code to travel as far as possible rather than stopping at first valid location
@@ -2163,7 +3372,6 @@ public abstract class SeaOfGatesEngine
}
if (tooFar && viaToPlace != null) break;
- newMetalColor = (hor ? gridLocationsY[newMetal][index].getMaskNum() : gridLocationsX[newMetal][index].getMaskNum());
for (MetalVia mv : mvs)
{
if (mv.horMetal == offendingMetal && mv.verMetal == newMetal)
@@ -2175,8 +3383,13 @@ public abstract class SeaOfGatesEngine
}
PrimitiveNode np = mv.via;
MutableDouble conWid, conHei;
- Orientation orient = getMVSize(mv, x, y, x, y, conWid = new MutableDouble(0), conHei = new MutableDouble(0));
- if (canPlaceContact(np, newMetal, offendingMetal, offendingMetalColor, conX, conY, conWid.doubleValue(), conHei.doubleValue(), orient, endA))
+ Orientation orient = getMVSize(mv, conX, conY, conX, conY, conWid = new MutableDouble(0), conHei = new MutableDouble(0));
+ ContactPlacementError cpe = canPlaceContact(np, newMetal, offendingMetal, offendingMetalColor, conX, conY,
+ conWid.doubleValue(), conHei.doubleValue(), orient, end);
+ if (cpe != null)
+ {
+ if (checkedThese.get(np) == null) checkedThese.put(np, cpe);
+ } else
{
// offending layer is already there, so via can be dropped from it
viaToPlace = mv;
@@ -2191,11 +3404,15 @@ public abstract class SeaOfGatesEngine
if (hor)
{
if (index < 0 || index >= gridLocationsY[newMetal].length) break;
- conY = gridLocationsY[newMetal][index].getCoordinate();
+ sogt = gridLocationsY[newMetal][index];
+ conY = sogt.getCoordinate();
+ newMetalColor = sogt.getMaskNum();
} else
{
if (index < 0 || index >= gridLocationsX[newMetal].length) break;
- conX = gridLocationsX[newMetal][index].getCoordinate();
+ sogt = gridLocationsX[newMetal][index];
+ conX = sogt.getCoordinate();
+ newMetalColor = sogt.getMaskNum();
}
}
if (viaToPlace == null)
@@ -2205,7 +3422,19 @@ public abstract class SeaOfGatesEngine
index = startIndex + dir;
for(;;)
{
- newMetalColor = (hor ? gridLocationsY[newMetal][index].getMaskNum() : gridLocationsX[newMetal][index].getMaskNum());
+ if (hor)
+ {
+ if (index < 0 || index >= gridLocationsY[newMetal].length) break;
+ sogt = gridLocationsY[newMetal][index];
+ conY = sogt.getCoordinate();
+ newMetalColor = sogt.getMaskNum();
+ } else
+ {
+ if (index < 0 || index >= gridLocationsX[newMetal].length) break;
+ sogt = gridLocationsX[newMetal][index];
+ conX = sogt.getCoordinate();
+ newMetalColor = sogt.getMaskNum();
+ }
for (MetalVia mv : mvs)
{
if (mv.horMetal == offendingMetal && mv.verMetal == newMetal)
@@ -2217,8 +3446,13 @@ public abstract class SeaOfGatesEngine
}
PrimitiveNode np = mv.via;
MutableDouble conWid, conHei;
- Orientation orient = getMVSize(mv, x, y, x, y, conWid = new MutableDouble(0), conHei = new MutableDouble(0));
- if (canPlaceContact(np, newMetal, offendingMetal, offendingMetalColor, conX, conY, conWid.doubleValue(), conHei.doubleValue(), orient, endA))
+ Orientation orient = getMVSize(mv, conX, conY, conX, conY, conWid = new MutableDouble(0), conHei = new MutableDouble(0));
+ ContactPlacementError cpe = canPlaceContact(np, newMetal, offendingMetal, offendingMetalColor, conX, conY,
+ conWid.doubleValue(), conHei.doubleValue(), orient, end);
+ if (cpe != null)
+ {
+ if (checkedThese.get(np) == null) checkedThese.put(np, cpe);
+ } else
{
// offending layer is already there, so via can be dropped from it
viaToPlace = mv;
@@ -2231,29 +3465,10 @@ public abstract class SeaOfGatesEngine
if (viaToPlace != null) break;
index += dir;
- if (hor)
- {
- if (index < 0 || index >= gridLocationsY[newMetal].length) break;
- conY = gridLocationsY[newMetal][index].getCoordinate();
- } else
- {
- if (index < 0 || index >= gridLocationsX[newMetal].length) break;
- conX = gridLocationsX[newMetal][index].getCoordinate();
- }
}
}
} else
{
- SeaOfGatesTrack sogt;
- if (hor)
- {
- sogt = getClosestYGrid(newMetal, conY);
- } else
- {
- sogt = getClosestXGrid(newMetal, conX);
- }
- newMetalColor = sogt.getMaskNum();
-
// no forced gridding: just find a via at this coordinate
for (MetalVia mv : mvs)
{
@@ -2266,8 +3481,13 @@ public abstract class SeaOfGatesEngine
}
PrimitiveNode np = mv.via;
MutableDouble conWid, conHei;
- Orientation orient = getMVSize(mv, x, y, x, y, conWid = new MutableDouble(0), conHei = new MutableDouble(0));
- if (canPlaceContact(np, newMetal, offendingMetal, offendingMetalColor, conX, conY, conWid.doubleValue(), conHei.doubleValue(), orient, endA))
+ Orientation orient = getMVSize(mv, conX, conY, conX, conY, conWid = new MutableDouble(0), conHei = new MutableDouble(0));
+ ContactPlacementError cpe = canPlaceContact(np, newMetal, offendingMetal, offendingMetalColor, conX, conY,
+ conWid.doubleValue(), conHei.doubleValue(), orient, end);
+ if (cpe != null)
+ {
+ checkedThese.put(np, cpe);
+ } else
{
// offending layer is already there, so via can be dropped from it
viaToPlace = mv;
@@ -2290,23 +3510,36 @@ public abstract class SeaOfGatesEngine
warn(msg);
if (endA)
{
- double dX = viaToPlaceX-aX, dY = viaToPlaceY-aY;
- aX = viaToPlaceX;
- aY = viaToPlaceY;
+ double dX = viaToPlaceX-aEndpoints.getCenterX(), dY = viaToPlaceY-aEndpoints.getCenterY();
+ aEndpoints.setCenterX(viaToPlaceX);
+ aEndpoints.setCenterY(viaToPlaceY);
Point[] pts = aPoly.getPoints();
for(int i=0; i<pts.length; i++)
pts[i].setLocation(pts[i].getX()+dX, pts[i].getY()+dY);
- aRect.setRect(aX, aY, 0, 0);
-// aRect.setRect(aRect.getMinX()+dX, aRect.getMinY()+dY, aRect.getWidth(), aRect.getHeight());
- double aLX = getLowerXGrid(aZ, aRect.getMinX()).getCoordinate();
- double aHX = getUpperXGrid(aZ, aRect.getMaxX()).getCoordinate();
- double aLY = getLowerYGrid(aZ, aRect.getMinY()).getCoordinate();
- double aHY = getUpperYGrid(aZ, aRect.getMaxY()).getCoordinate();
- aRectGridded = FixpRectangle.from(new Rectangle2D.Double(aLX, aLY, aHX-aLX, aHY-aLY));
+ aEndpoints.setRect(aEndpoints.getCenterX(), aEndpoints.getCenterY(), 0, 0);
+ double aLX = getLowerXGrid(aZ, aEndpoints.getRect().getMinX()).getCoordinate();
+ double aHX = getUpperXGrid(aZ, aEndpoints.getRect().getMaxX()).getCoordinate();
+ double aLY = getLowerYGrid(aZ, aEndpoints.getRect().getMinY()).getCoordinate();
+ double aHY = getUpperYGrid(aZ, aEndpoints.getRect().getMaxY()).getCoordinate();
+ aEndpoints.setGriddedRect(aLX, aHX, aLY, aHY);
aZ = newMetal;
+ if (forceGridArcs[newMetal])
+ {
+ if (hor)
+ {
+ sogt = getClosestYGrid(newMetal, aEndpoints.getCenterY());
+ } else
+ {
+ sogt = getClosestXGrid(newMetal, aEndpoints.getCenterX());
+ }
+ if (sogt != null) newMetalColor = sogt.getMaskNum();
+ }
aC = newMetalColor;
- jumpBound = new Rectangle2D.Double(Math.min(aX, bX), Math.min(aY, bY), Math.abs(aX-bX), Math.abs(aY-bY));
- replaceA = viaToPlace;
+ jumpBound = new Rectangle2D.Double(Math.min(aEndpoints.getCenterX(), bEndpoints.getCenterX()),
+ Math.min(aEndpoints.getCenterY(), bEndpoints.getCenterY()),
+ Math.abs(aEndpoints.getCenterX()-bEndpoints.getCenterX()),
+ Math.abs(aEndpoints.getCenterY()-bEndpoints.getCenterY()));
+ replaceA = new PossibleEndpoint(aEndpoints.getCenter(), viaToPlace, viaSizeX, viaSizeY, viaOrient);
replaceAZ = offendingMetal;
if (offendingMetalColor > 0)
replaceAC = offendingMetalColor-1;
@@ -2316,23 +3549,36 @@ public abstract class SeaOfGatesEngine
aTaperLen = -1;
} else
{
- double dX = viaToPlaceX-bX, dY = viaToPlaceY-bY;
- bX = viaToPlaceX;
- bY = viaToPlaceY;
+ double dX = viaToPlaceX-bEndpoints.getCenterX(), dY = viaToPlaceY-bEndpoints.getCenterY();
+ bEndpoints.setCenterX(viaToPlaceX);
+ bEndpoints.setCenterY(viaToPlaceY);
Point[] pts = bPoly.getPoints();
for(int i=0; i<pts.length; i++)
pts[i].setLocation(pts[i].getX()+dX, pts[i].getY()+dY);
- bRect.setRect(bX, bY, 0, 0);
-// bRect.setRect(bRect.getMinX()+dX, bRect.getMinY()+dY, bRect.getWidth(), bRect.getHeight());
- double bLX = getLowerXGrid(bZ, bRect.getMinX()).getCoordinate();
- double bHX = getUpperXGrid(bZ, bRect.getMaxX()).getCoordinate();
- double bLY = getLowerYGrid(bZ, bRect.getMinY()).getCoordinate();
- double bHY = getUpperYGrid(bZ, bRect.getMaxY()).getCoordinate();
- bRectGridded = FixpRectangle.from(new Rectangle2D.Double(bLX, bLY, bHX-bLX, bHY-bLY));
+ bEndpoints.setRect(bEndpoints.getCenterX(), bEndpoints.getCenterY(), 0, 0);
+ double bLX = getLowerXGrid(bZ, bEndpoints.getRect().getMinX()).getCoordinate();
+ double bHX = getUpperXGrid(bZ, bEndpoints.getRect().getMaxX()).getCoordinate();
+ double bLY = getLowerYGrid(bZ, bEndpoints.getRect().getMinY()).getCoordinate();
+ double bHY = getUpperYGrid(bZ, bEndpoints.getRect().getMaxY()).getCoordinate();
+ bEndpoints.setGriddedRect(bLX, bHX, bLY, bHY);
bZ = newMetal;
+ if (forceGridArcs[newMetal])
+ {
+ if (hor)
+ {
+ sogt = getClosestYGrid(newMetal, bEndpoints.getCenterY());
+ } else
+ {
+ sogt = getClosestXGrid(newMetal, bEndpoints.getCenterX());
+ }
+ if (sogt != null) newMetalColor = sogt.getMaskNum();
+ }
bC = newMetalColor;
- jumpBound = new Rectangle2D.Double(Math.min(aX, bX), Math.min(aY, bY), Math.abs(aX-bX), Math.abs(aY-bY));
- replaceB = viaToPlace;
+ jumpBound = new Rectangle2D.Double(Math.min(aEndpoints.getCenterX(), bEndpoints.getCenterX()),
+ Math.min(aEndpoints.getCenterY(), bEndpoints.getCenterY()),
+ Math.abs(aEndpoints.getCenterX()-bEndpoints.getCenterX()),
+ Math.abs(aEndpoints.getCenterY()-bEndpoints.getCenterY()));
+ replaceB = new PossibleEndpoint(bEndpoints.getCenter(), viaToPlace, viaSizeX, viaSizeY, viaOrient);
replaceBZ = offendingMetal;
if (offendingMetalColor > 0)
replaceBC = offendingMetalColor-1;
@@ -2396,8 +3642,15 @@ public abstract class SeaOfGatesEngine
} else
{
msg += " contact(s) cannot be placed:";
- List<PrimitiveNode> contacts = whatWasChecked.get(m);
- for(PrimitiveNode pNp : contacts) msg += " " + pNp.describe(false);
+ Map<PrimitiveNode,ContactPlacementError> contacts = whatWasChecked.get(m);
+ boolean firstPrim = true;
+ for(PrimitiveNode pNp : contacts.keySet())
+ {
+ ContactPlacementError cpe = contacts.get(pNp);
+ if (firstPrim) msg += " "; else msg += " / ";
+ firstPrim = false;
+ msg += cpe.getError(pNp);
+ }
}
}
} else
@@ -2464,12 +3717,10 @@ public abstract class SeaOfGatesEngine
public void makeWavefronts()
{
// make two wavefronts going in both directions
- dirAtoB = new Wavefront(this, aPi, aRect, aX, aY, aZ, aC, aTaperLen, BLOCKAGEENDA,
- bPi, bRect, bRectGridded, bX, bY, bZ, bC, bTaperLen, 1, "a->b",
- debuggingRouteFromA != null && debuggingRouteFromA.booleanValue());
- dirBtoA = new Wavefront(this, bPi, bRect, bX, bY, bZ, bC, bTaperLen, BLOCKAGEENDB,
- aPi, aRect, aRectGridded, aX, aY, aZ, aC, aTaperLen, -1, "b->a",
- debuggingRouteFromA != null && !debuggingRouteFromA.booleanValue());
+ dirAtoB = new Wavefront(this, aPi, aEndpoints.getRect(), aEndpoints.getCenterX(), aEndpoints.getCenterY(), aZ, aC, aTaperLen, BLOCKAGEENDA,
+ bPi, bEndpoints, bZ, bC, bTaperLen, 1, true, debuggingRouteFromA != null && debuggingRouteFromA.booleanValue());
+ dirBtoA = new Wavefront(this, bPi, bEndpoints.getRect(), bEndpoints.getCenterX(), bEndpoints.getCenterY(), bZ, bC, bTaperLen, BLOCKAGEENDB,
+ aPi, aEndpoints, aZ, aC, aTaperLen, -1, false, debuggingRouteFromA != null && !debuggingRouteFromA.booleanValue());
// if (ANYPOINTONDESTINATION)
// {
@@ -2546,34 +3797,46 @@ public abstract class SeaOfGatesEngine
}
// see if either point could be a taper from the "a" end
- if (aTaperLen >= 0 && aZ == metNum)
+ boolean foundATaper = false, foundBTaper = false;
+ if (aZ == metNum)
{
if (hor == null || hor.booleanValue())
{
- if (fY == aY && Math.abs(fX-aX) < aTaperLen) return aTaperWid;
- if (tY == aY && Math.abs(tX-aX) < aTaperLen) return aTaperWid;
+ if (DBMath.areEquals(fY, aEndpoints.getCenterY()) &&
+ (aTaperLen < 0 || Math.abs(fX-aEndpoints.getCenterX()) < aTaperLen)) foundATaper = true;
+ if (DBMath.areEquals(tY, aEndpoints.getCenterY()) &&
+ (aTaperLen < 0 || Math.abs(tX-aEndpoints.getCenterX()) < aTaperLen)) foundATaper = true;
}
if (hor == null || !hor.booleanValue())
{
- if (fX == aX && Math.abs(fY-aY) < aTaperLen) return aTaperWid;
- if (tX == aX && Math.abs(tY-aY) < aTaperLen) return aTaperWid;
+ if (DBMath.areEquals(fX, aEndpoints.getCenterX()) &&
+ (aTaperLen < 0 || Math.abs(fY-aEndpoints.getCenterY()) < aTaperLen)) foundATaper = true;
+ if (DBMath.areEquals(tX, aEndpoints.getCenterX()) &&
+ (aTaperLen < 0 || Math.abs(tY-aEndpoints.getCenterY()) < aTaperLen)) foundATaper = true;
}
}
// see if either point could be a taper from the "b" end
- if (bTaperLen >= 0 && bZ == metNum)
+ if (bZ == metNum)
{
if (hor == null || hor.booleanValue())
{
- if (fY == bY && Math.abs(fX-bX) < bTaperLen) return bTaperWid;
- if (tY == bY && Math.abs(tX-bX) < bTaperLen) return bTaperWid;
+ if (DBMath.areEquals(fY, bEndpoints.getCenterY()) &&
+ (bTaperLen < 0 || Math.abs(fX-bEndpoints.getCenterX()) < bTaperLen)) foundBTaper = true;
+ if (DBMath.areEquals(tY, bEndpoints.getCenterY()) &&
+ (bTaperLen < 0 || Math.abs(tX-bEndpoints.getCenterX()) < bTaperLen)) foundBTaper = true;
}
if (hor == null || !hor.booleanValue())
{
- if (fX == bX && Math.abs(fY-bY) < bTaperLen) return bTaperWid;
- if (tX == bX && Math.abs(tY-bY) < bTaperLen) return bTaperWid;
+ if (DBMath.areEquals(fX, bEndpoints.getCenterX()) &&
+ (bTaperLen < 0 || Math.abs(fY-bEndpoints.getCenterY()) < bTaperLen)) foundBTaper = true;
+ if (DBMath.areEquals(tX, bEndpoints.getCenterX()) &&
+ (bTaperLen < 0 || Math.abs(tY-bEndpoints.getCenterY()) < bTaperLen)) foundBTaper = true;
}
}
+ if (foundATaper && foundBTaper) return Math.max(aTaperWid, bTaperWid);
+ if (foundATaper) return aTaperWid;
+ if (foundBTaper) return bTaperWid;
// not a taper: use the default widths
return getUntaperedArcWidth(metNum);
@@ -2681,25 +3944,25 @@ public abstract class SeaOfGatesEngine
* Method to return the X coordinate of point A of this NeededRoute.
* @return the X coordinate of point A of this NeededRoute.
*/
- public double getAX() { return aX; }
+ public double getAX() { return aEndpoints.getCenterX(); }
/**
* Method to return the Y coordinate of point A of this NeededRoute.
* @return the Y coordinate of point A of this NeededRoute.
*/
- public double getAY() { return aY; }
+ public double getAY() { return aEndpoints.getCenterY(); }
/**
* Method to return the X coordinate of point B of this NeededRoute.
* @return the X coordinate of point B of this NeededRoute.
*/
- public double getBX() { return bX; }
+ public double getBX() { return bEndpoints.getCenterX(); }
/**
* Method to return the Y coordinate of point B of this NeededRoute.
* @return the Y coordinate of point B of this NeededRoute.
*/
- public double getBY() { return bY; }
+ public double getBY() { return bEndpoints.getCenterY(); }
/**
* Method to return an R-Tree of blockages on a given via Layer.
@@ -2717,11 +3980,11 @@ public abstract class SeaOfGatesEngine
public boolean checkEndSurround()
{
// determine "A" end surround
- double fromMetalSpacing = getArcWidth(aZ, aX, aY, aX, aY) / 2;
+ double fromMetalSpacing = getArcWidth(aZ, aEndpoints.getCenterX(), aEndpoints.getCenterY(), aEndpoints.getCenterX(), aEndpoints.getCenterY()) / 2;
double[] fromSurround = getSpacingRule(aZ, maxDefArcWidth[aZ], -1);
// see if "A" end access is blocked
- SOGBound block = getMetalBlockage(netID, aZ, fromMetalSpacing, fromMetalSpacing, fromSurround, aX, aY);
+ SOGBound block = getMetalBlockage(netID, aZ, aC, fromMetalSpacing, fromMetalSpacing, fromSurround, aEndpoints.getCenterX(), aEndpoints.getCenterY());
if (block != null && !sogp.isGridForced(primaryMetalArc[aZ]))
{
// ungridded center location still blocked: see if port has nonzero area and other places in it are free
@@ -2733,10 +3996,10 @@ public abstract class SeaOfGatesEngine
{
for(double y = fromRect.getMinY(); y <= fromRect.getMaxY(); y += stepSize)
{
- SOGBound stepBlock = getMetalBlockage(netID, aZ, fromMetalSpacing, fromMetalSpacing, fromSurround, x, y);
+ SOGBound stepBlock = getMetalBlockage(netID, aZ, aC, fromMetalSpacing, fromMetalSpacing, fromSurround, x, y);
if (stepBlock == null)
{
- aX = x; aY = y;
+ aEndpoints.setCenterX(x); aEndpoints.setCenterY(y);
block = null;
break;
}
@@ -2748,7 +4011,7 @@ public abstract class SeaOfGatesEngine
{
String errorMsg = "Cannot route from port " + aPi.getPortProto().getName()
+ " of node " + describe(aPi.getNodeInst()) + " at ("
- + TextUtils.formatDistance(aX) + "," + TextUtils.formatDistance(aY)
+ + TextUtils.formatDistance(aEndpoints.getCenterX()) + "," + TextUtils.formatDistance(aEndpoints.getCenterY())
+ ") because it is blocked on layer " + describeMetal(aZ,aC)
+ " [needs " + TextUtils.formatDistance(fromMetalSpacing + Math.max(fromSurround[0], fromSurround[1]))
+ " all around, blockage is "
@@ -2756,11 +4019,11 @@ public abstract class SeaOfGatesEngine
+ TextUtils.formatDistance(block.getBounds().getMaxX()) + " and "
+ TextUtils.formatDistance(block.getBounds().getMinY()) + "<=Y<="
+ TextUtils.formatDistance(block.getBounds().getMaxY())
- + "]";
+ + " on net " + block.getNetID() + " but routing net " + netID + "]";
if (reroute) errorMsg = "(Retry) " + errorMsg;
error(errorMsg);
List<PolyBase> polyList = new ArrayList<PolyBase>();
- polyList.add(new PolyBase(aX, aY, (fromMetalSpacing + fromSurround[0]) * 2,
+ polyList.add(new PolyBase(aEndpoints.getCenterX(), aEndpoints.getCenterY(), (fromMetalSpacing + fromSurround[0]) * 2,
(fromMetalSpacing + fromSurround[1]) * 2));
polyList.add(new PolyBase(block.getBounds()));
List<EPoint> lineList = new ArrayList<EPoint>();
@@ -2774,11 +4037,11 @@ public abstract class SeaOfGatesEngine
}
// determine "B" end surround
- double toMetalSpacing = getArcWidth(bZ, bX, bY, bX, bY) / 2;
+ double toMetalSpacing = getArcWidth(bZ, bEndpoints.getCenterX(), bEndpoints.getCenterY(), bEndpoints.getCenterX(), bEndpoints.getCenterY()) / 2;
double[] toSurround = getSpacingRule(bZ, maxDefArcWidth[bZ], -1);
// see if "B" end access is blocked
- block = getMetalBlockage(netID, bZ, toMetalSpacing, toMetalSpacing, toSurround, bX, bY);
+ block = getMetalBlockage(netID, bZ, bC, toMetalSpacing, toMetalSpacing, toSurround, bEndpoints.getCenterX(), bEndpoints.getCenterY());
if (block != null && !sogp.isGridForced(primaryMetalArc[bZ]))
{
// ungridded center location still blocked: see if port has nonzero area and other places in it are free
@@ -2790,10 +4053,10 @@ public abstract class SeaOfGatesEngine
{
for(double y = toRect.getMinY(); y <= toRect.getMaxY(); y += stepSize)
{
- SOGBound stepBlock = getMetalBlockage(netID, bZ, toMetalSpacing, toMetalSpacing, toSurround, x, y);
+ SOGBound stepBlock = getMetalBlockage(netID, bZ, bC, toMetalSpacing, toMetalSpacing, toSurround, x, y);
if (stepBlock == null)
{
- bX = x; bY = y;
+ bEndpoints.setCenterX(x); bEndpoints.setCenterY(y);
block = null;
break;
}
@@ -2805,7 +4068,7 @@ public abstract class SeaOfGatesEngine
{
String errorMsg = "Cannot route to port " + bPi.getPortProto().getName()
+ " of node " + describe(bPi.getNodeInst()) + " at ("
- + TextUtils.formatDistance(bX) + "," + TextUtils.formatDistance(bY)
+ + TextUtils.formatDistance(bEndpoints.getCenterX()) + "," + TextUtils.formatDistance(bEndpoints.getCenterY())
+ ") because it is blocked on layer " + describeMetal(bZ,bC)
+ " [needs " + TextUtils.formatDistance(toMetalSpacing + Math.max(toSurround[0], toSurround[1]))
+ " all around, blockage is "
@@ -2813,11 +4076,11 @@ public abstract class SeaOfGatesEngine
+ TextUtils.formatDistance(block.getBounds().getMaxX()) + " and "
+ TextUtils.formatDistance(block.getBounds().getMinY()) + "<=Y<="
+ TextUtils.formatDistance(block.getBounds().getMaxY())
- + "]";
+ + " on net " + block.getNetID() + " but routing net " + netID + "]";
if (reroute) errorMsg = "(Retry) " + errorMsg;
error(errorMsg);
List<PolyBase> polyList = new ArrayList<PolyBase>();
- polyList.add(new PolyBase(bX, bY, (toMetalSpacing + toSurround[0]) * 2,
+ polyList.add(new PolyBase(bEndpoints.getCenterX(), bEndpoints.getCenterY(), (toMetalSpacing + toSurround[0]) * 2,
(toMetalSpacing + toSurround[1]) * 2));
polyList.add(new PolyBase(block.getBounds()));
List<EPoint> lineList = new ArrayList<EPoint>();
@@ -2840,7 +4103,7 @@ public abstract class SeaOfGatesEngine
// fill list from the first endpoint of the route
MutableInteger miA = new MutableInteger(netID.intValue() | BLOCKAGEENDA);
MutableInteger miB = new MutableInteger(netID.intValue() | BLOCKAGEENDB);
- growPoint(aX, aY, aZ, miA);
+ growPoint(aEndpoints.getCenterX(), aEndpoints.getCenterY(), aZ, miA);
// iterate until the list is empty
for(;;)
@@ -2854,7 +4117,7 @@ public abstract class SeaOfGatesEngine
}
// now fill list from the second endpoint, noting whether the routing is already done
- boolean alreadyDone = growPoint(bX, bY, bZ, miB);
+ boolean alreadyDone = growPoint(bEndpoints.getCenterX(), bEndpoints.getCenterY(), bZ, miB);
if (alreadyDone) alreadyRouted = true;
// add in blockage setting for any tap points on the spine
@@ -2925,7 +4188,7 @@ public abstract class SeaOfGatesEngine
private void growArea(SOGBound sBound, int layerNum, MutableInteger idNumber)
{
BlockageTree metalTree = rTrees.getMetalTree(primaryMetalLayer[layerNum]);
- Rectangle2D bound = sBound.bound;
+ Rectangle2D bound = sBound.getBounds();
for (Iterator<SOGBound> sea = metalTree.search(bound); sea.hasNext(); )
{
SOGBound subBound = sea.next();
@@ -3013,11 +4276,12 @@ public abstract class SeaOfGatesEngine
} else
{
points1 = new EPoint[5];
- points1[0] = EPoint.fromLambda(bound1.bound.getMinX(), bound1.bound.getMinY());
- points1[1] = EPoint.fromLambda(bound1.bound.getMinX(), bound1.bound.getMaxY());
- points1[2] = EPoint.fromLambda(bound1.bound.getMaxX(), bound1.bound.getMaxY());
- points1[3] = EPoint.fromLambda(bound1.bound.getMaxX(), bound1.bound.getMinY());
- points1[4] = EPoint.fromLambda(bound1.bound.getMinX(), bound1.bound.getMinY());
+ ERectangle r = bound1.getBounds();
+ points1[0] = EPoint.fromLambda(r.getMinX(), r.getMinY());
+ points1[1] = EPoint.fromLambda(r.getMinX(), r.getMaxY());
+ points1[2] = EPoint.fromLambda(r.getMaxX(), r.getMaxY());
+ points1[3] = EPoint.fromLambda(r.getMaxX(), r.getMinY());
+ points1[4] = EPoint.fromLambda(r.getMinX(), r.getMinY());
}
EPoint[] points2;
@@ -3030,11 +4294,12 @@ public abstract class SeaOfGatesEngine
} else
{
points2 = new EPoint[5];
- points2[0] = EPoint.fromLambda(bound2.bound.getMinX(), bound2.bound.getMinY());
- points2[1] = EPoint.fromLambda(bound2.bound.getMinX(), bound2.bound.getMaxY());
- points2[2] = EPoint.fromLambda(bound2.bound.getMaxX(), bound2.bound.getMaxY());
- points2[3] = EPoint.fromLambda(bound2.bound.getMaxX(), bound2.bound.getMinY());
- points2[4] = EPoint.fromLambda(bound2.bound.getMinX(), bound2.bound.getMinY());
+ ERectangle r = bound2.getBounds();
+ points2[0] = EPoint.fromLambda(r.getMinX(), r.getMinY());
+ points2[1] = EPoint.fromLambda(r.getMinX(), r.getMaxY());
+ points2[2] = EPoint.fromLambda(r.getMaxX(), r.getMaxY());
+ points2[3] = EPoint.fromLambda(r.getMaxX(), r.getMinY());
+ points2[4] = EPoint.fromLambda(r.getMinX(), r.getMinY());
}
// now look for line intersections
@@ -3243,6 +4508,7 @@ public abstract class SeaOfGatesEngine
* Method to see if a proposed piece of metal has DRC errors (ignoring notches).
* @param netID the network ID of the desired metal (blockages on this netID are ignored).
* @param metNo the level of the metal.
+ * @param maskColor the mask number of the metal.
* @param halfWidth half of the width of the metal.
* @param halfHeight half of the height of the metal.
* @param surround is the maximum possible DRC surround around the metal (index 0 for X, index 1 for Y).
@@ -3250,7 +4516,7 @@ public abstract class SeaOfGatesEngine
* @param y the Y coordinate at the center of the metal.
* @return a blocking SOGBound object that is in the area. Returns null if the area is clear.
*/
- public SOGBound getMetalBlockage(MutableInteger netID, int metNo, double halfWidth, double halfHeight,
+ public SOGBound getMetalBlockage(MutableInteger netID, int metNo, int maskColor, double halfWidth, double halfHeight,
double surround[], double x, double y)
{
// get the R-Tree data for the metal layer
@@ -3272,8 +4538,11 @@ public abstract class SeaOfGatesEngine
DBMath.isLessThanOrEqualTo(bound.getMaxY(), lY) ||
DBMath.isGreaterThanOrEqualTo(bound.getMinY(), hY)) continue;
- // ignore if on the same net
- if (netID != null && sBound.isSameBasicNet(netID)) continue;
+ // ignore if on the same net and same mask
+ if (sBound.getMaskColor() == maskColor)
+ {
+ if (netID != null && sBound.isSameBasicNet(netID)) continue;
+ }
// if this is a polygon, do closer examination
if (sBound instanceof SOGPoly)
@@ -3289,83 +4558,6 @@ public abstract class SeaOfGatesEngine
}
}
- /**
- * Method to find a via blockage in the R-Tree.
- * @param netID the network ID of the desired space (vias at this point and on this netID are ignored).
- * @param layer the via layer being examined.
- * @param halfWidth half of the width of the area to examine.
- * @param halfHeight half of the height of the area to examine.
- * @param x the X coordinate at the center of the area to examine.
- * @param y the Y coordinate at the center of the area to examine.
- * @return a blocking SOGVia object that is in the area. Returns null if the area is clear.
- */
- public SOGVia getViaBlockage(MutableInteger netID, Layer layer, double surround, Rectangle2D rect)
- {
- BlockageTree bTree = rTrees.getViaTree(layer);
- double rectLX = rect.getMinX(), rectHX = rect.getMaxX();
- double rectLY = rect.getMinY(), rectHY = rect.getMaxY();
- bTree.lock();
- try {
- if (bTree.isEmpty()) return null;
-
- // see if there is anything in that area
- Rectangle2D searchArea = new Rectangle2D.Double(rect.getMinX()-surround-1, rect.getMinY()-surround-1,
- rect.getWidth()+surround*2+2, rect.getHeight()+surround*2+2);
- for (Iterator<SOGBound> sea = bTree.search(searchArea); sea.hasNext();)
- {
- SOGVia sLoc = (SOGVia)sea.next();
- double testLX = sLoc.getBounds().getMinX(), testHX = sLoc.getBounds().getMaxX();
- double testLY = sLoc.getBounds().getMinY(), testHY = sLoc.getBounds().getMaxY();
- double dist = cutDistance(rectLX, rectHX, rectLY, rectHY, testLX, testHX, testLY, testHY);
- if (DBMath.isGreaterThanOrEqualTo(dist, surround)) continue;
- if (sLoc.isSameBasicNet(netID))
- {
- if (DBMath.areEquals(sLoc.getBounds().getCenterX(), rect.getCenterX()) && DBMath.areEquals(sLoc.getBounds().getCenterY(), rect.getCenterY())) continue;
- }
- return sLoc;
- }
- return null;
- } finally {
- bTree.unlock();
- }
- }
-
- /**
- * Method to find a via blockage in the R-Tree.
- * @param netID the network ID of the desired space (vias at this point and on this netID are ignored).
- * @param layer the via layer being examined.
- * @param halfWidth half of the width of the area to examine.
- * @param halfHeight half of the height of the area to examine.
- * @param x the X coordinate at the center of the area to examine.
- * @param y the Y coordinate at the center of the area to examine.
- * @return a blocking SOGVia object that is in the area. Returns null if the area is clear.
- */
- public SOGVia getViaBlockageOLD(MutableInteger netID, Layer layer, double halfWidth, double halfHeight, double x, double y)
- {
- BlockageTree bTree = rTrees.getViaTree(layer);
- bTree.lock();
- try {
- if (bTree.isEmpty()) return null;
-
- // see if there is anything in that area
- Rectangle2D searchArea = new Rectangle2D.Double(x - halfWidth, y - halfHeight, halfWidth * 2, halfHeight * 2);
- for (Iterator<SOGBound> sea = bTree.search(searchArea); sea.hasNext();)
- {
- SOGVia sLoc = (SOGVia)sea.next();
- double distX = Math.abs(x - sLoc.getBounds().getCenterX()), distY = Math.abs(y - sLoc.getBounds().getCenterY());
- if (DBMath.isGreaterThanOrEqualTo(distX, halfWidth) || DBMath.isGreaterThanOrEqualTo(distY, halfHeight)) continue;
- if (sLoc.isSameBasicNet(netID))
- {
- if (DBMath.areEquals(sLoc.getBounds().getCenterX(), x) && DBMath.areEquals(sLoc.getBounds().getCenterY(), y)) continue;
- }
- return sLoc;
- }
- return null;
- } finally {
- bTree.unlock();
- }
- }
-
public void completeRoute(SearchVertex result)
{
if (result.wf != null)
@@ -3391,11 +4583,16 @@ public abstract class SeaOfGatesEngine
{
Point2D loc = GenMath.closestPointToSegment(new Point2D.Double(lastSV.getX(), lastSV.getY()),
new Point2D.Double(sv.getX(), sv.getY()), pt);
- double dist = Math.abs(loc.getX() - pt.getX()) + Math.abs(loc.getY() - pt.getY());
+ double locX = loc.getX(), locY = loc.getY();
+ if (gridLocationsX[sv.getZ()] != null && forceGridArcs[sv.getZ()])
+ locX = getClosestXGrid(sv.getZ(), locX).getCoordinate();
+ if (gridLocationsY[sv.getZ()] != null && forceGridArcs[sv.getZ()])
+ locY = getClosestYGrid(sv.getZ(), locY).getCoordinate();
+ double dist = Math.abs(locX - pt.getX()) + Math.abs(locY - pt.getY());
if (dist < bestDist)
{
bestDist = dist;
- bestLoc = loc;
+ bestLoc = new Point2D.Double(locX, locY);
bestInsertPos = i;
}
}
@@ -3405,7 +4602,7 @@ public abstract class SeaOfGatesEngine
{
SearchVertex last = result.wf.vertices.get(bestInsertPos);
SearchVertex svTap = new SearchVertex(bestLoc.getX(), bestLoc.getY(), last.getZ(), last.getC(),
- 0, null, null, 0, null, 0);
+ 0, null, null, 0, null, 0, null);
result.wf.vertices.add(bestInsertPos, svTap);
spineTapMap.put(svTap, pi);
}
@@ -3440,8 +4637,8 @@ public abstract class SeaOfGatesEngine
if (result == svLimited || result == svExhausted)
{
List<EPoint> lineList = new ArrayList<EPoint>();
- lineList.add(EPoint.fromLambda(aX, aY));
- lineList.add(EPoint.fromLambda(bX, bY));
+ lineList.add(aEndpoints.getCenter());
+ lineList.add(bEndpoints.getCenter());
loggedMessage = errorLogger.logMessageWithLines(errorMessage, null, lineList, cell, 0, isAnError);
}
}
@@ -3475,25 +4672,28 @@ public abstract class SeaOfGatesEngine
public void clearRoutes()
{
- nodesToRoute.clear();
- arcsToRoute.clear();
- nodesIDsToKill.clear();
- arcsIDsToKill.clear();
- unroutedToAdd.clear();
+ nodesToRoute.clear();
+ arcsToRoute.clear();
+ nodesIDsToKill.clear();
+ arcsIDsToKill.clear();
+ unroutedToAdd.clear();
}
}
public static class RouteAddUnrouted implements Serializable
{
private int nodeIDA, nodeIDB;
+ private PortInst piA, piB;
private PortProtoId portIdA, portIdB;
private EPoint locA, locB;
public RouteAddUnrouted(PortInst piA, PortInst piB)
{
+ this.piA = piA;
nodeIDA = piA.getNodeInst().getNodeId();
portIdA = piA.getPortProto().getId();
locA = piA.getCenter();
+ this.piB = piB;
nodeIDB = piB.getNodeInst().getNodeId();
portIdB = piB.getPortProto().getId();
locB = piB.getCenter();
@@ -3501,12 +4701,16 @@ public abstract class SeaOfGatesEngine
int getTailId() { return nodeIDA; }
+ PortInst getTailPort() { return piA; }
+
PortProtoId getTailPortProtoId() { return portIdA; }
EPoint getTailLocation() { return locA; }
int getHeadId() { return nodeIDB; }
+ PortInst getHeadPort() { return piB; }
+
PortProtoId getHeadPortProtoId() { return portIdB; }
EPoint getHeadLocation() { return locB; }
@@ -3521,6 +4725,7 @@ public abstract class SeaOfGatesEngine
private double wid;
private double hei;
private Orientation orient;
+ private PortInst pi;
private int terminalNodeID;
private PortProtoId terminalNodePort;
private PortInst tapConnection;
@@ -3531,12 +4736,13 @@ public abstract class SeaOfGatesEngine
exists = false;
this.np = np;
this.loc = loc;
- long x = FixpCoord.lambdaToFixp(loc.getX());
- long y = FixpCoord.lambdaToFixp(loc.getY());
+ long x = FixpCoord.lambdaToFixp(loc.getX());
+ long y = FixpCoord.lambdaToFixp(loc.getY());
rect = FixpRectangle.fromFixpDiagonal(x, y, x, y);
this.wid = wid;
this.hei = hei;
this.orient = orient;
+ this.pi = null;
this.tapConnection = tapConnection;
this.nr = nr;
@@ -3557,6 +4763,7 @@ public abstract class SeaOfGatesEngine
public RouteNode(PortInst pi)
{
exists = true;
+ this.pi = pi;
terminalNodeID = pi.getNodeInst().getNodeId();
terminalNodePort = pi.getPortProto().getId();
loc = pi.getCenter();
@@ -3565,8 +4772,14 @@ public abstract class SeaOfGatesEngine
boolean exists() { return exists; }
+ NodeProto getProto() { return np; }
+
NodeProtoId getProtoId() { return np.getId(); }
+ void setPi(PortInst pi) { this.pi = pi; }
+
+ PortInst getPi() { return pi; }
+
PortInst getTapConnection() { return tapConnection; }
void setTapConnection(ImmutableNodeInst ini)
@@ -3585,6 +4798,10 @@ public abstract class SeaOfGatesEngine
EPoint getLoc() { return loc; }
+ double getWidth() { return wid;}
+
+ double getHeight() { return hei; }
+
EPoint getSize() {
if (np instanceof Cell) {
return EPoint.ORIGIN;
@@ -3631,7 +4848,7 @@ public abstract class SeaOfGatesEngine
// presuming a simple arc shape
EPoint fromLoc = from.loc;
EPoint toLoc = to.loc;
-
+
Poly poly = null;
if (fromLoc.getX() == toLoc.getX())
{
@@ -3677,6 +4894,10 @@ public abstract class SeaOfGatesEngine
}
+ ArcProto getProto() {
+ return type;
+ }
+
ArcProtoId getProtoId() {
return type.getId();
}
@@ -3693,6 +4914,10 @@ public abstract class SeaOfGatesEngine
return netName;
}
+ double getWidth() {
+ return wid;
+ }
+
long getGridExtendOverMin() {
return DBMath.lambdaToGrid(0.5 * wid) - type.getBaseExtend().getGrid();
}
@@ -3711,7 +4936,7 @@ public abstract class SeaOfGatesEngine
public class Wavefront
{
/** The route that this is part of. */ final NeededRoute nr;
- /** Wavefront name (for debugging). */ final String name;
+ /** The direction of the route. */ final boolean aToB;
/** Active search vertices while running wavefront. */ private final OrderedSearchVertex active;
/** Used search vertices while running wavefront (debug). */ private final List<SearchVertex> inactive;
/** Resulting list of vertices found for this wavefront. */ List<SearchVertex> vertices;
@@ -3722,9 +4947,7 @@ public abstract class SeaOfGatesEngine
/** The starting X/Y coordinates of the wavefront. */ final double fromX, fromY;
/** The starting area of the wavefront. */ final FixpRectangle fromRect;
/** The starting metal layer of the wavefront. */ final int fromZ, fromC;
- /** The ending X/Y coordinates of the wavefront. */ final double toX, toY;
- /** The ending area of the wavefront. */ final FixpRectangle toRect;
- /** The expanded grid of the ending area of the wavefront. */ final FixpRectangle toRectGridded;
+ /** The possible ending coordinates of the wavefront. */ public PossibleEndpoints toPE;
/** The ending metal layer of the wavefront. */ final int toZ, toC;
/** The maximum taper lengths. */ final double fromTaperLen, toTaperLen;
/** Count of the number of wavefront advances made. */ int numStepsMade;
@@ -3735,13 +4958,13 @@ public abstract class SeaOfGatesEngine
@SuppressWarnings({ "unchecked" } )
/** Search vertices found while running the wavefront. */ final Map<Integer, Map<Integer,SearchVertex>>[] searchVertexPlanes = new Map[numMetalLayers];
@SuppressWarnings({ "unchecked" } )
- /** true when searching finished successfully or failed */ private boolean finished;
+ /** true when searching finished successfully or failed */ private boolean finished;
/** array for optimized vertices (allocated once) */ private List<SearchVertex> optimizedList = new ArrayList<SearchVertex>();
Wavefront(NeededRoute nr,
PortInst from, FixpRectangle fromRect, double fromX, double fromY, int fromZ, int fromC, double fromTaperLen, int fromBit,
- PortInst to, FixpRectangle toRect, FixpRectangle toRectGridded, double toX, double toY, int toZ, int toC, double toTaperLen,
- int globalRoutingDelta, String name, boolean debugIt)
+ PortInst to, PossibleEndpoints toPE, int toZ, int toC, double toTaperLen,
+ int globalRoutingDelta, Boolean aToB, boolean debugIt)
{
this.nr = nr;
this.from = from;
@@ -3752,17 +4975,14 @@ public abstract class SeaOfGatesEngine
this.fromRect = fromRect;
this.fromBit = fromBit;
this.to = to;
- this.toX = toX;
- this.toY = toY;
+ this.toPE = toPE;
this.toZ = toZ;
this.toC = toC;
- this.toRect = toRect;
- this.toRectGridded = toRectGridded;
this.fromTaperLen = fromTaperLen;
this.toTaperLen = toTaperLen;
if (nr.buckets == null) globalRoutingDelta = 0;
this.globalRoutingDelta = globalRoutingDelta;
- this.name = name;
+ this.aToB = aToB;
this.numStepsMade = 0;
active = new OrderedSearchVertex();
inactive = new ArrayList<SearchVertex>();
@@ -3770,7 +4990,7 @@ public abstract class SeaOfGatesEngine
abort = false;
debuggingWavefront = debugIt;
- SearchVertex svStart = new SearchVertex(fromX, fromY, fromZ, fromC, 0, null, null, 0, this, 0);
+ SearchVertex svStart = new SearchVertex(fromX, fromY, fromZ, fromC, 0, null, null, 0, this, 0, null);
if (debuggingWavefront) RoutingDebug.ensureDebuggingShadow(svStart, true);
if (globalRoutingDelta != 0)
{
@@ -3842,6 +5062,8 @@ public abstract class SeaOfGatesEngine
active.add(svStart);
}
+ public boolean isAtoB() { return aToB; }
+
public PortInst getFromPortInst() { return from; }
public PortInst getToPortInst() { return to; }
@@ -3854,9 +5076,7 @@ public abstract class SeaOfGatesEngine
public int getFromMask() { return fromC; }
- public double getToX() { return toX; }
-
- public double getToY() { return toY; }
+ public PossibleEndpoints getTo() { return toPE; }
public int getToZ() { return toZ; }
@@ -3928,21 +5148,25 @@ public abstract class SeaOfGatesEngine
private void setDebugStringHeader(String str)
{
debugString[0] = str;
+ //System.out.println(str);
}
private void setDebugString(int direction, String str)
{
debugString[direction+1] = str;
+ //System.out.println(str);
}
private void addDebugString(int direction, String str)
{
debugString[direction+1] += str;
+ //System.out.println(str);
}
private void completeDebugString(int direction, String str)
{
debugString[direction+1] += str;
+ //System.out.println(str);
}
/**
@@ -3982,7 +5206,7 @@ public abstract class SeaOfGatesEngine
// see if automatic generation is requested
int lastDirection = svCurrent.getAutoGen();
if (lastDirection >= 0)
- svCurrent.generateIntermediateVertex(lastDirection, toRectGridded, cell);
+ svCurrent.generateIntermediateVertex(lastDirection, toPE.getGriddedRect(), cell);
// look at all directions from this point
SearchVertex destinationSV = null;
@@ -4002,10 +5226,9 @@ public abstract class SeaOfGatesEngine
if (debuggingWavefront) setDebugString(i, "Cannot move in -X axis");
continue;
}
- if (DBMath.areEquals(curY, toY) && toRectGridded.getMinX() < toRectGridded.getMaxX() &&
- curX >= toRectGridded.getMinX() && curX <= toRectGridded.getMaxX()) dx = toX - curX; else
- if (inDestGrid(toRectGridded, curX-GRAINSIZE, curY)) dx = -GRAINSIZE; else
- dx = nr.getLowerXGrid(curZ, curX-GRAINSIZE).getCoordinate() - curX;
+ if (toPE.isWithinNonzeroX(curX, curY)) dx = toPE.getClosestX(curX) - curX; else
+ if (toPE.atGoalPoint(curX-GRAINSIZE, curY)) dx = -GRAINSIZE; else
+ dx = nr.getLowerXGrid(curZ, curX-GRAINSIZE).getCoordinate() - curX;
if (nr.gridLocationsX[curZ] == null || !nr.forceGridArcs[curZ])
{
@@ -4013,25 +5236,25 @@ public abstract class SeaOfGatesEngine
if (intermediate != curX + dx) dx = intermediate - curX;
}
- if (toX < curX)
+ if (toPE.isBelowX(curX))
{
// jump as far as possible toward goal
dx = getJumpSize(svCurrent, curX, curY, curZ, dx, dy, jumpExplanation);
if (dx >= 0) dx = -1;
}
- if (nr.gridLocationsX[curZ] != null && nr.forceGridArcs[curZ] && (curX+dx != toX || curY != toY || curZ != toZ))
+ if (debuggingWavefront)
+ {
+ setDebugString(i, "Move " + (dx < 0 ? "" : "+") + TextUtils.formatDistance(dx));
+ if (jumpExplanation.length() != 0) addDebugString(i, " [" + jumpExplanation.toString() + "]"); else
+ if (!toPE.isBelowX(curX)) addDebugString(i, " [already at Y="+TextUtils.formatDistance(curX)+
+ " which is to left of "+TextUtils.formatDistance(toPE.getCenterX()) + "]");
+ }
+ if (nr.gridLocationsX[curZ] != null && nr.forceGridArcs[curZ] && (!toPE.atGoalPoint(curX+dx, curY) || curZ != toZ))
{
double gridX = nr.getClosestXGrid(curZ, curX+dx).getCoordinate();
if (gridX == curX)
{
- if (debuggingWavefront)
- {
- if (jumpExplanation.length() != 0) setDebugString(i, "Blocked by " + jumpExplanation.toString()); else
- {
- setDebugString(i, "Can only move to " + TextUtils.formatDistance(curX+dx) +
- " which is gridded right to " + TextUtils.formatDistance(gridX) + " (no movement)");
- }
- }
+ if (debuggingWavefront) addDebugString(i, ", but gridded right to " + TextUtils.formatDistance(gridX) + " (no movement)");
continue;
}
dx = gridX - curX;
@@ -4043,10 +5266,9 @@ public abstract class SeaOfGatesEngine
if (debuggingWavefront) setDebugString(i, "Cannot move in +X axis");
continue;
}
- if (DBMath.areEquals(curY, toY) && toRectGridded.getMinX() < toRectGridded.getMaxX() &&
- curX >= toRectGridded.getMinX() && curX <= toRectGridded.getMaxX()) dx = toX - curX; else
- if (inDestGrid(toRectGridded, curX+GRAINSIZE, curY)) dx = GRAINSIZE; else
- dx = nr.getUpperXGrid(curZ, curX+GRAINSIZE).getCoordinate() - curX;
+ if (toPE.isWithinNonzeroX(curX, curY)) dx = toPE.getClosestX(curX) - curX; else
+ if (toPE.atGoalPoint(curX+GRAINSIZE, curY)) dx = GRAINSIZE; else
+ dx = nr.getLowerXGrid(curZ, curX+GRAINSIZE).getCoordinate() - curX;
if (nr.gridLocationsX[curZ] == null || !nr.forceGridArcs[curZ])
{
@@ -4054,25 +5276,25 @@ public abstract class SeaOfGatesEngine
if (intermediate != curX + dx) dx = intermediate - curX;
}
- if (toX > curX)
+ if (toPE.isAboveX(curX))
{
// jump as far as possible toward goal
dx = getJumpSize(svCurrent, curX, curY, curZ, dx, dy, jumpExplanation);
if (dx <= 0) dx = 1;
}
- if (nr.gridLocationsX[curZ] != null && nr.forceGridArcs[curZ] && (curX+dx != toX || curY != toY || curZ != toZ))
+ if (debuggingWavefront)
+ {
+ setDebugString(i, "Move " + (dx < 0 ? "" : "+") + TextUtils.formatDistance(dx));
+ if (jumpExplanation.length() != 0) addDebugString(i, " [" + jumpExplanation.toString() + "]"); else
+ if (!toPE.isAboveX(curX)) addDebugString(i, " [already at Y="+TextUtils.formatDistance(curX)+
+ " which is to right of "+TextUtils.formatDistance(toPE.getCenterX()) + "]");
+ }
+ if (nr.gridLocationsX[curZ] != null && nr.forceGridArcs[curZ] && (!toPE.atGoalPoint(curX+dx, curY) || curZ != toZ))
{
double gridX = nr.getClosestXGrid(curZ, curX+dx).getCoordinate();
if (gridX == curX)
{
- if (debuggingWavefront)
- {
- if (jumpExplanation.length() != 0) setDebugString(i, "Blocked by " + jumpExplanation.toString()); else
- {
- setDebugString(i, "Can only move to " + TextUtils.formatDistance(curX+dx) +
- " which is gridded left to " + TextUtils.formatDistance(gridX) + " (no movement)");
- }
- }
+ if (debuggingWavefront) addDebugString(i, ", but gridded left to " + TextUtils.formatDistance(gridX) + " (no movement)");
continue;
}
dx = gridX - curX;
@@ -4084,10 +5306,9 @@ public abstract class SeaOfGatesEngine
if (debuggingWavefront) setDebugString(i, "Cannot move in -Y axis");
continue;
}
- if (DBMath.areEquals(curX, toX) && toRectGridded.getMinY() < toRectGridded.getMaxY() &&
- curY >= toRectGridded.getMinY() && curY <= toRectGridded.getMaxY()) dy = toY - curY; else
- if (inDestGrid(toRectGridded, curX, curY-GRAINSIZE)) dy = -GRAINSIZE; else
- dy = nr.getLowerYGrid(curZ, curY-GRAINSIZE).getCoordinate() - curY;
+ if (toPE.isWithinNonzeroY(curX, curY)) dy = toPE.getClosestY(curX) - curY; else
+ if (toPE.atGoalPoint(curX, curY-GRAINSIZE)) dy = -GRAINSIZE; else
+ dy = nr.getLowerYGrid(curZ, curY-GRAINSIZE).getCoordinate() - curY;
if (nr.gridLocationsY[curZ] == null || !nr.forceGridArcs[curZ])
{
@@ -4095,25 +5316,25 @@ public abstract class SeaOfGatesEngine
if (intermediate != curY + dy) dy = intermediate - curY;
}
- if (toY < curY)
+ if (toPE.isBelowY(curY))
{
// jump as far as possible toward goal
dy = getJumpSize(svCurrent, curX, curY, curZ, dx, dy, jumpExplanation);
if (dy >= 0) dy = -1;
}
- if (nr.gridLocationsY[curZ] != null && nr.forceGridArcs[curZ] && (curX != toX || curY+dy != toY || curZ != toZ))
+ if (debuggingWavefront)
+ {
+ setDebugString(i, "Move " + (dy < 0 ? "" : "+") + TextUtils.formatDistance(dy));
+ if (jumpExplanation.length() != 0) addDebugString(i, " [" + jumpExplanation.toString() + "]"); else
+ if (!toPE.isBelowY(curY)) addDebugString(i, " [already at Y="+TextUtils.formatDistance(curY)+
+ " which is below "+TextUtils.formatDistance(toPE.getCenterY()) + "]");
+ }
+ if (nr.gridLocationsY[curZ] != null && nr.forceGridArcs[curZ] && (!toPE.atGoalPoint(curX, curY+dy) || curZ != toZ))
{
double gridY = nr.getClosestYGrid(curZ, curY+dy).getCoordinate();
if (gridY == curY)
{
- if (debuggingWavefront)
- {
- if (jumpExplanation.length() != 0) setDebugString(i, "Blocked by " + jumpExplanation.toString()); else
- {
- setDebugString(i, "Can only move to " + TextUtils.formatDistance(curY+dy) +
- " which is gridded up to " + TextUtils.formatDistance(gridY) + " (no movement)");
- }
- }
+ if (debuggingWavefront) addDebugString(i, ", but gridded up to " + TextUtils.formatDistance(gridY) + " (no movement)");
continue;
}
dy = gridY - curY;
@@ -4125,10 +5346,9 @@ public abstract class SeaOfGatesEngine
if (debuggingWavefront) setDebugString(i, "Cannot move in +Y axis");
continue;
}
- if (DBMath.areEquals(curX, toX) && toRectGridded.getMinY() < toRectGridded.getMaxY() &&
- curY >= toRectGridded.getMinY() && curY <= toRectGridded.getMaxY()) dy = toY - curY; else
- if (inDestGrid(toRectGridded, curX, curY+GRAINSIZE)) dy = GRAINSIZE; else
- dy = nr.getUpperYGrid(curZ, curY+GRAINSIZE).getCoordinate() - curY;
+ if (toPE.isWithinNonzeroY(curX, curY)) dy = toPE.getClosestY(curX) - curY; else
+ if (toPE.atGoalPoint(curX, curY+GRAINSIZE)) dy = GRAINSIZE; else
+ dy = nr.getLowerYGrid(curZ, curY+GRAINSIZE).getCoordinate() - curY;
if (nr.gridLocationsY[curZ] == null || !nr.forceGridArcs[curZ])
{
@@ -4136,25 +5356,25 @@ public abstract class SeaOfGatesEngine
if (intermediate != curY + dy) dy = intermediate - curY;
}
- if (toY > curY)
+ if (toPE.isAboveY(curY))
{
// jump as far as possible toward goal
dy = getJumpSize(svCurrent, curX, curY, curZ, dx, dy, jumpExplanation);
if (dy <= 0) dy = 1;
}
- if (nr.gridLocationsY[curZ] != null && nr.forceGridArcs[curZ] && (curX != toX || curY+dy != toY || curZ != toZ))
+ if (debuggingWavefront)
+ {
+ setDebugString(i, "Move " + (dy < 0 ? "" : "+") + TextUtils.formatDistance(dy));
+ if (jumpExplanation.length() != 0) addDebugString(i, " [" + jumpExplanation.toString() + "]"); else
+ if (!toPE.isAboveY(curY)) addDebugString(i, " [already at Y="+TextUtils.formatDistance(curY)+
+ " which is above "+TextUtils.formatDistance(toPE.getCenterY()) + "]");
+ }
+ if (nr.gridLocationsY[curZ] != null && nr.forceGridArcs[curZ] && (!toPE.atGoalPoint(curX, curY+dy) || curZ != toZ))
{
double gridY = nr.getClosestYGrid(curZ, curY+dy).getCoordinate();
if (gridY == curY)
{
- if (debuggingWavefront)
- {
- if (jumpExplanation.length() != 0) setDebugString(i, "Blocked by " + jumpExplanation.toString()); else
- {
- setDebugString(i, "Can only move to " + TextUtils.formatDistance(curY+dy) +
- " which is gridded down to " + TextUtils.formatDistance(gridY) + " (no movement)");
- }
- }
+ if (debuggingWavefront) addDebugString(i, ", but gridded down to " + TextUtils.formatDistance(gridY) + " (no movement)");
continue;
}
dy = gridY - curY;
@@ -4162,35 +5382,24 @@ public abstract class SeaOfGatesEngine
break;
case 4: // move -Z
dz = -1;
+ if (debuggingWavefront) setDebugString(i, "Move -1");
break;
case 5: // move +Z
dz = 1;
+ if (debuggingWavefront) setDebugString(i, "Move +1");
break;
}
- if (debuggingWavefront)
- {
- switch (i)
- {
- case 0: case 1:
- setDebugString(i, "Move " + (dx < 0 ? "" : "+") + TextUtils.formatDistance(dx));
- break;
- case 2: case 3:
- setDebugString(i, "Move " + (dy < 0 ? "" : "+") + TextUtils.formatDistance(dy));
- break;
- case 4: setDebugString(i, "Move -1"); break;
- case 5: setDebugString(i, "Move +1"); break;
- }
- }
-
- // create the "next" step location
+ // determine new SearchVertex coordinates
double nX = curX + dx;
double nY = curY + dy;
int nZ = curZ + dz;
int nC = curC;
+
+ // create the "next" step location
if (dz == 0)
{
- // limit distance if running a taper on the initial segment
+ // running on same layer: limit distance if running a taper on the initial segment
if (fromTaperLen >= 0 && !svCurrent.isOffInitialSegment())
{
// compute distance from start
@@ -4204,10 +5413,9 @@ public abstract class SeaOfGatesEngine
continue;
}
}
- if (jumpExplanation != null && jumpExplanation.length() != 0)
- completeDebugString(i, " [Stopped by " + jumpExplanation.toString() + "]");
} else
{
+ // switching to new layer
if (nZ < 0 || nZ >= numMetalLayers)
{
if (debuggingWavefront) completeDebugString(i, ": Out Of Bounds");
@@ -4219,11 +5427,36 @@ public abstract class SeaOfGatesEngine
continue;
}
+ // make sure gridding on new layer is honored
+ if (nr.forceGridArcs[nZ])
+ {
+ boolean hor = true;
+ if (sogp.isHorizontalEven())
+ {
+ if ((nZ%2) == 0) hor = false;
+ } else
+ {
+ if ((nZ%2) != 0) hor = false;
+ }
+ if (!hor && !nr.isOnXGrid(nZ, curX))
+ {
+ if (debuggingWavefront)
+ setDebugString(i, "Not on metal " + (nZ+1) + " X grid");
+ continue;
+ }
+ if (hor && !nr.isOnYGrid(nZ, curY))
+ {
+ if (debuggingWavefront)
+ setDebugString(i, "Not on metal " + (nZ+1) + " Y grid");
+ continue;
+ }
+ }
+
// if switching to destination layer that tapers but is too far away, mark that this cannot finish the route
- if (nZ == toZ && toTaperLen >= 0 && (DBMath.areEquals(nX, toX) || DBMath.areEquals(nY, toY)))
+ if (nZ == toZ && toTaperLen >= 0 && toPE.isOnGoalAxis(nX, nY))
{
// compute distance from end
- double closest = Math.max(Math.abs(nX - toX), Math.abs(nY - toY));
+ double closest = toPE.getDistToGoal(nX, nY);
if (closest > toTaperLen)
{
if (taperOnlyArcs[nZ])
@@ -4301,7 +5534,7 @@ public abstract class SeaOfGatesEngine
{
SOGBound sBound = sea.next();
if (sBound.isSameBasicNet(nr.netID))
- nC = sBound.maskLayer;
+ nC = sBound.getMaskColor();
}
}
} finally {
@@ -4319,7 +5552,7 @@ public abstract class SeaOfGatesEngine
if (nX < limit.getMinX())
{
nX = limit.getMinX();
- if (!inDestGrid(toRectGridded, nX, curY)) nX = nr.getUpperXGrid(curZ, nX).getCoordinate();
+ if (!toPE.atGoalPoint(nX, curY)) nX = nr.getUpperXGrid(curZ, nX).getCoordinate();
dx = nX - curX;
if (dx == 0)
{
@@ -4330,7 +5563,7 @@ public abstract class SeaOfGatesEngine
if (nX > limit.getMaxX())
{
nX = limit.getMaxX();
- if (!inDestGrid(toRectGridded, nX, curY)) nX = nr.getLowerXGrid(curZ, nX).getCoordinate();
+ if (!toPE.atGoalPoint(nX, curY)) nX = nr.getLowerXGrid(curZ, nX).getCoordinate();
dx = nX - curX;
if (dx == 0)
{
@@ -4341,7 +5574,7 @@ public abstract class SeaOfGatesEngine
if (nY < limit.getMinY())
{
nY = limit.getMinY();
- if (!inDestGrid(toRectGridded, curX, nY)) nY = nr.getUpperYGrid(curZ, nY).getCoordinate();
+ if (!toPE.atGoalPoint(curX, nY)) nY = nr.getUpperYGrid(curZ, nY).getCoordinate();
dy = nY - curY;
if (dy == 0)
{
@@ -4352,7 +5585,7 @@ public abstract class SeaOfGatesEngine
if (nY > limit.getMaxY())
{
nY = limit.getMaxY();
- if (!inDestGrid(toRectGridded, curX,nY)) nY = nr.getLowerYGrid(curZ, nY).getCoordinate();
+ if (!toPE.atGoalPoint(curX,nY)) nY = nr.getLowerYGrid(curZ, nY).getCoordinate();
dy = nY - curY;
if (dy == 0)
{
@@ -4366,7 +5599,7 @@ public abstract class SeaOfGatesEngine
if (nX < nr.routeBounds.getMinX())
{
nX = nr.routeBounds.getMinX();
- if (!inDestGrid(toRectGridded, nX, curY)) nX = nr.getUpperXGrid(curZ, nX).getCoordinate();
+ if (!toPE.atGoalPoint(nX, curY)) nX = nr.getUpperXGrid(curZ, nX).getCoordinate();
dx = nX - curX;
if (dx == 0)
{
@@ -4377,7 +5610,7 @@ public abstract class SeaOfGatesEngine
if (nX > nr.routeBounds.getMaxX())
{
nX = nr.routeBounds.getMaxX();
- if (!inDestGrid(toRectGridded, nX, curY)) nX = nr.getLowerXGrid(curZ, nX).getCoordinate();
+ if (!toPE.atGoalPoint(nX, curY)) nX = nr.getLowerXGrid(curZ, nX).getCoordinate();
dx = nX - curX;
if (dx == 0)
{
@@ -4388,7 +5621,7 @@ public abstract class SeaOfGatesEngine
if (nY < nr.routeBounds.getMinY())
{
nY = nr.routeBounds.getMinY();
- if (!inDestGrid(toRectGridded, curX, nY)) nY = nr.getUpperYGrid(curZ, nY).getCoordinate();
+ if (!toPE.atGoalPoint(curX, nY)) nY = nr.getUpperYGrid(curZ, nY).getCoordinate();
dy = nY - curY;
if (dy == 0)
{
@@ -4399,7 +5632,7 @@ public abstract class SeaOfGatesEngine
if (nY > nr.routeBounds.getMaxY())
{
nY = nr.routeBounds.getMaxY();
- if (!inDestGrid(toRectGridded, curX, nY)) nY = nr.getLowerYGrid(curZ, nY).getCoordinate();
+ if (!toPE.atGoalPoint(curX, nY)) nY = nr.getLowerYGrid(curZ, nY).getCoordinate();
dy = nY - curY;
if (dy == 0)
{
@@ -4421,7 +5654,7 @@ public abstract class SeaOfGatesEngine
// see if the space is available
int whichContact = 0;
- Rectangle2D[] cuts = null;
+ Poly[] cuts = null;
Point2D size = null;
SearchVertexAddon extraGeometryforMinArea = null;
if (dz == 0)
@@ -4455,7 +5688,9 @@ public abstract class SeaOfGatesEngine
} else
break;
}
- SOGBound sb = getMetalBlockageAndNotch(nZ, nC, halfWid, halfHei, checkX, checkY, prevPath, false);
+ StringBuffer reason = null;
+ if (debuggingWavefront) reason = new StringBuffer();
+ SOGBound sb = getMetalBlockageAndNotch(nZ, nC, halfWid, halfHei, checkX, checkY, prevPath, false, reason);
if (sb == null)
{
allClear = true;
@@ -4466,15 +5701,16 @@ public abstract class SeaOfGatesEngine
TextUtils.formatDistance(checkX-halfWid) + "<=X<=" + TextUtils.formatDistance(checkX+halfWid) +
" and " + TextUtils.formatDistance(checkY-halfHei) + "<=Y<=" + TextUtils.formatDistance(checkY+halfHei) +
" is less than " + TextUtils.formatDistance(metalSpacing) +
- " to " + TextUtils.formatDistance(sb.bound.getMinX()) + "<=X<=" + TextUtils.formatDistance(sb.bound.getMaxX()) +
- " and " + TextUtils.formatDistance(sb.bound.getMinY()) + "<=Y<=" + TextUtils.formatDistance(sb.bound.getMaxY());
+ " to " + TextUtils.formatDistance(sb.getBounds().getMinX()) + "<=X<=" + TextUtils.formatDistance(sb.getBounds().getMaxX()) +
+ " and " + TextUtils.formatDistance(sb.getBounds().getMinY()) + "<=Y<=" + TextUtils.formatDistance(sb.getBounds().getMaxY()) +
+ " (" + reason.toString() + " error)";
// see if it can be backed out slightly
if (i == 0)
{
// moved left too far...try a bit to the right
double newNX = nX + GRAINSIZE;
- if (!nr.forceGridArcs[nZ] && inDestGrid(toRectGridded, newNX, curY)) newNX = nr.downToGrainAlways(newNX); else
+ if (!nr.forceGridArcs[nZ] && toPE.atGoalPoint(newNX, curY)) newNX = nr.downToGrainAlways(newNX); else
newNX = nr.getUpperXGrid(curZ, newNX).getCoordinate();
if (newNX >= curX || DBMath.areEquals(newNX, nX)) break;
dx = newNX - curX;
@@ -4483,7 +5719,7 @@ public abstract class SeaOfGatesEngine
{
// moved right too far...try a bit to the left
double newNX = nX - GRAINSIZE;
- if (!nr.forceGridArcs[nZ] && inDestGrid(toRectGridded, newNX, curY)) newNX = nr.upToGrainAlways(newNX); else
+ if (!nr.forceGridArcs[nZ] && toPE.atGoalPoint(newNX, curY)) newNX = nr.upToGrainAlways(newNX); else
newNX = nr.getLowerXGrid(curZ, newNX).getCoordinate();
if (newNX <= curX || DBMath.areEquals(newNX, nX)) break;
dx = newNX - curX;
@@ -4492,7 +5728,7 @@ public abstract class SeaOfGatesEngine
{
// moved down too far...try a bit up
double newNY = nY + GRAINSIZE;
- if (!nr.forceGridArcs[nZ] && inDestGrid(toRectGridded, curX, newNY)) newNY = nr.downToGrainAlways(newNY); else
+ if (!nr.forceGridArcs[nZ] && toPE.atGoalPoint(curX, newNY)) newNY = nr.downToGrainAlways(newNY); else
newNY = nr.getUpperYGrid(curZ, newNY).getCoordinate();
if (newNY >= curY || DBMath.areEquals(newNY, nY)) break;
dy = newNY - curY;
@@ -4501,7 +5737,7 @@ public abstract class SeaOfGatesEngine
{
// moved up too far...try a bit down
double newNY = nY - GRAINSIZE;
- if (!nr.forceGridArcs[nZ] && inDestGrid(toRectGridded, curX, newNY)) newNY = nr.upToGrainAlways(newNY); else
+ if (!nr.forceGridArcs[nZ] && toPE.atGoalPoint(curX, newNY)) newNY = nr.upToGrainAlways(newNY); else
newNY = nr.getLowerYGrid(curZ, newNY).getCoordinate();
if (newNY <= curY || DBMath.areEquals(newNY, nY)) break;
dy = newNY - curY;
@@ -4520,7 +5756,7 @@ public abstract class SeaOfGatesEngine
double halfHei = metalSpacing + Math.abs(dy) / 2;
double[] surround = nr.getSpacingRule(nZ, maxDefArcWidth[nZ], -1);
- SOGBound sb = nr.getMetalBlockage(nr.netID, nZ, halfWid, halfHei, surround, checkX, checkY);
+ SOGBound sb = nr.getMetalBlockage(nr.netID, nZ, nC, halfWid, halfHei, surround, checkX, checkY);
if (sb != null) explanation += ": Blocked"; else
explanation += ": Blocked, Notch";
completeDebugString(i, explanation);
@@ -4585,8 +5821,9 @@ public abstract class SeaOfGatesEngine
lastY = prev.getY();
if (closeToEnd && (lastX != fromX || lastY != fromY))
{
- lastX = toX;
- lastY = toY;
+ EPoint closest = toPE.getClosestPoint(curX, curY);
+ lastX = closest.getX();
+ lastY = closest.getY();
}
}
Orientation orient = nr.getMVSize(mv, nX, nY, lastX, lastY, conWid, conHei);
@@ -4600,7 +5837,7 @@ public abstract class SeaOfGatesEngine
int cutCount = 0;
for (int p = 0; p < conPolys.length; p++)
if (conPolys[p].getLayer().getFunction().isContact()) cutCount++;
- Rectangle2D[] curCuts = new Rectangle2D[cutCount];
+ Poly[] curCuts = new Poly[cutCount];
cutCount = 0;
String failedReason = null;
boolean contactFailed = false;
@@ -4608,94 +5845,50 @@ public abstract class SeaOfGatesEngine
{
Poly conPoly = conPolys[p];
if (trans != null) conPoly.transform(trans);
+ Rectangle2D conRect = conPoly.getBounds2D();
Layer conLayer = conPoly.getLayer();
Layer.Function lFun = conLayer.getFunction();
if (lFun.isMetal())
{
- Rectangle2D conRect = conPoly.getBounds2D();
int metalNo = lFun.getLevel() - 1;
int maskNo = lFun.getMaskColor();
double halfWid = conRect.getWidth() / 2;
double halfHei = conRect.getHeight() / 2;
- SOGBound sb = getMetalBlockageAndNotch(metalNo, maskNo, halfWid, halfHei, conRect.getCenterX(), conRect.getCenterY(), svCurrent, false);
- if (sb != null)
- {
- contactFailed = true;
- if (debuggingWavefront)
- {
- failedReason = "layer " + conLayer.getName() +
- " at " + TextUtils.formatDistance(conRect.getMinX()) + "<=X<=" + TextUtils.formatDistance(conRect.getMaxX()) +
- " and " + TextUtils.formatDistance(conRect.getMinY()) + "<=Y<=" + TextUtils.formatDistance(conRect.getMaxY()) +
- " conflicts with " + TextUtils.formatDistance(sb.getBounds().getMinX()) + "<=X<=" + TextUtils.formatDistance(sb.getBounds().getMaxX()) +
- " and " + TextUtils.formatDistance(sb.getBounds().getMinY()) + "<=Y<=" + TextUtils.formatDistance(sb.getBounds().getMaxY());
- }
- break;
- }
- } else if (lFun.isContact())
- {
- // make sure vias don't get too close
- Rectangle2D conRect = conPoly.getBounds2D();
- double conCX = conRect.getCenterX();
- double conCY = conRect.getCenterY();
- double surround = viaSurround[lowMetal];
- double vSize = viaSize[lowMetal];
- SOGVia sb = NEWVIACALC ? nr.getViaBlockage(nr.netID, conLayer, surround, conRect) :
- nr.getViaBlockageOLD(nr.netID, conLayer, surround+vSize, surround+vSize, conCX, conCY);
+ StringBuffer reason = null;
+ if (debuggingWavefront) reason = new StringBuffer();
+ SOGBound sb = getMetalBlockageAndNotch(metalNo, maskNo, halfWid, halfHei,
+ conRect.getCenterX(), conRect.getCenterY(), svCurrent, false, reason);
if (sb != null)
{
contactFailed = true;
if (debuggingWavefront)
{
- failedReason = "cut " + conLayer.getName() +
+ SizeOffset so = np.getProtoSizeOffset();
+ double xOffset = so.getLowXOffset() + so.getHighXOffset();
+ double yOffset = so.getLowYOffset() + so.getHighYOffset();
+ failedReason = "layer " + conLayer.getName() + " of " +
+ TextUtils.formatDistance(conWid.doubleValue()-xOffset) + "x" + TextUtils.formatDistance(conHei.doubleValue()-yOffset) +
+ " " + np.describe(false) +
" at " + TextUtils.formatDistance(conRect.getMinX()) + "<=X<=" + TextUtils.formatDistance(conRect.getMaxX()) +
" and " + TextUtils.formatDistance(conRect.getMinY()) + "<=Y<=" + TextUtils.formatDistance(conRect.getMaxY()) +
- " less than "+TextUtils.formatDistance(surround)+" to cut at (" +
- TextUtils.formatDistance(sb.getBounds().getCenterX()) + "," + TextUtils.formatDistance(sb.getBounds().getCenterY()) + ")";
+ " on net " + nr.netID + " has " + reason.toString() + " error with " +
+ TextUtils.formatDistance(sb.getBounds().getMinX()) + "<=X<=" + TextUtils.formatDistance(sb.getBounds().getMaxX()) +
+ " and " + TextUtils.formatDistance(sb.getBounds().getMinY()) + "<=Y<=" + TextUtils.formatDistance(sb.getBounds().getMaxY()) +
+ " on net " + sb.getNetID();
}
break;
}
- curCuts[cutCount++] = new Rectangle2D.Double(conRect.getMinX(), conRect.getMinY(), conRect.getWidth(), conRect.getHeight());
-
- // look at all previous cuts in this path
- for (SearchVertex sv = svCurrent; sv != null; sv = sv.last)
+ } else if (lFun.isContact())
+ {
+ // make sure vias don't get too close
+ String error = validCut(svCurrent, lowMetal, highMetal, conRect, conLayer);
+ if (error != null)
{
- SearchVertex lastSv = sv.last;
- if (lastSv == null) break;
- if (Math.min(sv.getZ(), lastSv.getZ()) == lowMetal &&
- Math.max(sv.getZ(), lastSv.getZ()) == highMetal)
- {
- // make sure the cut isn't too close
- Rectangle2D[] svCutRects;
- if (sv.getCutLayer() == lowMetal) svCutRects = sv.getCutRects(); else
- svCutRects = lastSv.getCutRects();
- if (svCutRects != null)
- {
- for (Rectangle2D cutRect : svCutRects)
- {
- double dist = cutDistance(conRect.getMinX(), conRect.getMaxX(), conRect.getMinY(), conRect.getMaxY(),
- cutRect.getMinX(), cutRect.getMaxX(), cutRect.getMinY(), cutRect.getMaxY());
- boolean newSafe = DBMath.isGreaterThanOrEqualTo(dist, surround);
- boolean oldSafe = Math.abs(cutRect.getCenterX() - conCX) >= surround+vSize ||
- Math.abs(cutRect.getCenterY() - conCY) >= surround+vSize;
- if (NEWVIACALC)
- {
- if (newSafe) continue;
- } else
- {
- if (oldSafe) continue;
- }
- contactFailed = true;
- if (debuggingWavefront)
- failedReason = conLayer.getName() + " cut at (" + TextUtils.formatDistance(conCX) + "," +
- TextUtils.formatDistance(conCY) + ") because it is too close (" + surround + ") to previous cut at (" +
- TextUtils.formatDistance(sv.getX()) + "," + TextUtils.formatDistance(sv.getY()) + ")";
- break;
- }
- }
- if (contactFailed) break;
- }
+ if (debuggingWavefront) failedReason = error;
+ contactFailed = true;
+ break;
}
- if (contactFailed) break;
+ curCuts[cutCount++] = conPoly;
}
}
if (contactFailed)
@@ -4707,12 +5900,12 @@ public abstract class SeaOfGatesEngine
// see if previous metal meets minimum area considerations
StringBuffer message = new StringBuffer();
MutableBoolean error = new MutableBoolean(false);
- extraGeometryforMinArea = determineMinimumArea(svCurrent, curX, curY, curC, curZ, mv, conWid.doubleValue(), conHei.doubleValue(), error, message);
+ extraGeometryforMinArea = determineMinimumArea(svCurrent, nX, nY, nC, nZ, curC, curZ, mv,
+ conWid.doubleValue(), conHei.doubleValue(), error, message, false);
if (error.booleanValue())
{
if (message.length() > 0)
{
- contactFailed = true;
if (debuggingWavefront)
failureReasons[contactNo] = message.toString();
}
@@ -4743,7 +5936,7 @@ public abstract class SeaOfGatesEngine
}
// see if it found the destination
- boolean foundDest = DBMath.pointInRect(EPoint.fromLambda(nX, nY), toRect) && nZ == toZ;
+ boolean foundDest = toPE.isToPoint(nX, nY) && nZ == toZ;
if (svCurrent.isMustCompleteRoute() && !foundDest)
{
if (debuggingWavefront) completeDebugString(i, ": Switched to taper layer so must connect to destination");
@@ -4755,22 +5948,22 @@ public abstract class SeaOfGatesEngine
continue;
}
- // check for minimum area in final segment TODO: finish this
-// if (foundDest)
-// {
-// StringBuffer message = new StringBuffer();
-// MutableBoolean error = new MutableBoolean(false);
-// extraGeometryforMinArea = determineMinimumArea(svCurrent, curX, curY, curC, curZ, null, 0, 0, error, message);
-// if (error.booleanValue())
-// {
-// if (message.length() > 0)
-// {
-// if (debuggingWavefront)
-// completeDebugString(i, message.toString());
-// }
-// continue;
-// }
-// }
+ // check for minimum area in final segment
+ if (foundDest)
+ {
+ StringBuffer message = new StringBuffer();
+ MutableBoolean error = new MutableBoolean(false);
+ extraGeometryforMinArea = determineMinimumArea(svCurrent, nX, nY, nC, nZ, curC, curZ, null, 0, 0, error, message, true);
+ if (error.booleanValue())
+ {
+ if (message.length() > 0)
+ {
+ if (debuggingWavefront)
+ completeDebugString(i, ": Blocked because " + message.toString());
+ }
+ continue;
+ }
+ }
// check for off-grid situations
boolean hor = true;
@@ -4799,7 +5992,7 @@ public abstract class SeaOfGatesEngine
// determine if off-grid
boolean penaltyOffGridX = false;
- boolean inGoalX = nX < toRect.getMinX() || nX > toRect.getMaxX();
+ boolean inGoalX = toPE.isOutOfGoalX(nX);
if (NOGRIDPENALTYATSOURCE) inGoalX &= nX != fromX;
if (inGoalX || nr.forceGridArcs[nZ])
{
@@ -4812,7 +6005,7 @@ public abstract class SeaOfGatesEngine
}
}
boolean penaltyOffGridY = false;
- boolean inGoalY = nY < toRect.getMinY() || nY > toRect.getMaxY();
+ boolean inGoalY = toPE.isOutOfGoalY(nY);
if (NOGRIDPENALTYATSOURCE) inGoalY &= nY != fromY;
if (inGoalY || nr.forceGridArcs[nZ])
{
@@ -4831,10 +6024,8 @@ public abstract class SeaOfGatesEngine
if (dz != 0) newFlags |= SearchVertex.OFFINITIALSEGMENT;
if (tooFarFromEnd) newFlags |= SearchVertex.TOOFARFROMEND;
if (closeToEnd) newFlags |= SearchVertex.CLOSETOEND;
- SearchVertex svNext = new SearchVertex(nX, nY, nZ, nC, whichContact, cuts, size, Math.min(curZ, nZ), this, newFlags);
+ SearchVertex svNext = new SearchVertex(nX, nY, nZ, nC, whichContact, cuts, size, Math.min(curZ, nZ), this, newFlags, extraGeometryforMinArea);
if (debuggingWavefront) RoutingDebug.ensureDebuggingShadow(svNext, false);
- if (extraGeometryforMinArea != null)
- svNext.setMoreGeometry(extraGeometryforMinArea);
if (dz == 0 && (Math.abs(dx) >= 2 || Math.abs(dy) >= 2)) svNext.setAutoGen(i);
svNext.last = svCurrent;
@@ -4856,22 +6047,21 @@ public abstract class SeaOfGatesEngine
// compute the cost
int newCost = svCurrent.cost;
String costExplanation = "";
- double distBefore = Math.sqrt((curX-toX)*(curX-toX) + (curY-toY)*(curY-toY));
- double distAfter = Math.sqrt((nX-toX)*(nX-toX) + (nY-toY)*(nY-toY));
+ double distBefore = toPE.getDistToGoal(curX, curY);
+ double distAfter = toPE.getDistToGoal(nX, nY);
int c = (int)((distAfter - distBefore) / 5);
newCost += c;
if (debuggingWavefront) costExplanation = " [COST: Progress-to-target=" + c;
-
if (dx != 0)
{
- if (curX >= toRect.getMinX() && curX <= toRect.getMaxX())
+ if (!toPE.isOutOfGoalX(curX))
{
c = COSTWRONGDIRECTION / 2;
newCost += c;
if (debuggingWavefront) costExplanation += " Zero-X-progress=" + c;
- } else if ((toX - curX) * dx < 0)
+ } else if ((toPE.getCenterX() - curX) * dx < 0)
{
- if (curY >= toRect.getMinY() && curY <= toRect.getMaxY())
+ if (!toPE.isOutOfGoalY(curY))
{
c = 1;
newCost += c;
@@ -4895,14 +6085,14 @@ public abstract class SeaOfGatesEngine
}
if (dy != 0)
{
- if (curY >= toRect.getMinY() && curY <= toRect.getMaxY())
+ if (!toPE.isOutOfGoalY(curY))
{
c = COSTWRONGDIRECTION / 2;
newCost += c;
if (debuggingWavefront) costExplanation += " Zero-Y-progress=" + c;
- } else if ((toY - curY) * dy < 0)
+ } else if ((toPE.getCenterY() - curY) * dy < 0)
{
- if (curX >= toRect.getMinX() && curX <= toRect.getMaxX())
+ if (!toPE.isOutOfGoalX(curX))
{
c = 1;
newCost += c;
@@ -5019,71 +6209,386 @@ public abstract class SeaOfGatesEngine
}
/**
+ * Method to analyze a cut and see if it conflicts with previous cuts in the chain.
+ * @param svCurrent the chain so far.
+ * @param lowMetal the low metal layer of the contact.
+ * @param highMetal the high metal layer of the contact.
+ * @param conRect the rectangle of the contact cut.
+ * @param conLayer the layer of the contact cut.
+ * @return an error message if there is a problem. Null if the contact is valid.
+ */
+ String validCut(SearchVertex svCurrent, int lowMetal, int highMetal, Rectangle2D conRect, Layer conLayer)
+ {
+ double spacingDist = viaSurround[lowMetal];
+ double diagonalViaDist = viaDiagonalDistance[lowMetal];
+ double colorDiffDist = viaColorDiffSpacing[lowMetal];
+ double surround = spacingDist;
+ if (colorDiffDist > surround) surround = colorDiffDist;
+ if (diagonalViaDist*2 > surround) surround = diagonalViaDist*2;
+ double rectLX = conRect.getMinX(), rectHX = conRect.getMaxX();
+ double rectLY = conRect.getMinY(), rectHY = conRect.getMaxY();
+ List<SOGBound> viasInArea = new ArrayList<SOGBound>();
+
+ // gather all close vias in the circuit
+ BlockageTree bTree = rTrees.getViaTree(conLayer);
+ bTree.lock();
+ try {
+ if (bTree.isEmpty()) return null;
+ Rectangle2D searchArea = new Rectangle2D.Double(rectLX-surround-1, rectLY-surround-1,
+ conRect.getWidth()+surround*2+2, conRect.getHeight()+surround*2+2);
+ for (Iterator<SOGBound> sea = bTree.search(searchArea); sea.hasNext();)
+ {
+ SOGVia sLoc = (SOGVia)sea.next();
+ ERectangle rect = sLoc.getBounds();
+ if (sLoc.isSameBasicNet(nr.netID))
+ {
+ if (DBMath.areEquals(rect.getCenterX(), conRect.getCenterX()) &&
+ DBMath.areEquals(rect.getCenterY(), conRect.getCenterY())) continue;
+ }
+ viasInArea.add(sLoc);
+ }
+ } finally {
+ bTree.unlock();
+ }
+
+ // gather all close vias in this path
+ for (SearchVertex sv = svCurrent; sv != null; sv = sv.last)
+ {
+ SearchVertex lastSv = sv.last;
+ if (lastSv == null) break;
+ if (Math.min(sv.getZ(), lastSv.getZ()) == lowMetal && Math.max(sv.getZ(), lastSv.getZ()) == highMetal)
+ {
+ Poly[] svCutPolys;
+ if (sv.getCutLayer() == lowMetal) svCutPolys = sv.getCutPolys(); else
+ svCutPolys = lastSv.getCutPolys();
+ if (svCutPolys != null)
+ {
+ for (Poly cutPoly : svCutPolys)
+ {
+ Rectangle2D rect = cutPoly.getBounds2D();
+ double dist = cutDistance(conRect, rect);
+ if (DBMath.isLessThan(dist, surround))
+ {
+ SOGBound conSB = new SOGBound(ERectangle.fromLambda(rect), null, cutPoly.getLayer().getFunction().getMaskColor());
+ viasInArea.add(conSB);
+ }
+ }
+ }
+ }
+ }
+
+ // stop now if nothing near
+ if (viasInArea.size() == 0) return null;
+
+ // analyze the vias for spacing distance to this one
+ for(SOGBound sb : viasInArea)
+ {
+ double dist = cutDistance(conRect, sb.getBounds());
+ if (DBMath.isLessThan(dist, spacingDist))
+ {
+ return "cut " + conLayer.getName() +
+ " at " + TextUtils.formatDistance(rectLX) + "<=X<=" + TextUtils.formatDistance(rectHX) +
+ " and " + TextUtils.formatDistance(rectLY) + "<=Y<=" + TextUtils.formatDistance(rectHY) +
+ " less than "+TextUtils.formatDistance(spacingDist)+" to cut at (" +
+ TextUtils.formatDistance(sb.getBounds().getCenterX()) + "," + TextUtils.formatDistance(sb.getBounds().getCenterY()) + ")";
+ }
+ if (colorDiffDist > 0)
+ {
+ // different spacing rule if masks are uncolored or differ
+ if (sb.getMaskColor() == 0 || conLayer.getFunction().getMaskColor() == 0 ||
+ sb.getMaskColor() == conLayer.getFunction().getMaskColor())
+ {
+ if (DBMath.isLessThan(dist, colorDiffDist))
+ {
+ return "cut " + conLayer.getName() +
+ " at " + TextUtils.formatDistance(rectLX) + "<=X<=" + TextUtils.formatDistance(rectHX) +
+ " and " + TextUtils.formatDistance(rectLY) + "<=Y<=" + TextUtils.formatDistance(rectHY) +
+ " less than "+TextUtils.formatDistance(colorDiffDist)+" to cut colored " + sb.getMaskColor() + " at (" +
+ TextUtils.formatDistance(sb.getBounds().getCenterX()) + "," + TextUtils.formatDistance(sb.getBounds().getCenterY()) + ")";
+ }
+ }
+ }
+ }
+
+ // see if any secret rules need to be applied
+ SOGBound conSB = new SOGBound(ERectangle.fromLambda(conRect), null, conLayer.getFunction().getMaskColor());
+ viasInArea.add(conSB);
+ Method secretViaRules = secretViaSpacingRules[lowMetal];
+ if (secretViaRules != null)
+ {
+ try
+ {
+ String err = (String)secretViaRules.invoke(null, viasInArea);
+ if (err != null) return err;
+ }
+ catch (InvocationTargetException e) {}
+ catch (IllegalAccessException e) {}
+ }
+
+ // apply diagonal via spacing rules
+ if (diagonalViaDist > 0)
+ {
+ // look for violations among three vias
+ if (viasInArea.size() >= 3)
+ {
+ Rectangle2D[] rects = new Rectangle2D[3];
+ int totVias = viasInArea.size();
+ int totViasM1 = totVias - 1;
+ int totViasM2 = totViasM1 - 1;
+ for(int i=0; i<totViasM2; i++)
+ {
+ Rectangle2D rect1 = viasInArea.get(i).getBounds();
+ for(int j=i+1; j<totViasM1; j++)
+ {
+ Rectangle2D rect2 = viasInArea.get(j).getBounds();
+ for(int k=j+1; k<totVias; k++)
+ {
+ Rectangle2D rect3 = viasInArea.get(k).getBounds();
+
+ // ignore three in a row
+ boolean zigZag = false;
+ rects[0] = rect1; rects[1] = rect2; rects[2] = rect3;
+ Arrays.sort(rects, new SortRectsByCenter(true));
+ if (rects[0].getMaxX() < rects[1].getMinX() && rects[1].getMaxX() < rects[2].getMinX())
+ {
+ // contacts form a line in X, see if they form a line in Y, too
+ if (rects[1].getMaxY() < rects[0].getMinY() && rects[1].getMaxY() < rects[2].getMinY()) zigZag = true; else
+ if (rects[1].getMinY() > rects[0].getMaxY() && rects[1].getMinY() > rects[2].getMaxY()) zigZag = true;
+ }
+ if (!zigZag)
+ {
+ Arrays.sort(rects, new SortRectsByCenter(false));
+ if (rects[0].getMaxY() < rects[1].getMinY() && rects[1].getMaxY() < rects[2].getMinY())
+ {
+ // contacts form a line in Y, see if they form a line in X, too
+ if (rects[1].getMaxX() < rects[0].getMinX() && rects[1].getMaxX() < rects[2].getMinX()) zigZag = true; else
+ if (rects[1].getMinX() > rects[0].getMaxX() && rects[1].getMinX() > rects[2].getMaxX()) zigZag = true;
+ }
+ }
+ if (!zigZag) continue;
+
+ double dist1 = cutDistance(rect1, rect2);
+ double dist2 = cutDistance(rect2, rect3);
+ double dist3 = cutDistance(rect3, rect1);
+ Rectangle2D centerCut = null, cut1 = null, cut2 = null;
+ if (DBMath.isLessThan(dist1, diagonalViaDist) && DBMath.isLessThan(dist2, diagonalViaDist)) { centerCut = rect2; cut1 = rect1; cut2 = rect3; }
+ if (DBMath.isLessThan(dist2, diagonalViaDist) && DBMath.isLessThan(dist3, diagonalViaDist)) { centerCut = rect3; cut1 = rect1; cut2 = rect2; }
+ if (DBMath.isLessThan(dist1, diagonalViaDist) && DBMath.isLessThan(dist3, diagonalViaDist)) { centerCut = rect1; cut1 = rect2; cut2 = rect3; }
+ if (centerCut != null)
+ {
+ String msg = "cut " + conLayer.getName() +
+ " at " + TextUtils.formatDistance(centerCut.getMinX()) + "<=X<=" + TextUtils.formatDistance(centerCut.getMaxX()) +
+ " and " + TextUtils.formatDistance(centerCut.getMinY()) + "<=Y<=" + TextUtils.formatDistance(centerCut.getMaxY()) +
+ " is less than " + TextUtils.formatDistance(diagonalViaDist) + " from cuts at (" +
+ TextUtils.formatDistance(cut1.getCenterX()) + "," + TextUtils.formatDistance(cut1.getCenterY()) +
+ ") and (" + TextUtils.formatDistance(cut2.getCenterX()) + "," + TextUtils.formatDistance(cut2.getCenterY()) + ")";
+ return msg;
+ }
+ }
+ }
+ }
+ }
+
+ // look for violations among four vias
+ if (viasInArea.size() >= 4)
+ {
+ Rectangle2D[] rects = new Rectangle2D[4];
+ int totVias = viasInArea.size();
+ int totViasM1 = totVias - 1;
+ int totViasM2 = totViasM1 - 1;
+ int totViasM3 = totViasM2 - 1;
+ for(int i=0; i<totViasM3; i++)
+ {
+ Rectangle2D rect1 = viasInArea.get(i).getBounds();
+ for(int j=i+1; j<totViasM2; j++)
+ {
+ Rectangle2D rect2 = viasInArea.get(j).getBounds();
+ for(int k=j+1; k<totViasM1; k++)
+ {
+ Rectangle2D rect3 = viasInArea.get(k).getBounds();
+ for(int l=k+1; l<totVias; l++)
+ {
+ Rectangle2D rect4 = viasInArea.get(l).getBounds();
+
+ boolean inALine = false;
+ rects[0] = rect1; rects[1] = rect2; rects[2] = rect3; rects[3] = rect4;
+ Arrays.sort(rects, new SortRectsByCenter(true));
+ if (rects[0].getMaxX() < rects[1].getMinX() && rects[1].getMaxX() < rects[2].getMinX() && rects[2].getMaxX() < rects[3].getMinX())
+ {
+ // contacts form a line in X, see if they form a line in Y, too
+ if (rects[0].getCenterY() < rects[1].getCenterY() &&
+ rects[1].getCenterY() < rects[2].getCenterY() &&
+ rects[2].getCenterY() < rects[3].getCenterY())
+ {
+ inALine = true;
+ } else if (rects[3].getCenterY() < rects[2].getCenterY() &&
+ rects[2].getCenterY() < rects[1].getCenterY() &&
+ rects[1].getCenterY() < rects[0].getCenterY())
+ {
+ inALine = true;
+ }
+ }
+
+ if (!inALine)
+ {
+ Arrays.sort(rects, new SortRectsByCenter(false));
+ if (rects[0].getMaxY() < rects[1].getMinY() && rects[1].getMaxY() < rects[2].getMinY() && rects[2].getMaxY() < rects[3].getMinY())
+ {
+ // contacts form a line in Y, see if they form a line in X, too
+ if (rects[0].getCenterX() < rects[1].getCenterX() &&
+ rects[1].getCenterX() < rects[2].getCenterX() &&
+ rects[2].getCenterX() < rects[3].getCenterX())
+ {
+ inALine = true;
+ } else if (rects[3].getCenterX() < rects[2].getCenterX() &&
+ rects[2].getCenterX() < rects[1].getCenterX() &&
+ rects[1].getCenterX() < rects[0].getCenterX())
+ {
+ inALine = true;
+ }
+ }
+ }
+ if (inALine)
+ {
+ if (DBMath.isGreaterThanOrEqualTo(cutDistance(rects[0], rects[1]), diagonalViaDist)) continue;
+ if (DBMath.isGreaterThanOrEqualTo(cutDistance(rects[1], rects[2]), diagonalViaDist)) continue;
+ if (DBMath.isGreaterThanOrEqualTo(cutDistance(rects[2], rects[3]), diagonalViaDist)) continue;
+ String msg = "cut " + conLayer.getName() +
+ " at " + TextUtils.formatDistance(conRect.getMinX()) + "<=X<=" + TextUtils.formatDistance(conRect.getMaxX()) +
+ " and " + TextUtils.formatDistance(conRect.getMinY()) + "<=Y<=" + TextUtils.formatDistance(conRect.getMaxY()) +
+ " forms 4-in-a-row line spaced " + TextUtils.formatDistance(diagonalViaDist) + " or less among cuts at (" +
+ TextUtils.formatDistance(rects[0].getCenterX()) + "," + TextUtils.formatDistance(rects[0].getCenterY()) +
+ ") and (" + TextUtils.formatDistance(rects[1].getCenterX()) + "," + TextUtils.formatDistance(rects[1].getCenterY()) +
+ ") and (" + TextUtils.formatDistance(rects[2].getCenterX()) + "," + TextUtils.formatDistance(rects[2].getCenterY()) +
+ ") and (" + TextUtils.formatDistance(rects[3].getCenterX()) + "," + TextUtils.formatDistance(rects[3].getCenterY()) + ")";
+ return msg;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // via is good
+ return null;
+ }
+
+ /**
+ * Comparator class for sorting Rectangles by their X or Y coordinate.
+ */
+ private class SortRectsByCenter implements Comparator<Rectangle2D>
+ {
+ private boolean doX;
+ public SortRectsByCenter(boolean doX) { this.doX = doX; }
+
+ public int compare(Rectangle2D r1, Rectangle2D r2)
+ {
+ double v1, v2;
+ if (doX)
+ {
+ v1 = r1.getCenterX();
+ v2 = r2.getCenterX();
+ } else
+ {
+ v1 = r1.getCenterY();
+ v2 = r2.getCenterY();
+ }
+ if (v1 < v2) return -1;
+ if (v1 > v2) return 1;
+ return 0;
+ }
+ }
+
+ /**
* Method to determine extra geometry needed to ensure minimum area is met
* @param svCurrent the current SearchVertex that is changing layers (or ending a route).
* @param curX the X coordinate of the SearchVertex.
* @param curY the Y coordinate of the SearchVertex.
* @param curC the mask color of the SearchVertex.
* @param curZ the metal layer of the SearchVertex.
+ * @param metNum the metal layer to consider for minimum area computation.
+ * @param metCol the color of the metal layer being considered for minimum area computation
* @param mv the contact being placed at this SearchVertex (may be null).
* @param conWid the width of the contact being placed.
* @param conHei the height of the contact being placed.
* @param error set to true if the geometry is needed but cannot be placed.
* @param message set to an error message which explains the problem.
+ * @param finalDest true if this is at the destination of the route.
* @return a SearchVertexAddon structure (null if no additional geometry is needed or there is an error).
*/
- private SearchVertexAddon determineMinimumArea(SearchVertex svCurrent, double curX, double curY, int curC, int curZ, MetalVia mv, double conWid, double conHei, MutableBoolean error, StringBuffer message)
+ private SearchVertexAddon determineMinimumArea(SearchVertex svCurrent, double curX, double curY, int curC, int curZ, int metCol, int metNum, MetalVia mv,
+ double conWid, double conHei, MutableBoolean error, StringBuffer message, boolean finalDest)
{
- if (MINAREACHECK && minimumArea[curZ] > 0)
+ // stop now if not checking min-area for this metal
+ if (minimumArea[metNum] <= 0) return null;
+
+ // first compute rectangle in current contact
+ List<SearchVertexAddon> possibleCorrections = getExtraGeometryForMinArea(svCurrent, mv, conWid, conHei, curX, curY, curZ, metNum, metCol, finalDest);
+ if (possibleCorrections == null) return null;
+ boolean rbError = false, anyError = false;
+ for(SearchVertexAddon sva : possibleCorrections)
{
- // first compute rectangle in current contact
- Rectangle2D conRect = getExtraGeometryForMinArea(svCurrent, mv, conWid, conHei, curX, curY, curZ);
- if (conRect != null)
+ Rectangle2D[] addedGeoms = sva.getGeometry();
+
+ // see if it is outside of routing bounds
+ if (routingBoundsLimit != null)
{
- // see if it is outside of routing bounds
- if (routingBoundsLimit != null)
+ boolean failed = false;
+ for(int i=0; i<addedGeoms.length; i++)
{
- if (conRect.getMinX() < routingBoundsLimit.getMinX() || conRect.getMaxX() > routingBoundsLimit.getMaxX() ||
- conRect.getMinY() < routingBoundsLimit.getMinY() || conRect.getMaxY() > routingBoundsLimit.getMaxY())
+ Rectangle2D rect = addedGeoms[i];
+ if (rect.getMinX() < routingBoundsLimit.getMinX() || rect.getMaxX() > routingBoundsLimit.getMaxX() ||
+ rect.getMinY() < routingBoundsLimit.getMinY() || rect.getMaxY() > routingBoundsLimit.getMaxY())
{
- error.setValue(true);
if (debuggingWavefront)
{
- message.append("extra piece of layer " + primaryMetalLayer[curZ].getName() + " for minimum area" +
- " at " + TextUtils.formatDistance(conRect.getMinX()) + "<=X<=" + TextUtils.formatDistance(conRect.getMaxX()) +
- " and " + TextUtils.formatDistance(conRect.getMinY()) + "<=Y<=" + TextUtils.formatDistance(conRect.getMaxY()) +
- " is outside of routing bounds " + TextUtils.formatDistance(routingBoundsLimit.getMinX()) + "<=X<=" + TextUtils.formatDistance(routingBoundsLimit.getMaxX()) +
- " and " + TextUtils.formatDistance(routingBoundsLimit.getMinY()) + "<=Y<=" + TextUtils.formatDistance(routingBoundsLimit.getMaxY()));
+ if (anyError) message.append(", "); else
+ message.append("problem with extra piece of layer " + primaryMetalLayer[metNum].getName() + " for minimum area:");
+ message.append(" is outside of routing bounds at " + TextUtils.formatDistance(rect.getMinX()) + "<=X<=" + TextUtils.formatDistance(rect.getMaxX()) +
+ " and " + TextUtils.formatDistance(rect.getMinY()) + "<=Y<=" + TextUtils.formatDistance(rect.getMaxY()));
+ if (!rbError) message.append(" (routing bounds is " + TextUtils.formatDistance(routingBoundsLimit.getMinX()) + "<=X<=" + TextUtils.formatDistance(routingBoundsLimit.getMaxX()) +
+ " and " + TextUtils.formatDistance(routingBoundsLimit.getMinY()) + "<=Y<=" + TextUtils.formatDistance(routingBoundsLimit.getMaxY()) + ")");
}
- return null;
+ failed = anyError = rbError = true;
+ break;
}
}
+ if (failed) continue;
+ }
- // see if it creates a design-rule violation
- double halfWid = conRect.getWidth() / 2;
- double halfHei = conRect.getHeight() / 2;
- SOGBound sb = getMetalBlockageAndNotch(curZ, curC, halfWid, halfHei, conRect.getCenterX(), conRect.getCenterY(), svCurrent, true);
+ // see if it creates a design-rule violation
+ boolean failed = false;
+ for(int i=0; i<addedGeoms.length; i++)
+ {
+ Rectangle2D rect = addedGeoms[i];
+ double halfWid = rect.getWidth() / 2;
+ double halfHei = rect.getHeight() / 2;
+ StringBuffer reason = null;
+ if (debuggingWavefront) reason = new StringBuffer();
+ SOGBound sb = getMetalBlockageAndNotch(metNum, metCol, halfWid, halfHei, rect.getCenterX(), rect.getCenterY(), svCurrent, true, reason);
if (sb != null)
{
- error.setValue(true);
if (debuggingWavefront)
{
- message.append("extra piece of layer " + primaryMetalLayer[curZ].getName() + " for minimum area" +
- " at " + TextUtils.formatDistance(conRect.getMinX()) + "<=X<=" + TextUtils.formatDistance(conRect.getMaxX()) +
- " and " + TextUtils.formatDistance(conRect.getMinY()) + "<=Y<=" + TextUtils.formatDistance(conRect.getMaxY()) +
- " conflicts with " + TextUtils.formatDistance(sb.getBounds().getMinX()) + "<=X<=" + TextUtils.formatDistance(sb.getBounds().getMaxX()) +
+ if (anyError) message.append(", "); else
+ message.append("problem with extra piece of layer " + primaryMetalLayer[metNum].getName() + " for minimum area:");
+ message.append(" rect " + TextUtils.formatDistance(rect.getMinX()) + "<=X<=" + TextUtils.formatDistance(rect.getMaxX()) +
+ " and " + TextUtils.formatDistance(rect.getMinY()) + "<=Y<=" + TextUtils.formatDistance(rect.getMaxY()) +
+ " has " + reason.toString() + " error with " +
+ TextUtils.formatDistance(sb.getBounds().getMinX()) + "<=X<=" + TextUtils.formatDistance(sb.getBounds().getMaxX()) +
" and " + TextUtils.formatDistance(sb.getBounds().getMinY()) + "<=Y<=" + TextUtils.formatDistance(sb.getBounds().getMaxY()));
}
- return null;
+ failed = anyError = true;
+ break;
}
-
- // extra geometry is valid
- int c = curC;
- if (c > 0) c--;
- PrimitiveNode pNp = metalPureLayerNodes[curZ][c];
- return new SearchVertexAddon(conRect, pNp);
}
+ if (failed) continue;
+
+ // this correction is valid
+ return sva;
}
+ if (anyError) error.setValue(true);
return null;
}
@@ -5094,13 +6599,45 @@ public abstract class SeaOfGatesEngine
* @param curX the X coordinate of the contact.
* @param curY the Y coordinate of the contact.
* @param curZ the Metal layer being considered for minimum area.
+ * @param metNum the metal layer to consider for minimum area computation.
+ * @param finalDest true if this is the end of the route.
* @return a Rectangle2D with extra geometry on that layer (if the minimum area has not been met).
* Returns null if the minimum area has been met.
*/
- private Rectangle2D getExtraGeometryForMinArea(SearchVertex svCurrent, MetalVia mv, double wid, double hei, double curX, double curY, int curZ)
+ private List<SearchVertexAddon> getExtraGeometryForMinArea(SearchVertex svCurrent, MetalVia mv, double wid, double hei, double curX, double curY, int curZ,
+ int metNum, int metCol, boolean finalDest)
{
// look for SearchVertex with a layer change
getOptimizedList(svCurrent, optimizedList);
+ if (finalDest)
+ {
+ SearchVertex svInsert = new SearchVertex(curX, curY, curZ, 0, 0, null, null, 0, this, 0, null);
+ optimizedList.add(0, svInsert);
+ }
+ PossibleEndpoint added = aToB ? nr.replaceA : nr.replaceB;
+ if (added != null)
+ {
+ MetalVia realMV = added.viaToPlace;
+ int newMetal = optimizedList.get(optimizedList.size()-1).getZ() == realMV.horMetal ? realMV.verMetal : realMV.horMetal;
+ Point2D size = new Point2D.Double(realMV.via.getDefWidth(ep), realMV.via.getDefHeight(ep));
+ optimizedList.get(optimizedList.size()-1).size = size;
+ SearchVertex svInsert = new SearchVertex(fromX, fromY, newMetal, 0, 0, null, size, 0, this, 0, null);
+ optimizedList.add(svInsert);
+ }
+ if (finalDest)
+ {
+ PossibleEndpoint addedFinal = aToB ? nr.replaceA : nr.replaceB;
+ if (addedFinal != null)
+ {
+ MetalVia realMV = addedFinal.viaToPlace;
+ int newMetal = optimizedList.get(0).getZ() == realMV.horMetal ? realMV.verMetal : realMV.horMetal;
+ Point2D size = new Point2D.Double(realMV.via.getDefWidth(ep), realMV.via.getDefHeight(ep));
+ optimizedList.get(0).size = size;
+ SearchVertex svInsert = new SearchVertex(toPE.getCenterX(), toPE.getCenterY(), newMetal, 0, 0, null, size, 0, this, 0, null);
+ optimizedList.add(0, svInsert);
+ }
+ }
+
int lastInd = optimizedList.size() - 1;
int prevViaMet = 0;
for (int ind = 1; ind < optimizedList.size(); ind++)
@@ -5117,7 +6654,7 @@ public abstract class SeaOfGatesEngine
SearchVertex svLast = optimizedList.get(lastInd);
// compute rectangle of metal arc on this layer
- double width = nr.getArcWidth(curZ, curX, curY, svLast.getX(), svLast.getY());
+ double width = nr.getArcWidth(metNum, curX, curY, svLast.getX(), svLast.getY());
Point2D head = new Point2D.Double(curX, curY);
Point2D tail = new Point2D.Double(svLast.getX(), svLast.getY());
int ang = 0;
@@ -5130,7 +6667,7 @@ public abstract class SeaOfGatesEngine
// compute rectangle in current contact (if there is one)
Rectangle2D bound;
if (mv == null) bound = boundArc; else
- bound = getContactGeometry(mv, wid, hei, curX, curY, curZ);
+ bound = getContactGeometry(mv, wid, hei, curX, curY, metNum);
// compute rectangle in previous contact (if there is one)
Rectangle2D boundPrev;
@@ -5145,116 +6682,179 @@ public abstract class SeaOfGatesEngine
if (nps2X.size() > 0) npsPrev = nps2X;
}
MetalVia mvPrev = npsPrev.get(svLast.getContactNo());
- boundPrev = getContactGeometry(mvPrev, svLast.size.getX(), svLast.size.getY(), svLast.getX(), svLast.getY(), curZ);
+ boundPrev = getContactGeometry(mvPrev, svLast.size.getX(), svLast.size.getY(), svLast.getX(), svLast.getY(), metNum);
+ if (boundPrev == null) boundPrev = bound;
}
// if any of the parts is big enough, no need to look further
- if (bound != null && bound.getWidth() * bound.getHeight() >= minimumArea[curZ]) return null;
- if (boundPrev != null && boundPrev.getWidth() * boundPrev.getHeight() >= minimumArea[curZ]) return null;
- if (boundArc != null && boundArc.getWidth() * boundArc.getHeight() >= minimumArea[curZ]) return null;
+ if (bound != null && bound.getWidth() * bound.getHeight() >= minimumArea[metNum]) return null;
+ if (boundPrev != null && boundPrev.getWidth() * boundPrev.getHeight() >= minimumArea[metNum]) return null;
+ if (boundArc != null && boundArc.getWidth() * boundArc.getHeight() >= minimumArea[metNum]) return null;
+
+ // prepare for min-area corrections
+ int c = metCol;
+ if (c > 0) c--;
+ PrimitiveNode pNp = metalPureLayerNodes[metNum][c];
+ List<SearchVertexAddon> possibleCorrections = new ArrayList<SearchVertexAddon>();
// determine extra geometry needed to satisfy minimum area
- Boolean hor = null;
- if (bound.equals(boundArc) && boundPrev.equals(boundArc))
+ boolean metHor = true;
+ if (sogp.isHorizontalEven())
{
- if (boundArc.getWidth() > boundArc.getHeight()) hor = Boolean.TRUE; else
- hor = Boolean.FALSE;
+ if ((metNum%2) == 0) metHor = false;
} else
{
- if (bound.getMinX() == boundPrev.getMinX() && bound.getMinX() == boundArc.getMinX() &&
- bound.getMaxX() == boundPrev.getMaxX() && bound.getMaxX() == boundArc.getMaxX()) hor = Boolean.FALSE;
- if (bound.getMinY() == boundPrev.getMinY() && bound.getMinY() == boundArc.getMinY() &&
- bound.getMaxY() == boundPrev.getMaxY() && bound.getMaxY() == boundArc.getMaxY()) hor = Boolean.TRUE;
+ if ((metNum%2) != 0) metHor = false;
}
- if (hor != null)
+ Boolean hor = null;
+ if (sogp.isForceHorVer()) hor = Boolean.valueOf(metHor); else
{
- // simple computation if all in a line
- if (!hor.booleanValue())
+ if (bound.equals(boundArc) && boundPrev.equals(boundArc))
{
- // geometry runs vertically: easy computation of the area
- double lY = Math.min(bound.getMinY(), Math.min(boundPrev.getMinY(), boundArc.getMinY()));
- double hY = Math.max(bound.getMaxY(), Math.max(boundPrev.getMaxY(), boundArc.getMaxY()));
- double area = (hY - lY) * (bound.getMaxX() - bound.getMinX());
- if (DBMath.isLessThan(area, minimumArea[curZ]))
+ if (boundArc.getWidth() > boundArc.getHeight()) hor = Boolean.TRUE; else
+ if (boundArc.getWidth() < boundArc.getHeight()) hor = Boolean.FALSE; else
+ hor = Boolean.valueOf(metHor);
+ } else
+ {
+ if (bound.getMinX() == boundPrev.getMinX() && bound.getMinX() == boundArc.getMinX() &&
+ bound.getMaxX() == boundPrev.getMaxX() && bound.getMaxX() == boundArc.getMaxX()) hor = Boolean.FALSE;
+ if (bound.getMinY() == boundPrev.getMinY() && bound.getMinY() == boundArc.getMinY() &&
+ bound.getMaxY() == boundPrev.getMaxY() && bound.getMaxY() == boundArc.getMaxY())
{
- // compute where extra geometry will go
- double extraLength = (minimumArea[curZ] - area) / (bound.getMaxX() - bound.getMinX());
- extraLength = Math.ceil(extraLength / minResolution) * minResolution;
- if (bound.getCenterY() > boundPrev.getCenterY())
- return new Rectangle2D.Double(bound.getMinX(), hY, bound.getWidth(), extraLength);
- return new Rectangle2D.Double(bound.getMinX(), lY-extraLength, bound.getWidth(), extraLength);
+ if (hor == null) hor = Boolean.TRUE; else
+ hor = Boolean.valueOf(metHor);
}
- } else if (hor.booleanValue())
+ }
+ }
+ if (hor != null)
+ {
+ // simple computation if all in a line
+ if (hor.booleanValue())
{
- // geometry runs horizontally: easy computation of the area
+ // geometry runs horizontally
double lX = Math.min(bound.getMinX(), Math.min(boundPrev.getMinX(), boundArc.getMinX()));
double hX = Math.max(bound.getMaxX(), Math.max(boundPrev.getMaxX(), boundArc.getMaxX()));
double area = (hX - lX) * (bound.getMaxY() - bound.getMinY());
- if (DBMath.isLessThan(area, minimumArea[curZ]))
+ if (DBMath.isLessThan(area, minimumArea[metNum]))
{
// compute where extra geometry will go
- double extraLength = (minimumArea[curZ] - area) / (bound.getMaxY() - bound.getMinY());
- extraLength = Math.ceil(extraLength / minResolution) * minResolution;
+ double extraLength = (minimumArea[metNum] - area) / (bound.getMaxY() - bound.getMinY());
+ double extraLengthGrid = Math.ceil(extraLength / minResolution) * minResolution;
+ double extraLengthHalfGrid = Math.ceil(extraLength / 2 / minResolution) * minResolution;
+
+ // try a half-size piece on both sides
+ Rectangle2D solution1 = new Rectangle2D.Double(hX, bound.getMinY(), extraLengthHalfGrid, bound.getHeight());
+ Rectangle2D solution2 = new Rectangle2D.Double(lX-extraLengthHalfGrid, bound.getMinY(), extraLengthHalfGrid, bound.getHeight());
+ possibleCorrections.add(new SearchVertexAddon(solution1, solution2, pNp));
+
+ // try full-size pieces to one side or the other
+ solution1 = new Rectangle2D.Double(hX, bound.getMinY(), extraLengthGrid, bound.getHeight());
+ solution2 = new Rectangle2D.Double(lX-extraLengthGrid, bound.getMinY(), extraLengthGrid, bound.getHeight());
if (bound.getCenterX() > boundPrev.getCenterX())
- return new Rectangle2D.Double(hX, bound.getMinY(), extraLength, bound.getHeight());
- return new Rectangle2D.Double(lX-extraLength, bound.getMinY(), extraLength, bound.getHeight());
+ {
+ possibleCorrections.add(new SearchVertexAddon(solution1, null, pNp));
+ possibleCorrections.add(new SearchVertexAddon(solution2, null, pNp));
+ } else
+ {
+ possibleCorrections.add(new SearchVertexAddon(solution2, null, pNp));
+ possibleCorrections.add(new SearchVertexAddon(solution1, null, pNp));
+ }
+ }
+ } else
+ {
+ // geometry runs vertically
+ double lY = Math.min(bound.getMinY(), Math.min(boundPrev.getMinY(), boundArc.getMinY()));
+ double hY = Math.max(bound.getMaxY(), Math.max(boundPrev.getMaxY(), boundArc.getMaxY()));
+ double area = (hY - lY) * (bound.getMaxX() - bound.getMinX());
+ if (DBMath.isLessThan(area, minimumArea[metNum]))
+ {
+ // compute where extra geometry will go
+ double extraLength = (minimumArea[metNum] - area) / (bound.getMaxX() - bound.getMinX());
+ double extraLengthGrid = Math.ceil(extraLength / minResolution) * minResolution;
+ double extraLengthHalfGrid = Math.ceil(extraLength / 2 / minResolution) * minResolution;
+
+ // try a half-size piece on both sides
+ Rectangle2D solution1 = new Rectangle2D.Double(bound.getMinX(), hY, bound.getWidth(), extraLengthHalfGrid);
+ Rectangle2D solution2 = new Rectangle2D.Double(bound.getMinX(), lY-extraLengthHalfGrid, bound.getWidth(), extraLengthHalfGrid);
+ possibleCorrections.add(new SearchVertexAddon(solution1, solution2, pNp));
+
+ // try full-size pieces to one side or the other
+ solution1 = new Rectangle2D.Double(bound.getMinX(), hY, bound.getWidth(), extraLengthGrid);
+ solution2 = new Rectangle2D.Double(bound.getMinX(), lY-extraLengthGrid, bound.getWidth(), extraLengthGrid);
+ if (bound.getCenterY() > boundPrev.getCenterY())
+ {
+ possibleCorrections.add(new SearchVertexAddon(solution1, null, pNp));
+ possibleCorrections.add(new SearchVertexAddon(solution2, null, pNp));
+ } else
+ {
+ possibleCorrections.add(new SearchVertexAddon(solution2, null, pNp));
+ possibleCorrections.add(new SearchVertexAddon(solution1, null, pNp));
+ }
}
}
} else
{
// more complex area computation
PolyMerge pm = new PolyMerge();
- Layer layer = primaryMetalLayer[curZ];
+ Layer layer = primaryMetalLayer[metNum];
pm.addPolygon(layer, new PolyBase(bound));
pm.addPolygon(layer, new PolyBase(boundPrev));
pm.addPolygon(layer, new PolyBase(boundArc));
double area = pm.getAreaOfLayer(layer);
- if (DBMath.isLessThan(area, minimumArea[curZ]))
+ if (DBMath.isLessThan(area, minimumArea[metNum]))
{
if (bound.getCenterX() == boundPrev.getCenterX() && bound.getCenterY() != boundPrev.getCenterY())
{
// geometry runs vertically
double lY = Math.min(bound.getMinY(), Math.min(boundPrev.getMinY(), boundArc.getMinY()));
double hY = Math.max(bound.getMaxY(), Math.max(boundPrev.getMaxY(), boundArc.getMaxY()));
- double extraLength = (minimumArea[curZ] - area) / (bound.getMaxX() - bound.getMinX());
+ double extraLength = (minimumArea[metNum] - area) / (bound.getMaxX() - bound.getMinX());
extraLength = Math.ceil(extraLength / minResolution) * minResolution;
+ Rectangle2D solution;
if (bound.getCenterY() > boundPrev.getCenterY())
- return new Rectangle2D.Double(bound.getMinX(), hY, bound.getWidth(), extraLength);
- return new Rectangle2D.Double(bound.getMinX(), lY-extraLength, bound.getWidth(), extraLength);
+ solution = new Rectangle2D.Double(bound.getMinX(), hY, bound.getWidth(), extraLength); else
+ solution = new Rectangle2D.Double(bound.getMinX(), lY-extraLength, bound.getWidth(), extraLength);
+ possibleCorrections.add(new SearchVertexAddon(solution, null, pNp));
} else if (bound.getCenterX() != boundPrev.getCenterX() && bound.getCenterY() == boundPrev.getCenterY())
{
// geometry runs horizontally
double lX = Math.min(bound.getMinX(), Math.min(boundPrev.getMinX(), boundArc.getMinX()));
double hX = Math.max(bound.getMaxX(), Math.max(boundPrev.getMaxX(), boundArc.getMaxX()));
- double extraLength = (minimumArea[curZ] - area) / (bound.getMaxY() - bound.getMinY());
+ double extraLength = (minimumArea[metNum] - area) / (bound.getMaxY() - bound.getMinY());
extraLength = Math.ceil(extraLength / minResolution) * minResolution;
+ Rectangle2D solution;
if (bound.getCenterX() > boundPrev.getCenterX())
- return new Rectangle2D.Double(hX, bound.getMinY(), extraLength, bound.getHeight());
- return new Rectangle2D.Double(lX-extraLength, bound.getMinY(), extraLength, bound.getHeight());
+ solution = new Rectangle2D.Double(hX, bound.getMinY(), extraLength, bound.getHeight()); else
+ solution = new Rectangle2D.Double(lX-extraLength, bound.getMinY(), extraLength, bound.getHeight());
+ possibleCorrections.add(new SearchVertexAddon(solution, null, pNp));
} else
{
// contacts are not in a line, more advanced computation
if (bound.getWidth() > bound.getHeight())
{
// layer runs horizontally
- double extraLength = (minimumArea[curZ] - area) / (bound.getMaxY() - bound.getMinY());
+ double extraLength = (minimumArea[metNum] - area) / (bound.getMaxY() - bound.getMinY());
extraLength = Math.ceil(extraLength / minResolution) * minResolution;
+ Rectangle2D solution;
if (bound.getCenterX() > boundPrev.getCenterX())
- return new Rectangle2D.Double(bound.getMaxX(), bound.getMinY(), extraLength, bound.getHeight());
- return new Rectangle2D.Double(bound.getMinX()-extraLength, bound.getMinY(), extraLength, bound.getHeight());
+ solution = new Rectangle2D.Double(bound.getMaxX(), bound.getMinY(), extraLength, bound.getHeight()); else
+ solution = new Rectangle2D.Double(bound.getMinX()-extraLength, bound.getMinY(), extraLength, bound.getHeight());
+ possibleCorrections.add(new SearchVertexAddon(solution, null, pNp));
} else
{
// layer runs vertically
- double extraLength = (minimumArea[curZ] - area) / (bound.getMaxX() - bound.getMinX());
+ double extraLength = (minimumArea[metNum] - area) / (bound.getMaxX() - bound.getMinX());
extraLength = Math.ceil(extraLength / minResolution) * minResolution;
+ Rectangle2D solution;
if (bound.getCenterY() > boundPrev.getCenterY())
- return new Rectangle2D.Double(bound.getMinX(), bound.getMaxY(), bound.getWidth(), extraLength);
- return new Rectangle2D.Double(bound.getMinX(), bound.getMinY()-extraLength, bound.getWidth(), extraLength);
+ solution = new Rectangle2D.Double(bound.getMinX(), bound.getMaxY(), bound.getWidth(), extraLength); else
+ solution = new Rectangle2D.Double(bound.getMinX(), bound.getMinY()-extraLength, bound.getWidth(), extraLength);
+ possibleCorrections.add(new SearchVertexAddon(solution, null, pNp));
}
}
}
}
- return null;
+ return possibleCorrections;
}
/**
@@ -5321,11 +6921,42 @@ public abstract class SeaOfGatesEngine
*/
public void createRoute()
{
+ if (toPE != null && toPE.hasEndpoints())
+ {
+ // find the endpoint that was used
+ SearchVertex finalSV = optimizedList.get(0);
+ PossibleEndpoint replace = aToB ? nr.replaceB : nr.replaceA;
+ if (replace.coord.getX() == finalSV.getX() && replace.coord.getY() == finalSV.getY())
+ {
+ optimizedList.remove(0);
+ finalSV = optimizedList.get(0);
+ vertices.remove(0);
+ }
+ for(PossibleEndpoint pe : toPE.choices)
+ {
+ if (pe.coord.getX() == finalSV.getX() && pe.coord.getY() == finalSV.getY())
+ {
+ if (aToB)
+ {
+ nr.replaceB = pe;
+ nr.bEndpoints.setCenterX(finalSV.getX());
+ nr.bEndpoints.setCenterY(finalSV.getY());
+ } else
+ {
+ nr.replaceA = pe;
+ nr.aEndpoints.setCenterX(finalSV.getX());
+ nr.aEndpoints.setCenterY(finalSV.getY());
+ }
+ break;
+ }
+ }
+ }
String routeName = nr.routeName;
if (routeName.endsWith("...")) routeName = routeName.substring(0, routeName.length()-3);
int parenPos = routeName.lastIndexOf('(');
if (parenPos > 0) routeName = routeName.substring(0, parenPos);
-
+ String origRouteName = routeName;
+
RouteNode fromRN = new RouteNode(from);
RouteNode toRN = new RouteNode(to);
RouteResolution resolution = nr.batch.resolution;
@@ -5333,9 +6964,19 @@ public abstract class SeaOfGatesEngine
// if endpoints were on forbidden metal layers but quick changes were allowed, insert them now
if (nr.replaceA != null)
{
- PrimitiveNode pNp = nr.replaceA.via;
- Orientation orient = Orientation.fromJava(nr.replaceA.orientation * 10, false, false);
- RouteNode newRN = new RouteNode(pNp, SeaOfGatesEngine.this, EPoint.fromLambda(nr.aX, nr.aY),
+ EPoint ctr = nr.bPi.getCenter();
+ String msg = "Route '" + origRouteName + "' at (" + TextUtils.formatDistance(ctr.getX()) + "," +
+ TextUtils.formatDistance(ctr.getY()) + ") from port " + nr.aPi.getPortProto().getName() + " on node " +
+ describe(nr.aPi.getNodeInst()) + " is disallowed on Metal " + (nr.replaceAZ+1) + " so inserting " +
+ nr.replaceA.viaToPlace.via.describe(false);
+ if (!DBMath.areEquals(ctr.getX(), nr.replaceA.coord.getX()) || !DBMath.areEquals(ctr.getY(), nr.replaceA.coord.getY()))
+ msg += " at (" + TextUtils.formatDistance(nr.replaceA.coord.getX()) + "," + TextUtils.formatDistance(nr.replaceA.coord.getY()) + ")";
+ msg += " and routing from Metal " + (nr.aZ+1);
+ warn(msg);
+
+ PrimitiveNode pNp = nr.replaceA.viaToPlace.via;
+ Orientation orient = Orientation.fromJava(nr.replaceA.viaToPlace.orientation * 10, false, false);
+ RouteNode newRN = new RouteNode(pNp, SeaOfGatesEngine.this, nr.aEndpoints.getCenter(),
pNp.getDefWidth(ep), pNp.getDefHeight(ep), orient, null, nr);
resolution.addNode(newRN);
RouteNode goal = (fromBit == BLOCKAGEENDA ? fromRN : toRN);
@@ -5344,18 +6985,32 @@ public abstract class SeaOfGatesEngine
if (ra.from == goal) ra.from = newRN;
if (ra.to == goal) ra.to = newRN;
}
- ArcProto type = metalArcs[nr.replaceAZ][nr.replaceAC];
- Layer layer = metalLayers[nr.replaceAZ][nr.replaceAC];
- double width = nr.getArcWidth(nr.replaceAZ, nr.aX, nr.aY, nr.aX, nr.aY);
- resolution.addArc(new RouteArc(type, routeName, SeaOfGatesEngine.this, layer, width, newRN, goal, nr));
+ if (prefs.resultCellName == null)
+ {
+ // creating connected circuitry: place arc to port at end of route
+ ArcProto type = metalArcs[nr.replaceAZ][nr.replaceAC];
+ Layer layer = metalLayers[nr.replaceAZ][nr.replaceAC];
+ double width = nr.getArcWidth(nr.replaceAZ, nr.aEndpoints.getCenterX(), nr.aEndpoints.getCenterY(), nr.aEndpoints.getCenterX(), nr.aEndpoints.getCenterY());
+ resolution.addArc(new RouteArc(type, routeName, SeaOfGatesEngine.this, layer, width, newRN, goal, nr));
+ }
if (fromBit == BLOCKAGEENDA) fromRN = newRN; else toRN = newRN;
routeName = null;
}
if (nr.replaceB != null)
{
- PrimitiveNode pNp = nr.replaceB.via;
- Orientation orient = Orientation.fromJava(nr.replaceB.orientation * 10, false, false);
- RouteNode newRN = new RouteNode(pNp, SeaOfGatesEngine.this, EPoint.fromLambda(nr.bX, nr.bY),
+ EPoint ctr = nr.bPi.getCenter();
+ String msg = "Route '" + origRouteName + "' at (" + TextUtils.formatDistance(ctr.getX()) + "," +
+ TextUtils.formatDistance(ctr.getY()) + ") from port " + nr.bPi.getPortProto().getName() + " on node " +
+ describe(nr.bPi.getNodeInst()) + " is disallowed on Metal " + (nr.replaceBZ+1) + " so inserting " +
+ nr.replaceB.viaToPlace.via.describe(false);
+ if (!DBMath.areEquals(ctr.getX(), nr.replaceB.coord.getX()) || !DBMath.areEquals(ctr.getY(), nr.replaceB.coord.getY()))
+ msg += " at (" + TextUtils.formatDistance(nr.replaceB.coord.getX()) + "," + TextUtils.formatDistance(nr.replaceB.coord.getY()) + ")";
+ msg += " and routing from Metal " + (nr.bZ+1);
+ warn(msg);
+
+ PrimitiveNode pNp = nr.replaceB.viaToPlace.via;
+ Orientation orient = Orientation.fromJava(nr.replaceB.viaToPlace.orientation * 10, false, false);
+ RouteNode newRN = new RouteNode(pNp, SeaOfGatesEngine.this, nr.bEndpoints.getCenter(),
pNp.getDefWidth(ep), pNp.getDefHeight(ep), orient, null, nr);
resolution.addNode(newRN);
RouteNode goal = (fromBit == BLOCKAGEENDA ? toRN : fromRN);
@@ -5364,17 +7019,21 @@ public abstract class SeaOfGatesEngine
if (ra.from == goal) ra.from = newRN;
if (ra.to == goal) ra.to = newRN;
}
- ArcProto type = metalArcs[nr.replaceBZ][nr.replaceBC];
- Layer layer = metalLayers[nr.replaceBZ][nr.replaceBC];
- double width = nr.getArcWidth(nr.replaceBZ, nr.bX, nr.bY, nr.bX, nr.bY);
- resolution.addArc(new RouteArc(type, routeName, SeaOfGatesEngine.this, layer, width, newRN, goal, nr));
+ if (prefs.resultCellName == null)
+ {
+ // creating connected circuitry: place arc to port at end of route
+ ArcProto type = metalArcs[nr.replaceBZ][nr.replaceBC];
+ Layer layer = metalLayers[nr.replaceBZ][nr.replaceBC];
+ double width = nr.getArcWidth(nr.replaceBZ, nr.bEndpoints.getCenterX(), nr.bEndpoints.getCenterY(), nr.bEndpoints.getCenterX(), nr.bEndpoints.getCenterY());
+ resolution.addArc(new RouteArc(type, routeName, SeaOfGatesEngine.this, layer, width, newRN, goal, nr));
+ }
if (fromBit == BLOCKAGEENDA) toRN = newRN; else fromRN = newRN;
routeName = null;
}
RouteNode lastRN = toRN;
PolyBase toPoly = to.getPoly();
- if (!DBMath.pointInRect(EPoint.fromLambda(toX, toY), toRect))
+ if (!DBMath.pointInRect(toPE.getCenter(), toPE.getRect()))
{
// end of route is off-grid: adjust it
if (vertices.size() >= 2)
@@ -5385,7 +7044,7 @@ public abstract class SeaOfGatesEngine
if (tc > 0) tc--;
ArcProto type = metalArcs[toZ][tc];
Layer layer = metalLayers[toZ][tc];
- double width = nr.getArcWidth(toZ, toX, toY, toX, toY);
+ double width = nr.getArcWidth(toZ, toPE.getCenterX(), toPE.getCenterY(), toPE.getCenterX(), toPE.getCenterY());
PrimitiveNode np = metalArcs[toZ][tc].findPinProto();
if (v1.getX() == v2.getX())
{
@@ -5414,16 +7073,6 @@ public abstract class SeaOfGatesEngine
for (int i = 0; i < vertices.size(); i++)
{
SearchVertex sv = vertices.get(i);
- SearchVertexAddon sva = sv.getMoreGeometry();
- if (sva != null)
- {
- Rectangle2D addedGeometry = sva.getGeometry();
- PrimitiveNode pNp = sva.getPureLayerNode();
- RouteNode rn = new RouteNode(pNp, SeaOfGatesEngine.this, EPoint.fromLambda(addedGeometry.getCenterX(), addedGeometry.getCenterY()),
- addedGeometry.getWidth(), addedGeometry.getHeight(), Orientation.IDENT, null, nr);
- resolution.addNode(rn);
- }
-
boolean madeContacts = false;
while (i < vertices.size() - 1)
{
@@ -5452,35 +7101,6 @@ public abstract class SeaOfGatesEngine
}
double width = nr.getArcWidth(sv.getZ(), sv.getX(), sv.getY(), otherX, otherY);
- // shrink size if metals are narrower (tapered)
- double fartherX = sv.getX(), fartherY = sv.getY();
- for(int j=i+1; j<vertices.size(); j++)
- {
- SearchVertex svFarther = vertices.get(j);
- fartherX = svFarther.getX();
- fartherY = svFarther.getY();
- if (svFarther.getZ() != svNext.getZ()) break;
- }
- double widthNext = nr.getArcWidth(svNext.getZ(), sv.getX(), sv.getY(), fartherX, fartherY);
- if (mv.horMetal == sv.getZ())
- {
- double arcWid = width + mv.horMetalInset;
- if (arcWid < conHei) conHei = arcWid;
- } else if (mv.horMetal == svNext.getZ())
- {
- double arcWid = widthNext + mv.horMetalInset;
- if (arcWid < conHei) conHei = arcWid;
- }
- if (mv.verMetal == sv.getZ())
- {
- double arcWid = width + mv.verMetalInset;
- if (arcWid < conWid) conWid = arcWid;
- } else if (mv.verMetal == svNext.getZ())
- {
- double arcWid = widthNext + mv.verMetalInset;
- if (arcWid < conWid) conWid = arcWid;
- }
-
int sCol = sv.getC();
if (sCol > 0) sCol--;
ArcProto type = metalArcs[sv.getZ()][sCol];
@@ -5542,9 +7162,12 @@ public abstract class SeaOfGatesEngine
} else
{
PortInst pi = null;
+ double width = np.getDefWidth(ep), height = np.getDefHeight(ep);
+ if (np.getFunction().isPin())
+ width = height = nr.getArcWidth(sv.getZ(), sv.getX(), sv.getY(), sv.getX(), sv.getY());
if (nr.spineTapMap != null) pi = nr.spineTapMap.get(sv);
piRN = new RouteNode(np, SeaOfGatesEngine.this, EPoint.fromLambda(sv.getX(), sv.getY()),
- np.getDefWidth(ep), np.getDefHeight(ep), Orientation.IDENT, pi, nr);
+ width, height, Orientation.IDENT, pi, nr);
resolution.addNode(piRN);
}
if (lastRN != null)
@@ -5591,7 +7214,7 @@ public abstract class SeaOfGatesEngine
if (fX == tX || fY == tY)
{
// try running a single arc
- SOGBound errSV = getMetalBlockageAndNotch(sv.getZ(), sv.getC(), (hX-lX)/2, (hY-lY)/2, (hX+lX)/2, (hY+lY)/2, null, false);
+ SOGBound errSV = getMetalBlockageAndNotch(sv.getZ(), sv.getC(), (hX-lX)/2, (hY-lY)/2, (hX+lX)/2, (hY+lY)/2, null, false, null);
if (errSV == null) geomOK = true;
} else
{
@@ -5611,8 +7234,10 @@ public abstract class SeaOfGatesEngine
double bend2bLX = hX - width, bend2bHX = hX;
double bend2bLY = lY, bend2bHY = hY;
- SOGBound errSVa = getMetalBlockageAndNotch(sv.getZ(), sv.getC(), (bend1aHX-bend1aLX)/2, (bend1aHY-bend1aLY)/2, (bend1aHX+bend1aLX)/2, (bend1aHY+bend1aLY)/2, null, false);
- SOGBound errSVb = getMetalBlockageAndNotch(sv.getZ(), sv.getC(), (bend1bHX-bend1bLX)/2, (bend1bHY-bend1bLY)/2, (bend1bHX+bend1bLX)/2, (bend1bHY+bend1bLY)/2, null, false);
+ SOGBound errSVa = getMetalBlockageAndNotch(sv.getZ(), sv.getC(), (bend1aHX-bend1aLX)/2, (bend1aHY-bend1aLY)/2,
+ (bend1aHX+bend1aLX)/2, (bend1aHY+bend1aLY)/2, null, false, null);
+ SOGBound errSVb = getMetalBlockageAndNotch(sv.getZ(), sv.getC(), (bend1bHX-bend1bLX)/2, (bend1bHY-bend1bLY)/2,
+ (bend1bHX+bend1bLX)/2, (bend1bHY+bend1bLY)/2, null, false, null);
if (errSVa == null && errSVb == null)
{
RouteNode bend1RN = new RouteNode(np, SeaOfGatesEngine.this, EPoint.fromLambda(bend1X, bend1Y),
@@ -5626,8 +7251,10 @@ public abstract class SeaOfGatesEngine
System.out.println("AVOIDED UNIVERSAL ARC BECAUSE BEND 1 WORKS");
} else
{
- errSVa = getMetalBlockageAndNotch(sv.getZ(), sv.getC(), (bend2aHX-bend2aLX)/2, (bend2aHY-bend2aLY)/2, (bend2aHX+bend2aLX)/2, (bend2aHY+bend2aLY)/2, null, false);
- errSVb = getMetalBlockageAndNotch(sv.getZ(), sv.getC(), (bend2bHX-bend2bLX)/2, (bend2bHY-bend2bLY)/2, (bend2bHX+bend2bLX)/2, (bend2bHY+bend2bLY)/2, null, false);
+ errSVa = getMetalBlockageAndNotch(sv.getZ(), sv.getC(), (bend2aHX-bend2aLX)/2, (bend2aHY-bend2aLY)/2,
+ (bend2aHX+bend2aLX)/2, (bend2aHY+bend2aLY)/2, null, false, null);
+ errSVb = getMetalBlockageAndNotch(sv.getZ(), sv.getC(), (bend2bHX-bend2bLX)/2, (bend2bHY-bend2bLY)/2,
+ (bend2bHX+bend2bLX)/2, (bend2bHY+bend2bLY)/2, null, false, null);
if (errSVa == null && errSVb == null)
{
RouteNode bend2RN = new RouteNode(np, SeaOfGatesEngine.this, EPoint.fromLambda(bend2X, bend2Y),
@@ -5644,13 +7271,12 @@ public abstract class SeaOfGatesEngine
}
if (!geomOK)
{
-System.out.println("WARNING: Placing Universal arc on route from port "+from.getPortProto().getName()+" of node "+describe(from.getNodeInst())+
- " AT ("+TextUtils.formatDistance(fromX)+","+TextUtils.formatDistance(fromY)+","+describeMetal(fromZ,fromC)+") to port "+to.getPortProto().getName()+" of node "+describe(to.getNodeInst())+
- " AT ("+TextUtils.formatDistance(toX)+","+TextUtils.formatDistance(toY)+","+describeMetal(toZ,toC)+")");
type = Generic.tech().universal_arc;
layer = null;
width = 0;
- } else System.out.println("AVOIDED UNIVERSAL ARC BECAUSE EXISTING LAYER IS DRC CLEAN");
+ } else System.out.println("AVOIDED UNIVERSAL ARC FROM ("+TextUtils.formatDistance(lastRN.loc.getX())+","+
+ TextUtils.formatDistance(lastRN.loc.getY())+") TO ("+TextUtils.formatDistance(piRN.loc.getX())+","+
+ TextUtils.formatDistance(piRN.loc.getY())+") BECAUSE EXISTING LAYER IS DRC CLEAN");
} else System.out.println("AVOIDED UNIVERSAL ARC BECAUSE EXISTING LAYER SURROUNDS OK");
}
}
@@ -5661,6 +7287,24 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
lastRN = piRN;
}
+ for (int i = 0; i < vertices.size(); i++)
+ {
+ SearchVertex sv = vertices.get(i);
+ SearchVertexAddon sva = sv.getMoreGeometry();
+ if (sva != null)
+ {
+ Rectangle2D[] addedGeometry = sva.getGeometry();
+ PrimitiveNode pNp = sva.getPureLayerNode();
+ for(int j=0; j<addedGeometry.length; j++)
+ {
+ Rectangle2D geomPiece = addedGeometry[j];
+ RouteNode rn = new RouteNode(pNp, SeaOfGatesEngine.this, EPoint.fromLambda(geomPiece.getCenterX(), geomPiece.getCenterY()),
+ geomPiece.getWidth(), geomPiece.getHeight(), Orientation.IDENT, null, nr);
+ resolution.addNode(rn);
+ }
+ }
+ }
+
if (nr.endBlockages != null)
{
List<Layer> allLayers = new ArrayList<Layer>();
@@ -5733,12 +7377,17 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
double[] fromSurround = nr.getSpacingRule(curZ, width, 50);
double lX = curX - halfWidth, hX = curX + halfWidth;
double lY = curY - halfWidth, hY = curY + halfWidth;
+ // TODO: should stop jump at destination
+// if (dx > 0) hX = Math.min(jumpBound.getMaxX(), toRect.getMaxX()) + halfWidth; else
+// if (dx < 0) lX = Math.max(jumpBound.getMinX(), toRect.getMinX()) - halfWidth; else
+// if (dy > 0) hY = Math.min(jumpBound.getMaxY(), toRect.getMaxY()) + halfWidth; else
+// if (dy < 0) lY = Math.max(jumpBound.getMinY(), toRect.getMinY()) - halfWidth;
if (dx > 0) hX = jumpBound.getMaxX() + halfWidth; else
if (dx < 0) lX = jumpBound.getMinX() - halfWidth; else
if (dy > 0) hY = jumpBound.getMaxY() + halfWidth; else
if (dy < 0) lY = jumpBound.getMinY() - halfWidth;
BlockageTree bTree = rTrees.getMetalTree(primaryMetalLayer[curZ]);
- Rectangle2D topX = null, botX = null, topY = null, botY = null;
+ SOGBound topX = null, botX = null, topY = null, botY = null;
bTree.lock();
try {
if (!bTree.isEmpty())
@@ -5759,10 +7408,10 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
if (lY <= bound.getMaxY() && hY >= bound.getMinY())
{
// rectangles touch or overlap
- if (dx > 0 && bound.getMinX()-fromSurround[0] < hX) { hX = bound.getMinX()-fromSurround[0]; topX = bound; }
- if (dx < 0 && bound.getMaxX()+fromSurround[0] > lX) { lX = bound.getMaxX()+fromSurround[0]; botX = bound; }
- if (dy > 0 && bound.getMinY()-fromSurround[1] < hY) { hY = bound.getMinY()-fromSurround[1]; topY = bound; }
- if (dy < 0 && bound.getMaxY()+fromSurround[1] > lY) { lY = bound.getMaxY()+fromSurround[1]; botY = bound; }
+ if (dx > 0 && bound.getMinX()-fromSurround[0] < hX) { hX = bound.getMinX()-fromSurround[0]; topX = sBound; }
+ if (dx < 0 && bound.getMaxX()+fromSurround[0] > lX) { lX = bound.getMaxX()+fromSurround[0]; botX = sBound; }
+ if (dy > 0 && bound.getMinY()-fromSurround[1] < hY) { hY = bound.getMinY()-fromSurround[1]; topY = sBound; }
+ if (dy < 0 && bound.getMaxY()+fromSurround[1] > lY) { lY = bound.getMaxY()+fromSurround[1]; botY = sBound; }
continue;
}
@@ -5825,13 +7474,13 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
if (dx < 0)
{
// moving left
- if (lYintX != null && lYintX.doubleValue() > lX && lYintX.doubleValue() <= curX) { lX = lYintX.doubleValue(); botX = bound; }
- if (hYintX != null && hYintX.doubleValue() > lX && hYintX.doubleValue() <= curX) { lX = hYintX.doubleValue(); botX = bound; }
+ if (lYintX != null && lYintX.doubleValue() > lX && lYintX.doubleValue() <= curX) { lX = lYintX.doubleValue(); botX = sBound; }
+ if (hYintX != null && hYintX.doubleValue() > lX && hYintX.doubleValue() <= curX) { lX = hYintX.doubleValue(); botX = sBound; }
} else
{
// moving right
- if (lYintX != null && lYintX.doubleValue() < hX && lYintX.doubleValue() >= curX) { hX = lYintX.doubleValue(); topX = bound; }
- if (hYintX != null && hYintX.doubleValue() < hX && hYintX.doubleValue() >= curX) { hX = hYintX.doubleValue(); topX = bound; }
+ if (lYintX != null && lYintX.doubleValue() < hX && lYintX.doubleValue() >= curX) { hX = lYintX.doubleValue(); topX = sBound; }
+ if (hYintX != null && hYintX.doubleValue() < hX && hYintX.doubleValue() >= curX) { hX = hYintX.doubleValue(); topX = sBound; }
}
} else
{
@@ -5844,13 +7493,13 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
if (dy < 0)
{
// moving down
- if (lXintY != null && lXintY.doubleValue() > lY && lXintY.doubleValue() <= curY) { lY = lXintY.doubleValue(); botY = bound; }
- if (hXintY != null && hXintY.doubleValue() > lY && hXintY.doubleValue() <= curY) { lY = hXintY.doubleValue(); botY = bound; }
+ if (lXintY != null && lXintY.doubleValue() > lY && lXintY.doubleValue() <= curY) { lY = lXintY.doubleValue(); botY = sBound; }
+ if (hXintY != null && hXintY.doubleValue() > lY && hXintY.doubleValue() <= curY) { lY = hXintY.doubleValue(); botY = sBound; }
} else
{
// moving up
- if (lXintY != null && lXintY.doubleValue() < hY && lXintY.doubleValue() >= curY) { hY = lXintY.doubleValue(); topY = bound; }
- if (hXintY != null && hXintY.doubleValue() < hY && hXintY.doubleValue() >= curY) { hY = hXintY.doubleValue(); topY = bound; }
+ if (lXintY != null && lXintY.doubleValue() < hY && lXintY.doubleValue() >= curY) { hY = lXintY.doubleValue(); topY = sBound; }
+ if (hXintY != null && hXintY.doubleValue() < hY && hXintY.doubleValue() >= curY) { hY = hXintY.doubleValue(); topY = sBound; }
}
}
}
@@ -5861,11 +7510,17 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
if (dx > 0)
{
dx = nr.downToGrain(hX - halfWidth) - curX;
+ double initialDX = dx;
if (fromTaperLen >= 0 && !sv.isOffInitialSegment() && dx > fromTaperLen) dx = fromTaperLen;
- if (curZ == toZ && curY == toY && curX < toX && curX+dx > toX) dx = toX - curX;
- if (curX + dx > toX && curY >= toRect.getMinY() && curY <= toRect.getMaxY() && curZ == toZ) dx = toX - curX; else
+ if (curZ == toZ)
{
- if (!inDestGrid(toRectGridded, curX+dx, curY))
+ Double goalX = toPE.getGoalWithinX(curX, curX+dx, curY);
+ if (goalX != null) dx = goalX.doubleValue() - curX;
+ }
+ Double goalX = toPE.getGoalAboveX(curX+dx, curY);
+ if (goalX != null && curZ == toZ) dx = goalX.doubleValue() - curX; else
+ {
+ if (!toPE.atGoalPoint(curX+dx, curY))
dx = nr.getLowerXGrid(curZ, curX+dx).getCoordinate() - curX;
if (globalRoutingDelta != 0)
{
@@ -5881,28 +7536,44 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
dx = nr.getClosestXGrid(curZ, curX+dx).getCoordinate() - curX;
}
}
- if (curX + dx > toRect.getMaxX() || curX + dx < toRect.getMinX()) dx = nr.downToGrainAlways(curX + dx) - curX;
+ if (toPE.isOutOfGoalX(curX + dx)) dx = nr.downToGrainAlways(curX + dx) - curX;
}
- if (explanation != null && topX != null)
+ if (explanation != null)
{
- explanation.append("rect at " + TextUtils.formatDistance(topX.getMinX()) + "<=X<=" +
- TextUtils.formatDistance(topX.getMaxX()) + " and " +
- TextUtils.formatDistance(topX.getMinY()) + "<=Y<=" + TextUtils.formatDistance(topX.getMaxY()) +
- " which is " + TextUtils.formatDistance(fromSurround[0]));
- if (fromSurround[0] != fromSurround[1]) explanation.append("/" + TextUtils.formatDistance(fromSurround[1]));
- explanation.append(" from rect " + TextUtils.formatDistance(lX) + "<=X<=" + TextUtils.formatDistance(hX) + " and " +
- TextUtils.formatDistance(lY) + "<=Y<=" + TextUtils.formatDistance(hY));
+ if (topX == null)
+ {
+ if (fromTaperLen >= 0 && !sv.isOffInitialSegment() && initialDX > fromTaperLen)
+ explanation.append("went full taper distance of "+TextUtils.formatDistance(fromTaperLen)); else
+ explanation.append("went to jump bound "+TextUtils.formatDistance(nr.jumpBound.getMinX())+"<=X<="+
+ TextUtils.formatDistance(nr.jumpBound.getMaxX())+" and "+TextUtils.formatDistance(nr.jumpBound.getMinY())+"<=Y<="+
+ TextUtils.formatDistance(nr.jumpBound.getMaxY()));
+ } else
+ {
+ explanation.append("blocked by rect at " + TextUtils.formatDistance(topX.bound.getMinX()) + "<=X<=" +
+ TextUtils.formatDistance(topX.bound.getMaxX()) + " and " +
+ TextUtils.formatDistance(topX.bound.getMinY()) + "<=Y<=" + TextUtils.formatDistance(topX.bound.getMaxY()) +
+ " on net " + topX.getNetID() + " which is " + TextUtils.formatDistance(fromSurround[0]));
+ if (fromSurround[0] != fromSurround[1]) explanation.append("/" + TextUtils.formatDistance(fromSurround[1]));
+ explanation.append(" from rect " + TextUtils.formatDistance(lX) + "<=X<=" + TextUtils.formatDistance(hX) + " and " +
+ TextUtils.formatDistance(lY) + "<=Y<=" + TextUtils.formatDistance(hY));
+ }
}
return dx;
}
if (dx < 0)
{
dx = nr.upToGrain(lX + halfWidth) - curX;
+ double initialDX = dx;
if (fromTaperLen >= 0 && !sv.isOffInitialSegment() && -dx > fromTaperLen) dx = -fromTaperLen;
- if (curZ == toZ && curY == toY && curX > toX && curX+dx < toX) dx = toX - curX;
- if (curX + dx < toX && curY >= toRect.getMinY() && curY <= toRect.getMaxY() && curZ == toZ) dx = toX - curX; else
+ if (curZ == toZ)
+ {
+ Double goalX = toPE.getGoalWithinX(curX+dx, curX, curY);
+ if (goalX != null) dx = goalX.doubleValue() - curX;
+ }
+ Double goalX = toPE.getGoalBelowX(curX+dx, curY);
+ if (goalX != null && curZ == toZ) dx = goalX.doubleValue() - curX; else
{
- if (!inDestGrid(toRectGridded, curX+dx, curY))
+ if (!toPE.atGoalPoint(curX+dx, curY))
dx = nr.getUpperXGrid(curZ, curX+dx).getCoordinate() - curX;
if (globalRoutingDelta != 0)
{
@@ -5918,28 +7589,44 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
dx = nr.getClosestXGrid(curZ, curX+dx).getCoordinate() - curX;
}
}
- if (curX + dx > toRect.getMaxX() || curX + dx < toRect.getMinX()) dx = nr.upToGrainAlways(curX + dx) - curX;
+ if (toPE.isOutOfGoalX(curX + dx)) dx = nr.upToGrainAlways(curX + dx) - curX;
}
- if (explanation != null && botX != null)
+ if (explanation != null)
{
- explanation.append("rect at " + TextUtils.formatDistance(botX.getMinX()) + "<=X<=" +
- TextUtils.formatDistance(botX.getMaxX()) + " and " +
- TextUtils.formatDistance(botX.getMinY()) + "<=Y<=" + TextUtils.formatDistance(botX.getMaxY()) +
- " which is " + TextUtils.formatDistance(fromSurround[0]));
- if (fromSurround[0] != fromSurround[1]) explanation.append("/" + TextUtils.formatDistance(fromSurround[1]));
- explanation.append(" from rect " + TextUtils.formatDistance(lX) + "<=X<=" + TextUtils.formatDistance(hX) + " and " +
- TextUtils.formatDistance(lY) + "<=Y<=" + TextUtils.formatDistance(hY));
+ if (botX == null)
+ {
+ if (fromTaperLen >= 0 && !sv.isOffInitialSegment() && -initialDX > fromTaperLen)
+ explanation.append("went full taper distance of "+TextUtils.formatDistance(fromTaperLen)); else
+ explanation.append("went to jump bound "+TextUtils.formatDistance(nr.jumpBound.getMinX())+"<=X<="+
+ TextUtils.formatDistance(nr.jumpBound.getMaxX())+" and "+TextUtils.formatDistance(nr.jumpBound.getMinY())+"<=Y<="+
+ TextUtils.formatDistance(nr.jumpBound.getMaxY()));
+ } else
+ {
+ explanation.append("blocked by rect at " + TextUtils.formatDistance(botX.bound.getMinX()) + "<=X<=" +
+ TextUtils.formatDistance(botX.bound.getMaxX()) + " and " +
+ TextUtils.formatDistance(botX.bound.getMinY()) + "<=Y<=" + TextUtils.formatDistance(botX.bound.getMaxY()) +
+ " on net " + botX.getNetID() + " which is " + TextUtils.formatDistance(fromSurround[0]));
+ if (fromSurround[0] != fromSurround[1]) explanation.append("/" + TextUtils.formatDistance(fromSurround[1]));
+ explanation.append(" from rect " + TextUtils.formatDistance(lX) + "<=X<=" + TextUtils.formatDistance(hX) + " and " +
+ TextUtils.formatDistance(lY) + "<=Y<=" + TextUtils.formatDistance(hY));
+ }
}
return dx;
}
if (dy > 0)
{
dy = nr.downToGrain(hY - halfWidth) - curY;
+ double initialDY = dy;
if (fromTaperLen >= 0 && !sv.isOffInitialSegment() && dy > fromTaperLen) dy = fromTaperLen;
- if (curZ == toZ && curX == toX && curY < toY && curY+dy > toY) dy = toY - curY;
- if (curX >= toRect.getMinX() && curX <= toRect.getMaxX() && curY + dy > toY && curZ == toZ) dy = toY - curY; else
+ if (curZ == toZ)
{
- if (!inDestGrid(toRectGridded, curX, curY+dy))
+ Double goalY = toPE.getGoalWithinY(curX, curY, curY+dy);
+ if (goalY != null) dy = goalY.doubleValue() - curY;
+ }
+ Double goalY = toPE.getGoalAboveY(curX, curY+dy);
+ if (goalY != null && curZ == toZ) dy = goalY.doubleValue() - curY; else
+ {
+ if (!toPE.atGoalPoint(curX, curY+dy))
dy = nr.getLowerYGrid(curZ, curY+dy).getCoordinate() - curY;
if (globalRoutingDelta != 0)
{
@@ -5955,31 +7642,45 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
dy = nr.getClosestYGrid(curZ, curY+dy).getCoordinate() - curY;
}
}
- if (curY + dy > toRect.getMaxY() || curY + dy < toRect.getMinY()) dy = nr.downToGrainAlways(curY + dy) - curY;
- }
- if (explanation != null && topY != null)
- {
- explanation.append("rect at " + TextUtils.formatDistance(topY.getMinX()) + "<=X<=" +
- TextUtils.formatDistance(topY.getMaxX()) + " and " +
- TextUtils.formatDistance(topY.getMinY()) + "<=Y<=" + TextUtils.formatDistance(topY.getMaxY()) +
- " which is " + TextUtils.formatDistance(fromSurround[0]));
- if (fromSurround[0] != fromSurround[1]) explanation.append("/" + TextUtils.formatDistance(fromSurround[1]));
- explanation.append(" from rect " + TextUtils.formatDistance(lX) + "<=X<=" + TextUtils.formatDistance(hX) + " and " +
- TextUtils.formatDistance(lY) + "<=Y<=" + TextUtils.formatDistance(hY));
+ if (toPE.isOutOfGoalY(curY + dy)) dy = nr.downToGrainAlways(curY + dy) - curY;
+ }
+ if (explanation != null)
+ {
+ if (topY == null)
+ {
+ if (fromTaperLen >= 0 && !sv.isOffInitialSegment() && initialDY > fromTaperLen)
+ explanation.append("went full taper distance of "+TextUtils.formatDistance(fromTaperLen)); else
+ explanation.append("went to jump bound "+TextUtils.formatDistance(nr.jumpBound.getMinX())+"<=X<="+
+ TextUtils.formatDistance(nr.jumpBound.getMaxX())+" and "+TextUtils.formatDistance(nr.jumpBound.getMinY())+"<=Y<="+
+ TextUtils.formatDistance(nr.jumpBound.getMaxY()));
+ } else
+ {
+ explanation.append("blocked by rect at " + TextUtils.formatDistance(topY.bound.getMinX()) + "<=X<=" +
+ TextUtils.formatDistance(topY.bound.getMaxX()) + " and " +
+ TextUtils.formatDistance(topY.bound.getMinY()) + "<=Y<=" + TextUtils.formatDistance(topY.bound.getMaxY()) +
+ " on net " + topY.getNetID() + " which is " + TextUtils.formatDistance(fromSurround[0]));
+ if (fromSurround[0] != fromSurround[1]) explanation.append("/" + TextUtils.formatDistance(fromSurround[1]));
+ explanation.append(" from rect " + TextUtils.formatDistance(lX) + "<=X<=" + TextUtils.formatDistance(hX) + " and " +
+ TextUtils.formatDistance(lY) + "<=Y<=" + TextUtils.formatDistance(hY));
+ }
}
return dy;
}
if (dy < 0)
{
dy = nr.upToGrain(lY + halfWidth) - curY;
+ double initialDY = dy;
if (fromTaperLen >= 0 && !sv.isOffInitialSegment() && -dy > fromTaperLen) dy = -fromTaperLen;
- if (curZ == toZ && curX == toX && curY > toY && curY+dy < toY) dy = toY - curY;
- if (curX >= toRect.getMinX() && curX <= toRect.getMaxX() && curY + dy < toY && curZ == toZ) dy = toY - curY; else
+ if (curZ == toZ)
{
- if (!inDestGrid(toRectGridded, curX, curY+dy))
- {
+ Double goalY = toPE.getGoalWithinY(curX, curY+dy, curY);
+ if (goalY != null) dy = goalY.doubleValue() - curY;
+ }
+ Double goalY = toPE.getGoalBelowY(curX, curY+dy);
+ if (goalY != null && curZ == toZ) dy = goalY.doubleValue() - curY; else
+ {
+ if (!toPE.atGoalPoint(curX, curY+dy))
dy = nr.getUpperYGrid(curZ, curY+dy).getCoordinate() - curY;
- }
if (globalRoutingDelta != 0)
{
Rectangle2D limit = orderedBuckets[sv.globalRoutingBucket];
@@ -5994,17 +7695,27 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
dy = nr.getClosestYGrid(curZ, curY+dy).getCoordinate() - curY;
}
}
- if (curY + dy > toRect.getMaxY() || curY + dy < toRect.getMinY()) dy = nr.upToGrainAlways(curY + dy) - curY;
+ if (toPE.isOutOfGoalY(curY + dy)) dy = nr.upToGrainAlways(curY + dy) - curY;
}
- if (explanation != null && botY != null)
+ if (explanation != null)
{
- explanation.append("rect at " + TextUtils.formatDistance(botY.getMinX()) + "<=X<=" +
- TextUtils.formatDistance(botY.getMaxX()) + " and " +
- TextUtils.formatDistance(botY.getMinY()) + "<=Y<=" + TextUtils.formatDistance(botY.getMaxY()) +
- " which is " + TextUtils.formatDistance(fromSurround[0]));
- if (fromSurround[0] != fromSurround[1]) explanation.append("/" + TextUtils.formatDistance(fromSurround[1]));
- explanation.append(" from rect " + TextUtils.formatDistance(lX) + "<=X<=" + TextUtils.formatDistance(hX) + " and " +
- TextUtils.formatDistance(lY) + "<=Y<=" + TextUtils.formatDistance(hY));
+ if (botY == null)
+ {
+ if (fromTaperLen >= 0 && !sv.isOffInitialSegment() && -initialDY > fromTaperLen)
+ explanation.append("went full taper distance of "+TextUtils.formatDistance(fromTaperLen)); else
+ explanation.append("went to jump bound "+TextUtils.formatDistance(nr.jumpBound.getMinX())+"<=X<="+
+ TextUtils.formatDistance(nr.jumpBound.getMaxX())+" and "+TextUtils.formatDistance(nr.jumpBound.getMinY())+"<=Y<="+
+ TextUtils.formatDistance(nr.jumpBound.getMaxY()));
+ } else
+ {
+ explanation.append("blocked by rect at " + TextUtils.formatDistance(botY.bound.getMinX()) + "<=X<=" +
+ TextUtils.formatDistance(botY.bound.getMaxX()) + " and " +
+ TextUtils.formatDistance(botY.bound.getMinY()) + "<=Y<=" + TextUtils.formatDistance(botY.bound.getMaxY()) +
+ " on net " + botY.getNetID() + " which is " + TextUtils.formatDistance(fromSurround[0]));
+ if (fromSurround[0] != fromSurround[1]) explanation.append("/" + TextUtils.formatDistance(fromSurround[1]));
+ explanation.append(" from rect " + TextUtils.formatDistance(lX) + "<=X<=" + TextUtils.formatDistance(hX) + " and " +
+ TextUtils.formatDistance(lY) + "<=Y<=" + TextUtils.formatDistance(hY));
+ }
}
return dy;
}
@@ -6022,11 +7733,12 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
* @return a blocking SOGBound object that is in the area. Returns null if the area is clear.
*/
private SOGBound getMetalBlockageAndNotch(int metNo, int maskNo, double halfWidth, double halfHeight,
- double x, double y, SearchVertex svCurrent, boolean minArea)
+ double x, double y, SearchVertex svCurrent, boolean minArea, StringBuffer explaination)
{
// get the R-Tree data for the metal layer
- if (maskNo > 0) maskNo--;
- Layer layer = metalLayers[metNo][maskNo];
+ int maskIndex = maskNo;
+ if (maskIndex > 0) maskIndex--;
+ Layer layer = metalLayers[metNo][maskIndex];
Layer primaryLayer = primaryMetalLayer[metNo];
BlockageTree bTree = rTrees.getMetalTree(primaryLayer);
bTree.lock();
@@ -6047,8 +7759,8 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
Rectangle2D searchArea = new Rectangle2D.Double(lX, lY, hX - lX, hY - lY);
// prepare for notch detection
- List<Rectangle2D> nodeRecsOnPath = new ArrayList<Rectangle2D>();
- List<Rectangle2D> recsOnPath = new ArrayList<Rectangle2D>();
+ List<SOGBound> nodeRecsOnPath = new ArrayList<SOGBound>();
+ List<SOGBound> recsOnPath = new ArrayList<SOGBound>();
// make a list of rectangles on the path
if (svCurrent != null)
@@ -6091,8 +7803,9 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
Rectangle2D bound = poly.getBounds2D();
if (bound.getMaxX() <= lX || bound.getMinX() >= hX || bound.getMaxY() <= lY || bound.getMinY() >= hY)
continue;
- recsOnPath.add(bound);
- nodeRecsOnPath.add(bound);
+ SOGBound bb = new SOGBound(ERectangle.fromLambda(bound), nr.netID, sv.getC());
+ recsOnPath.add(bb);
+ if (!minArea) nodeRecsOnPath.add(bb);
}
continue;
}
@@ -6109,15 +7822,17 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
Rectangle2D bound = poly.getBounds2D();
if (bound.getMaxX() <= lX || bound.getMinX() >= hX || bound.getMaxY() <= lY || bound.getMinY() >= hY)
continue;
- recsOnPath.add(bound);
- if (!minArea) nodeRecsOnPath.add(bound);
+ SOGBound bb = new SOGBound(ERectangle.fromLambda(bound), nr.netID, sv.getC());
+ recsOnPath.add(bb);
+ if (!minArea) nodeRecsOnPath.add(bb);
}
}
+ SOGBound violation = null;
for (Iterator<SOGBound> sea = bTree.search(searchArea); sea.hasNext(); )
{
SOGBound sBound = sea.next();
- Rectangle2D bound = sBound.getBounds();
+ ERectangle bound = sBound.getBounds();
// eliminate if out of worst surround
if (bound.getMaxX() <= lX || bound.getMinX() >= hX || bound.getMaxY() <= lY || bound.getMinY() >= hY)
@@ -6152,17 +7867,25 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
DBMath.isGreaterThanOrEqualTo(bound.getMinY(), hYAllow)) continue;
// too close for DRC: allow if on the same net
- if (sBound.isSameBasicNet(nr.netID))
+// if (sBound.getMaskColor() == maskNo)
{
- // on same net: make sure there is no notch error
- boolean notBlockage = false;
- if (!sBound.isPseudoBlockage()) notBlockage = true;
- if (notBlockage)
+ if (sBound.isSameBasicNet(nr.netID))
{
- boolean notch = foundANotch(bTree, metBound, bound, nr.netID, recsOnPath, spacing);
- if (notch) return sBound;
+ // only consider real blockages, not those set about endpoints to keep them clear
+ boolean notPseudoBlockage = false;
+ if (!sBound.isPseudoBlockage()) notPseudoBlockage = true;
+ if (notPseudoBlockage)
+ {
+ // on same net: see if it completely covers this
+ if (bound.getMinX() <= metLX && bound.getMaxX() >= metHX &&
+ bound.getMinY() <= metLY && bound.getMaxY() >= metHY) return null;
+
+ // make sure there is no notch error
+ boolean notch = foundANotch(bTree, metBound, bound, nr.netID, recsOnPath, spacing);
+ if (notch) violation = sBound;
+ }
+ continue;
}
- continue;
}
// if this is a polygon, do closer examination
@@ -6174,15 +7897,22 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
}
// DRC error found: return the offending geometry
- return sBound;
+ violation = sBound;
+ if (explaination != null) explaination.append("spacing [X=" + TextUtils.formatDistance(spacing[0]) +
+ ", Y=" + TextUtils.formatDistance(spacing[1]) + "]");
+ break;
}
+ if (violation != null) return violation;
// consider notch errors in the existing path
double[] spacing = nr.getSpacingRule(metNo, Math.min(metWid, metLen), Math.max(metWid, metLen));
- for(Rectangle2D bound : nodeRecsOnPath)
+ for(SOGBound sBound : nodeRecsOnPath)
{
- if (foundANotch(bTree, metBound, bound, nr.netID, recsOnPath, spacing))
- return new SOGBound(ERectangle.fromLambda(bound), nr.netID, maskNo);
+ if (foundANotch(bTree, metBound, sBound.getBounds(), nr.netID, recsOnPath, spacing))
+ {
+ if (explaination != null) explaination.append("notch");
+ return sBound;
+ }
}
return null;
} finally {
@@ -6198,7 +7928,7 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
* @return true if there is a notch error between the pieces of metal.
*/
private boolean foundANotch(BlockageTree bTree, Rectangle2D metBound, Rectangle2D bound, MutableInteger netID,
- List<Rectangle2D> recsOnPath, double[] dist)
+ List<SOGBound> recsOnPath, double[] dist)
{
// see if they overlap in X or Y
boolean hOverlap = metBound.getMinX() <= bound.getMaxX() && metBound.getMaxX() >= bound.getMinX();
@@ -6303,7 +8033,7 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
return false;
}
- private boolean pointInRTree(BlockageTree bTree, double x, double y, MutableInteger netID, List<Rectangle2D> recsOnPath)
+ private boolean pointInRTree(BlockageTree bTree, double x, double y, MutableInteger netID, List<SOGBound> recsOnPath)
{
Rectangle2D searchArea = new Rectangle2D.Double(x-0.5, y-0.5, 1, 1);
for (Iterator<SOGBound> sea = bTree.search(searchArea); sea.hasNext(); )
@@ -6319,12 +8049,12 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
}
// now see if it is on the path
- for (Rectangle2D bound : recsOnPath)
+ for (SOGBound bound : recsOnPath)
{
- if (DBMath.isGreaterThan(bound.getMinX(), x) ||
- DBMath.isLessThan(bound.getMaxX(), x) ||
- DBMath.isGreaterThan(bound.getMinY(), y) ||
- DBMath.isLessThan(bound.getMaxY(), y))
+ if (DBMath.isGreaterThan(bound.getBounds().getMinX(), x) ||
+ DBMath.isLessThan(bound.getBounds().getMaxX(), x) ||
+ DBMath.isGreaterThan(bound.getBounds().getMinY(), y) ||
+ DBMath.isLessThan(bound.getBounds().getMaxY(), y))
continue;
return true;
}
@@ -6397,16 +8127,25 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
*/
public static class SearchVertexAddon
{
- private Rectangle2D addedGeometry;
+ private Rectangle2D[] addedGeometry;
private PrimitiveNode pureLayerNode;
- public SearchVertexAddon(Rectangle2D geom, PrimitiveNode pNp)
+ public SearchVertexAddon(Rectangle2D geom1, Rectangle2D geom2, PrimitiveNode pNp)
{
- addedGeometry = geom;
+ if (geom2 == null)
+ {
+ addedGeometry = new Rectangle2D[1];
+ addedGeometry[0] = geom1;
+ } else
+ {
+ addedGeometry = new Rectangle2D[2];
+ addedGeometry[0] = geom1;
+ addedGeometry[1] = geom2;
+ }
pureLayerNode = pNp;
}
- public Rectangle2D getGeometry() { return addedGeometry; }
+ public Rectangle2D[] getGeometry() { return addedGeometry; }
public PrimitiveNode getPureLayerNode() { return pureLayerNode; }
}
@@ -6427,7 +8166,7 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
/** auto-generation of intermediate vertices */ private int autoGen;
/** the state of this vertex. */ private int flags;
/** index of global-routing bucket progress */ private int globalRoutingBucket;
- /** the cuts in the contact. */ private Rectangle2D[] cutRects;
+ /** the cuts in the contact. */ private Poly[] cutPolys;
/** the size of the contact. */ private Point2D size;
/** the previous vertex in the search. */ private SearchVertex last;
/** the routing state. */ private Wavefront wf;
@@ -6439,24 +8178,42 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
* @param y the Y coordinate of the SearchVertex.
* @param z the Z coordinate (metal layer) of the SearchVertex.
* @param whichContact the contact number to use if switching layers.
- * @param cutRects an array of cuts in this contact (if switching layers).
+ * @param conPolys an array of cuts in this contact (if switching layers).
* @param cl the layer of the cut (if switching layers).
* @param w the Wavefront that this SearchVertex is part of.
*/
- SearchVertex(double x, double y, int z, int c, int whichContact, Rectangle2D[] cutRects, Point2D size, int cl, Wavefront w, int flags)
+ SearchVertex(double x, double y, int z, int c, int whichContact, Poly[] conPolys, Point2D size, int cl, Wavefront w, int flags, SearchVertexAddon minareaGeom)
{
xv = x;
yv = y;
zv = (z << 8) + (whichContact & 0xFF);
cv = c;
- this.cutRects = cutRects;
+ this.cutPolys = conPolys;
this.size = size;
cutLayer = cl;
autoGen = -1;
this.flags = flags;
globalRoutingBucket = -1;
wf = w;
- addOn = null;
+ addOn = minareaGeom;
+ }
+
+ public SearchVertex(SearchVertex sv)
+ {
+ xv = sv.xv;
+ yv = sv.yv;
+ zv = sv.zv;
+ cv = sv.cv;
+ cost = sv.cost;
+ cutLayer = sv.cutLayer;
+ autoGen = sv.autoGen;
+ flags = sv.flags;
+ globalRoutingBucket = sv.globalRoutingBucket;
+ cutPolys = sv.cutPolys;
+ size = sv.size;
+ last = sv.last;
+ wf = sv.wf;
+ addOn = sv.addOn;
}
public double getX() { return xv; }
@@ -6480,15 +8237,13 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
public SearchVertexAddon getMoreGeometry() { return addOn; }
- public void setMoreGeometry(SearchVertexAddon sva) { addOn = sva; }
-
public int getGRBucket() { return globalRoutingBucket; }
public Wavefront getWavefront() { return wf; }
int getContactNo() { return zv & 0xFF; }
- Rectangle2D[] getCutRects() { return cutRects; }
+ Poly[] getCutPolys() { return cutPolys; }
Point2D getSize() { return size; }
@@ -6537,8 +8292,8 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
if (diff != 0) return diff;
if (wf != null)
{
- double thisDist = Math.abs(xv - wf.toX) + Math.abs(yv - wf.toY) + Math.abs(getZ() - wf.toZ);
- double otherDist = Math.abs(svo.xv - wf.toX) + Math.abs(svo.yv - wf.toY) + Math.abs(svo.getZ() - wf.toZ);
+ double thisDist = Math.abs(xv - wf.toPE.getCenterX()) + Math.abs(yv - wf.toPE.getCenterY()) + Math.abs(getZ() - wf.toZ);
+ double otherDist = Math.abs(svo.xv - wf.toPE.getCenterX()) + Math.abs(svo.yv - wf.toPE.getCenterY()) + Math.abs(svo.getZ() - wf.toZ);
if (thisDist < otherDist) return -1;
if (thisDist > otherDist) return 1;
}
@@ -6612,7 +8367,7 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
if (dY > 0 && newY >= prevSV.getY()) break;
if (wf.getVertex(newX, newY, z) == null)
{
- SearchVertex svIntermediate = new SearchVertex(newX, newY, z, c, getContactNo(), getCutRects(), getSize(), z, wf, last.flags);
+ SearchVertex svIntermediate = new SearchVertex(newX, newY, z, c, getContactNo(), getCutPolys(), getSize(), z, wf, last.flags, null);
if (wf.debuggingWavefront) RoutingDebug.ensureDebuggingShadow(svIntermediate, false);
if (wf.globalRoutingDelta != 0)
svIntermediate.globalRoutingBucket = wf.getNextBucket(this, newX, newY);
@@ -6672,8 +8427,8 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
{
// multiple layers for this metal: see if an uncolored layer is mixed with colored ones
Layer first = tempLayerList[i].get(0);
- int colorNum = first.getFunction().getMaskColor();
- if (colorNum == 0) { primaryMetalLayer[i] = tempLayerList[i].get(0); tempLayerList[i].remove(0); }
+ int colorNum = first.getFunction().getMaskColor();
+ if (colorNum == 0) { primaryMetalLayer[i] = tempLayerList[i].get(0); tempLayerList[i].remove(0); }
}
metalLayers[i] = new Layer[tempLayerList[i].size()];
for(int c=0; c<tempLayerList[i].size(); c++) metalLayers[i][c] = tempLayerList[i].get(c);
@@ -6709,8 +8464,8 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
{
// multiple layers for this metal: see if an uncolored layer is mixed with colored ones
ArcProto first = tempArcList[i].get(0);
- int colorNum = first.getMaskLayer();
- if (colorNum == 0) { primaryMetalArc[i] = tempArcList[i].get(0); tempArcList[i].remove(0); }
+ int colorNum = first.getMaskLayer();
+ if (colorNum == 0) { primaryMetalArc[i] = tempArcList[i].get(0); tempArcList[i].remove(0); }
}
metalArcs[i] = new ArcProto[tempArcList[i].size()];
metalPureLayerNodes[i] = new PrimitiveNode[tempArcList[i].size()];
@@ -6850,6 +8605,21 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
for (int i = 0; i < numMetalLayers - 1; i++)
metalVias2X[i] = new MetalVias();
+ List<Layer>[] tempViaLayerList = new List[numMetalLayers-1];
+ for(int i=0; i<numMetalLayers-1; i++) tempViaLayerList[i] = new ArrayList<Layer>();
+ for(Iterator<Layer> it = tech.getLayers(); it.hasNext(); )
+ {
+ Layer lay = it.next();
+ if (!lay.getFunction().isContact()) continue;
+ int viaNum = lay.getFunction().getLevel() - 2;
+ if (viaNum >= 0) tempViaLayerList[viaNum].add(lay);
+ }
+ for(int i=0; i<numMetalLayers-1; i++)
+ {
+ Collections.sort(tempViaLayerList[i], new SortLayersByMaskNumber());
+ viaLayers[i] = tempViaLayerList[i].get(0);
+ }
+
// regular expression to discard some primitives
String ignorePattern = sogp.getIgnorePrimitives(); // "Z-(\\w+)"
String accept1XPattern = sogp.getAcceptOnly1XPrimitives(); // "X-(\\w+)"
@@ -6925,9 +8695,6 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
}
}
if (conRect.getCenterX() != 0 || conRect.getCenterY() != 0) offCenter = true;
- } else if (lFun.isContact())
- {
- viaLayers[i] = conLayer;
}
}
@@ -7039,9 +8806,8 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
}
}
-
// compute design rule spacings
- DRC.DRCPreferences dp = new DRC.DRCPreferences(false);
+ DRC.DRCPreferences dp = new DRC.DRCPreferences(false);
minResolution = dp.getResolution(tech).getLambda();
layerSurround = new Map[numMetalLayers];
for (int i = 0; i < numMetalLayers; i++)
@@ -7054,15 +8820,15 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
for (int i = 0; i < numMetalLayers; i++)
{
if (metalLayers[i] == null) continue;
-
+
// get minimum area rule
minimumArea[i] = 0;
- DRCTemplate minAreaRule = DRC.getMinValue(primaryMetalLayer[i], DRCTemplate.DRCRuleType.MINAREA);
- if (minAreaRule != null)
- minimumArea[i] = minAreaRule.getValue(0);
+ DRCTemplate minAreaRule = DRC.getMinValue(primaryMetalLayer[i], DRCTemplate.DRCRuleType.MINAREA);
+ if (minAreaRule != null)
+ minimumArea[i] = minAreaRule.getValue(0);
- // get surrounds
- metalSurroundX[i] = metalSurroundY[i] = maxDefArcWidth[i] = 0;
+ // get surrounds
+ metalSurroundX[i] = metalSurroundY[i] = maxDefArcWidth[i] = 0;
for(int c=0; c<metalArcs[i].length; c++)
{
maxDefArcWidth[i] = Math.max(maxDefArcWidth[i], metalArcs[i][c].getDefaultLambdaBaseWidth(ep));
@@ -7087,16 +8853,41 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
}
}
}
+
viaSurround = new double[numMetalLayers - 1];
viaSize = new double[numMetalLayers - 1];
+ viaDiagonalDistance = new double[numMetalLayers - 1];
+ viaColorDiffSpacing = new double[numMetalLayers - 1];
+ secretViaSpacingRules = new Method[numMetalLayers - 1];
for (int i = 0; i < numMetalLayers - 1; i++)
{
Layer lay = viaLayers[i];
if (lay == null) continue;
+ // see if there are any secret via spacing rules embodied as methods
+ secretViaSpacingRules[i] = getViaSpacingChecker(tech, i);
+
+ // determine spacing distance
double spacing = 2;
DRCTemplate ruleSpacing = DRC.getSpacingRule(lay, null, lay, null, false, -1, maxDefArcWidth[i], 50);
if (ruleSpacing != null) spacing = ruleSpacing.getValue(0);
+ viaSurround[i] = spacing;
+
+ // determine diagonal via distance
+ double diagonalDist = 0;
+ DRCTemplate ruleDiagonalVia = DRC.getMinValue(lay, DRCTemplate.DRCRuleType.DIAGONALVIA);
+ if (ruleDiagonalVia != null)
+ diagonalDist = ruleDiagonalVia.getValue(0);
+ viaDiagonalDistance[i] = diagonalDist;
+
+ // determine the via distance when colors differ
+ double colorDiffDist = 0;
+ DRCTemplate ruleColorDiffVia = DRC.getMinValue(lay, DRCTemplate.DRCRuleType.DIFFMASKSEP);
+ if (ruleColorDiffVia != null)
+ {
+ colorDiffDist = ruleColorDiffVia.getValue(0);
+ }
+ viaColorDiffSpacing[i] = colorDiffDist;
// determine cut size
double width = 0;
@@ -7122,41 +8913,137 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
}
}
}
-
- viaSurround[i] = spacing;
viaSize[i] = width;
}
return false;
}
- /**
- * Comparator class for sorting Layers by their mask number.
- */
- private static class SortLayersByMaskNumber implements Comparator<Layer>
- {
- public int compare(Layer l1, Layer l2)
- {
- int m1 = l1.getFunction().getMaskColor();
- int m2 = l2.getFunction().getMaskColor();
- return m1 - m2;
- }
- }
-
-
- /**
- * Comparator class for sorting ArcProtos by their mask number.
- */
- private static class SortArcsByMaskNumber implements Comparator<ArcProto>
- {
- public int compare(ArcProto a1, ArcProto a2)
- {
- int m1 = a1.getMaskLayer();
- int m2 = a2.getMaskLayer();
- return m1 - m2;
- }
- }
-
- // debugging code
+ private static boolean tsmcDesignRulesChecked = false;
+ private static Class<?> tsmcDesignRulesClass;
+
+ private static boolean hasTSMCDesignRules()
+ {
+ if (!tsmcDesignRulesChecked)
+ {
+ tsmcDesignRulesChecked = true;
+ try
+ {
+ tsmcDesignRulesClass = Class.forName("com.sun.electric.plugins.tsmc.TSMCDesignRules");
+ } catch (ClassNotFoundException e) {}
+ }
+ return tsmcDesignRulesClass != null;
+ }
+
+ private static Method getViaSpacingChecker(Technology tech, int metalNo)
+ {
+ if (!hasTSMCDesignRules()) return null;
+
+ String methodName = "tsmcVia" + (metalNo+1) + "RuleFor" + tech.getTechName().toUpperCase();
+ try
+ {
+ Method viaSpacingCheckMethod = tsmcDesignRulesClass.getMethod(methodName, new Class[]{List.class});
+ return viaSpacingCheckMethod;
+ } catch (Exception e) {}
+ return null;
+ }
+
+ // extra class for sorting nets based on # of bits per bus
+ private static class BusBitsNumberClass
+ {
+ String netName;
+ List<String> bits;
+
+ BusBitsNumberClass(String name)
+ {
+ netName = name;
+ bits = new ArrayList<String>();
+ }
+ List<String> getNets()
+ {
+ List<String> l = new ArrayList<String>();
+
+ for (String bit: bits)
+ l.add(netName+bit);
+ return l;
+ }
+ }
+ private static class SortByBusBitsNumberClass implements Comparator<BusBitsNumberClass>
+ {
+ public int compare(BusBitsNumberClass s1, BusBitsNumberClass s2)
+ {
+ int l1 = s1.bits.size();
+ int l2 = s2.bits.size();
+ if (l1 > l2) return -1; // descending order is preferred
+ else if (l1 < l2) return 1;
+ return s1.netName.compareToIgnoreCase(s2.netName); // use alphabetic order
+ }
+ }
+
+ // SortArcByDistance
+ private static class SortArcByDistance implements Comparator<String>
+ {
+ Cell theCell;
+ SoGNetOrder sortingType;
+
+ SortArcByDistance(Cell cell, SoGNetOrder type)
+ {
+ theCell = cell;
+ sortingType = type;
+ }
+
+ public int compare(String s1, String s2)
+ {
+ ArcInst a1 = theCell.findArc(s1);
+ ArcInst a2 = theCell.findArc(s2);
+ double d1 = a1.getLambdaLength();
+ double d2 = a2.getLambdaLength();
+ switch (sortingType)
+ {
+ case SOGNETORDERPERCENTAGE:
+ if (d1 > d2) return 1;
+ if (d1 < d2) return -1;
+ break;
+ case SOGNETORDERDESCENDING:
+ if (d1 < d2) return 1;
+ if (d1 > d2) return -1;
+ break;
+ case SOGNETORDERASCENDING:
+ case SOGNETORDERBUS:
+ case SOGNETORDERGIVEN:
+ case SOGNETORDERORIGINAL:
+ break;
+ }
+ return 0;
+ }
+ }
+
+ /**
+ * Comparator class for sorting Layers by their mask number.
+ */
+ private static class SortLayersByMaskNumber implements Comparator<Layer>
+ {
+ public int compare(Layer l1, Layer l2)
+ {
+ int m1 = l1.getFunction().getMaskColor();
+ int m2 = l2.getFunction().getMaskColor();
+ return m1 - m2;
+ }
+ }
+
+ /**
+ * Comparator class for sorting ArcProtos by their mask number.
+ */
+ private static class SortArcsByMaskNumber implements Comparator<ArcProto>
+ {
+ public int compare(ArcProto a1, ArcProto a2)
+ {
+ int m1 = a1.getMaskLayer();
+ int m2 = a2.getMaskLayer();
+ return m1 - m2;
+ }
+ }
+
+ // debugging code
// private void dumpSpacing()
// {
// System.out.println("CACHED METAL SPACINGS");
@@ -7230,11 +9117,10 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
}
}
- private static class RoutesOnNetwork implements Comparable<RoutesOnNetwork>
+ public static class RoutesOnNetwork implements Comparable<RoutesOnNetwork>
{
- String netName;
- List<SteinerTreePortPair> pairs;
- List<PortInst> spineTapPorts;
+ private String netName;
+ private List<SteinerTreePortPair> pairs;
List<ArcInst> unroutedArcs;
List<PortInst> unorderedPorts;
List<NeededRoute> neededRoutes;
@@ -7243,12 +9129,15 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
{
this.netName = netName;
pairs = new ArrayList<SteinerTreePortPair>();
- spineTapPorts = null;
unroutedArcs = new ArrayList<ArcInst>();
unorderedPorts = new ArrayList<PortInst>();
neededRoutes = new ArrayList<NeededRoute>();
}
+ public List<SteinerTreePortPair> getPairs() { return pairs; }
+
+ public String getName() { return netName; }
+
public boolean addUnorderedPort(PortInst pi)
{
if (pi.getNodeInst().isCellInstance() ||
@@ -7262,97 +9151,341 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
/**
* Method to setup a spine network (many colinear points).
- * @return true if this is a spine network.
*/
- public boolean setupSpineInfo()
+ public void setupSpineInfo(boolean disableAdvancedSpineRouting)
{
// first make a set of unique ports (remove duplicates)
Set<PortInst> uniquePorts = new HashSet<PortInst>();
for(PortInst pi : unorderedPorts)
uniquePorts.add(pi);
- // nets with 3 or less points are not spines
- if (uniquePorts.size() < 4) return false;
-
- // get bounds of the points
- double lowX = 0, highX = 0, lowY = 0, highY = 0;
- boolean first = true;
+ // make histograms of X and Y coordinates
+ Map<Double,List<PortInst>> xMap = new TreeMap<Double,List<PortInst>>();
+ Map<Double,List<PortInst>> yMap = new TreeMap<Double,List<PortInst>>();
for(PortInst pi : uniquePorts)
{
EPoint pt = pi.getCenter();
- if (first)
+ Double xv = new Double(pt.getX());
+ List<PortInst> xTotal = xMap.get(xv);
+ if (xTotal == null) xMap.put(xv, xTotal = new ArrayList<PortInst>());
+ xTotal.add(pi);
+
+ Double yv = new Double(pt.getY());
+ List<PortInst> yTotal = yMap.get(yv);
+ if (yTotal == null) yMap.put(yv, yTotal = new ArrayList<PortInst>());
+ yTotal.add(pi);
+ }
+
+ // examine histograms and generate spine runs
+ List<SteinerTreePortPair> xClusters = generateSpines(xMap);
+ List<SteinerTreePortPair> yClusters = generateSpines(yMap);
+
+ // if no clusters were found, ignore spines
+ if (xClusters.size() == 0 && yClusters.size() == 0)
+ {
+ List<SteinerTreePort> portList = new ArrayList<SteinerTreePort>();
+ for(PortInst pi : uniquePorts) portList.add(new PortInstShadow(pi));
+ SteinerTree st = new SteinerTree(portList, disableAdvancedSpineRouting);
+ for(SteinerTreePortPair stpp : st.getTreeBranches()) pairs.add(stpp);
+ return;
+ }
+
+ // eliminate spines in one axis that are in the other
+ Collections.sort(xClusters, new SortSpinesByNumberOfTaps());
+ Collections.sort(yClusters, new SortSpinesByNumberOfTaps());
+ eliminateSpinePoints(xClusters, yClusters);
+ eliminateSpinePoints(yClusters, xClusters);
+
+ // now combine all spines into a single list
+ for(SteinerTreePortPair stpp : xClusters) pairs.add(stpp);
+ for(SteinerTreePortPair stpp : yClusters) pairs.add(stpp);
+
+ // add in extra networks to connect it all together
+ List<Set<SteinerTreePort>> allPortGroups = new ArrayList<Set<SteinerTreePort>>();
+ for(SteinerTreePortPair stpp : pairs)
+ {
+ // build set of ports on this spine
+ Set<SteinerTreePort> portsInSpine = new HashSet<SteinerTreePort>();
+ portsInSpine.add(stpp.getPort1());
+ portsInSpine.add(stpp.getPort2());
+ List<PortInst> taps = stpp.getSpineTaps();
+ if (taps != null)
+ for(PortInst pi : taps) portsInSpine.add(pi);
+
+ // make list of groups that these ports are already a part of
+ Set<Set<SteinerTreePort>> foundPortGroups = new HashSet<Set<SteinerTreePort>>();
+ for(SteinerTreePort stp : portsInSpine)
{
- lowX = highX = pt.getX();
- lowY = highY = pt.getY();
- first = false;
+ Set<SteinerTreePort> portGroup = findPortGroup(stp, allPortGroups);
+ if (portGroup != null) foundPortGroups.add(portGroup);
+ }
+ if (foundPortGroups.size() == 0)
+ {
+ // nothing in this segment connects to any other segment: add this port group
+ allPortGroups.add(portsInSpine);
} else
{
- if (pt.getX() < lowX) lowX = pt.getX();
- if (pt.getX() > highX) highX = pt.getX();
- if (pt.getY() < lowY) lowY = pt.getY();
- if (pt.getY() > highY) highY = pt.getY();
+ // connects to other groups: merge these points in and reduce them to a single group
+ List<Set<SteinerTreePort>> otherPortGroups = new ArrayList<Set<SteinerTreePort>>();
+ Set<SteinerTreePort> firstPortGroup = null;
+ for(Set<SteinerTreePort> portGroup : foundPortGroups)
+ {
+ if (firstPortGroup == null)
+ {
+ // the first group: add this one's ports to it
+ firstPortGroup = portGroup;
+ for(SteinerTreePort stp : portsInSpine) firstPortGroup.add(stp);
+ } else
+ {
+ // the later groups: add to the first one and schedule them for deletion
+ for(SteinerTreePort stp : portGroup) firstPortGroup.add(stp);
+ otherPortGroups.add(portGroup);
+ }
+ }
+ for(Set<SteinerTreePort> portGroup : otherPortGroups)
+ allPortGroups.remove(portGroup);
}
}
- // see if this looks like a spine
- double width = highX - lowX, height = highY - lowY;
- if (width*SPINERATIO > height && height*SPINERATIO > width) return false;
- PortInst endA = null, endB = null;
- if (width*SPINERATIO <= height)
+ // now find ports that weren't in any cluster
+ Set<PortInst> unusedPorts = new HashSet<PortInst>();
+ for(PortInst pi : uniquePorts) unusedPorts.add(pi);
+ for(SteinerTreePortPair stpp : pairs)
+ {
+ unusedPorts.remove(stpp.getPort1());
+ unusedPorts.remove(stpp.getPort2());
+ for(PortInst pi : stpp.getSpineTaps()) unusedPorts.remove(pi);
+ }
+ for(PortInst pi : unusedPorts)
+ {
+ Set<SteinerTreePort> portsInSpine = new HashSet<SteinerTreePort>();
+ portsInSpine.add(pi);
+ allPortGroups.add(portsInSpine);
+ }
+
+ // now create nets that join the different groups
+ while (allPortGroups.size() > 1)
{
- // vertical spine, find the endpoints
- double lowestY = 0, highestY = 0;
- first = true;
- for(PortInst pi : uniquePorts)
+ // merge the first group with the closest other one
+ Set<SteinerTreePort> firstGroup = allPortGroups.get(0);
+ double bestDist = Double.MAX_VALUE;
+ Set<SteinerTreePort> bestGroup = null;
+ SteinerTreePort bestFirstPort = null, bestOtherPort = null;
+ for(int i=1; i<allPortGroups.size(); i++)
{
- EPoint pt = pi.getCenter();
- if (first)
+ Set<SteinerTreePort> otherGroup = allPortGroups.get(i);
+ for(SteinerTreePort stpFirst : firstGroup)
{
- lowestY = highestY = pt.getY();
- endA = endB = pi;
- first = false;
- } else
+ for(SteinerTreePort stpOther : otherGroup)
+ {
+ double dist = stpFirst.getCenter().distance(stpOther.getCenter());
+ if (dist < bestDist)
+ {
+ bestDist = dist;
+ bestFirstPort = stpFirst;
+ bestOtherPort = stpOther;
+ bestGroup = otherGroup;
+ }
+ }
+ }
+ }
+
+ // found the best way to merge the first group
+ SteinerTreePortPair stpp = new SteinerTreePortPair(bestFirstPort, bestOtherPort);
+ pairs.add(stpp);
+ for(SteinerTreePort stp : firstGroup) bestGroup.add(stp);
+ allPortGroups.remove(0);
+ }
+ }
+
+ private Set<SteinerTreePort> findPortGroup(SteinerTreePort pi, List<Set<SteinerTreePort>> allPortGroups)
+ {
+ for(Set<SteinerTreePort> portGroup : allPortGroups)
+ {
+ if (portGroup.contains(pi)) return portGroup;
+ }
+ return null;
+ }
+
+ /**
+ * Method to remove spines in one axis that are completely connected by spines in the other axis.
+ * @param goodSet the set being reduced.
+ * @param otherSet the other set.
+ */
+ private void eliminateSpinePoints(List<SteinerTreePortPair> goodSet, List<SteinerTreePortPair> otherSet)
+ {
+ for(int i=0; i<goodSet.size(); i++)
+ {
+ SteinerTreePortPair stpp = goodSet.get(i);
+ SteinerTreePort p1 = stpp.getPort1();
+ if (!findPortInSpine(p1, otherSet)) continue;
+ SteinerTreePort p2 = stpp.getPort2();
+ if (!findPortInSpine(p2, otherSet)) continue;
+ List<PortInst> taps = stpp.getSpineTaps();
+ if (taps != null)
+ {
+ boolean anyMissing = false;
+ for(PortInst pi : taps)
{
- if (pt.getY() < lowestY) { lowestY = pt.getX(); endA = pi; }
- if (pt.getY() > highestY) { highestY = pt.getX(); endB = pi; }
+ if (!findPortInSpine(pi, otherSet))
+ {
+ anyMissing = true;
+ break;
+ }
}
+ if (anyMissing) continue;
}
- } else
+
+ // this is duplicated: eliminate it
+ goodSet.remove(i);
+ i--;
+ }
+ }
+
+ /**
+ * Comparator class for sorting spines by the number of taps they have.
+ */
+ private static class SortSpinesByNumberOfTaps implements Comparator<SteinerTreePortPair>
+ {
+ public int compare(SteinerTreePortPair stpp1, SteinerTreePortPair stpp2)
+ {
+ List<PortInst> taps1 = stpp1.getSpineTaps();
+ List<PortInst> taps2 = stpp2.getSpineTaps();
+ int tapCount1 = taps1 == null ? 0 : taps1.size();
+ int tapCount2 = taps2 == null ? 0 : taps2.size();
+ return tapCount1 - tapCount2;
+ }
+ }
+
+ private boolean findPortInSpine(SteinerTreePort stp, List<SteinerTreePortPair> otherSet)
+ {
+ for(SteinerTreePortPair stpp : otherSet)
{
- // horizontal spine, find the endpoints
- double lowestX = 0, highestX = 0;
- first = true;
- for(PortInst pi : uniquePorts)
+ if (stpp.getPort1() == stp) return true;
+ if (stpp.getPort2() == stp) return true;
+ List<PortInst> taps = stpp.getSpineTaps();
+ if (taps != null)
{
- EPoint pt = pi.getCenter();
- if (first)
+ for(PortInst pi : taps) if (pi == stp) return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Method to reduce a histogram of ports to a collection of nets (both simple and spine).
+ * @param map a Map from X or Y coordinates to lists of ports on those coordinates.
+ * @return a List of SteinerTreePortPair nets that connect two points
+ * (and optionally include spine tap points in the middle).
+ */
+ private List<SteinerTreePortPair> generateSpines(Map<Double,List<PortInst>> map)
+ {
+ List<List<PortInst>> clusters = new ArrayList<List<PortInst>>();
+ List<Double> mapCoords = new ArrayList<Double>();
+ for(Double v : map.keySet()) mapCoords.add(v);
+ int startIndex = 0;
+ List<PortInst> bestCluster = null;
+ for(int index = 0; index<mapCoords.size(); index++)
+ {
+ // get bounds of range of coordinates
+ int total = 0;
+ double lowX = 0, highX = 0, lowY = 0, highY = 0;
+ for(int i = startIndex; i <= index; i++)
+ {
+ Double v = mapCoords.get(i);
+ List<PortInst> ports = map.get(v);
+ for(PortInst pi : ports)
{
- lowestX = highestX = pt.getX();
- endA = endB = pi;
- first = false;
- } else
+ EPoint pt = pi.getCenter();
+ if (total == 0)
+ {
+ lowX = highX = pt.getX();
+ lowY = highY = pt.getY();
+ } else
+ {
+ if (pt.getX() < lowX) lowX = pt.getX();
+ if (pt.getX() > highX) highX = pt.getX();
+ if (pt.getY() < lowY) lowY = pt.getY();
+ if (pt.getY() > highY) highY = pt.getY();
+ }
+ total++;
+ }
+ }
+ double width = highX - lowX, height = highY - lowY;
+ if (width*SPINERATIO > height && height*SPINERATIO > width)
+ {
+ // not a cluster
+ if (bestCluster != null) clusters.add(bestCluster);
+ bestCluster = null;
+ startIndex = index;
+ index--;
+ } else
+ {
+ // a good cluster (if it has enough points)
+ List<PortInst> cluster = new ArrayList<PortInst>();
+ for(int i = startIndex; i <= index; i++)
{
- if (pt.getX() < lowestX) { lowestX = pt.getX(); endA = pi; }
- if (pt.getX() > highestX) { highestX = pt.getX(); endB = pi; }
+ Double v = mapCoords.get(i);
+ List<PortInst> ports = map.get(v);
+ for(PortInst pi : ports) cluster.add(pi);
}
+ if (cluster.size() > 2) bestCluster = cluster;
}
}
- if (endA == null || endB == null || endA == endB) return false;
+ if (bestCluster != null) clusters.add(bestCluster);
- // this is a spine: add non-endpoints to the tap list
- spineTapPorts = new ArrayList<PortInst>();
- for(PortInst pi : uniquePorts)
+ // build spines for every cluster
+ List<SteinerTreePortPair> pairs = new ArrayList<SteinerTreePortPair>();
+ for(List<PortInst> cluster : clusters)
{
- if (pi != endA && pi != endB) spineTapPorts.add(pi);
+ // find the point farthest from the first one
+ PortInst first = cluster.get(0);
+ EPoint firstPT = first.getCenter();
+ double bestDist = 0;
+ PortInst end1 = null, end2 = null;
+ for(int i=1; i<cluster.size(); i++)
+ {
+ PortInst pi = cluster.get(i);
+ EPoint pt = pi.getCenter();
+ double dist = firstPT.distance(pt);
+ if (dist > bestDist)
+ {
+ bestDist = dist;
+ end1 = pi;
+ }
+ }
+ EPoint end1PT = end1.getCenter();
+
+ // find the point farthest from the far one
+ bestDist = 0;
+ for(int i=0; i<cluster.size(); i++)
+ {
+ PortInst pi = cluster.get(i);
+ if (pi == end1) continue;
+ EPoint pt = pi.getCenter();
+ double dist = end1PT.distance(pt);
+ if (dist > bestDist)
+ {
+ bestDist = dist;
+ end2 = pi;
+ }
+ }
+ SteinerTreePortPair stpp = new SteinerTreePortPair(end1, end2);
+ for(int i=0; i<cluster.size(); i++)
+ {
+ PortInst pi = cluster.get(i);
+ if (pi != end1 && pi != end2)
+ stpp.addTapPort(pi);
+ }
+ pairs.add(stpp);
}
- pairs.add(new SteinerTreePortPair(endA, endB));
- return true;
+ return pairs;
}
/**
* Method to sort RoutesOnNetwork by their network name.
*/
- public int compareTo(RoutesOnNetwork other) { return netName.compareTo(other.netName); }
+ public int compareTo(RoutesOnNetwork other) { return getName().compareTo(other.getName()); }
}
private RouteBatch[] makeListOfRoutes(Netlist netList, List<ArcInst> arcsToRoute, List<EPoint> linesInNonMahnattan)
@@ -7404,7 +9537,10 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
List<RoutesOnNetwork> allRoutes = new ArrayList<RoutesOnNetwork>();
List<Network> allNets = new ArrayList<Network>();
for(Network net : seen.keySet()) allNets.add(net);
- Collections.sort(allNets);
+
+ if (prefs.netOrder == SoGNetOrder.SOGNETORDERORIGINAL)
+ Collections.sort(allNets);
+
for(Network net : allNets)
{
RoutesOnNetwork ron = new RoutesOnNetwork(net.getName());
@@ -7421,22 +9557,25 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
warn("Arc " + describe(ai) + " has an unconnectable end (on " + ai.getTailPortInst().getNodeInst().describe(false) + ")");
}
+ // see if reconfiguration of routing is prevented
if (sogp.isSteinerDone())
{
+ // unrouted wires define the exact routing configuration, so don't do spine detection or Steiner tree reorganization
for (ArcInst ai : arcsOnNet)
- ron.pairs.add(new SteinerTreePortPair(ai.getHeadPortInst(), ai.getTailPortInst()));
+ ron.getPairs().add(new SteinerTreePortPair(ai.getHeadPortInst(), ai.getTailPortInst()));
} else
{
- // see if this is a spine route
- if (prefs.enableSpineRouting && ron.setupSpineInfo())
+ // see if spine routing is enabled
+ if (prefs.enableSpineRouting)
{
- // a spine route
+ // decompose into spines
+ ron.setupSpineInfo(prefs.disableAdvancedSpineRouting);
} else
{
- // a non-spine route
+ // do not consider look for spines: just do Steiner tree reorganization
List<SteinerTreePort> portList = new ArrayList<SteinerTreePort>();
for(PortInst pi : ron.unorderedPorts) portList.add(new PortInstShadow(pi));
- SteinerTree st = new SteinerTree(portList);
+ SteinerTree st = new SteinerTree(portList, prefs.disableAdvancedSpineRouting);
ron.pairs = st.getTreeBranches();
if (ron.pairs == null)
{
@@ -7454,6 +9593,13 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
}
}
+ // if debugging spine information, compute it and finish
+ if (RoutingDebug.isShowingSpines())
+ {
+ RoutingDebug.showSpineNetworks(allRoutes);
+ return new RouteBatch[0];
+ }
+
// build the R-Tree
if (buildRTrees(netList, arcsToRoute, linesInNonMahnattan))
{
@@ -7470,11 +9616,12 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
{
// determine the minimum width of arcs on this net
double minWidth = getMinWidth(ron.unorderedPorts);
- for(int i=0; i<ron.pairs.size(); i++)
+ for(int i=0; i<ron.getPairs().size(); i++)
{
- Object obj1 = ron.pairs.get(i).getPort1();
+ SteinerTreePortPair stpp = ron.getPairs().get(i);
+ Object obj1 = stpp.getPort1();
if (obj1 instanceof PortInstShadow) obj1 = ((PortInstShadow)obj1).getPortInst();
- Object obj2 = ron.pairs.get(i).getPort2();
+ Object obj2 = stpp.getPort2();
if (obj2 instanceof PortInstShadow) obj2 = ((PortInstShadow)obj2).getPortInst();
PortInst aPi = (PortInst)obj1;
PortInst bPi = (PortInst)obj2;
@@ -7486,7 +9633,7 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
if (bArc == null) continue;
// create the NeededRoute
- NeededRoute nr = new NeededRoute(ron.netName, aPi, bPi, aArc, bArc, ron.spineTapPorts, minWidth);
+ NeededRoute nr = new NeededRoute(ron.getName(), aPi, bPi, aArc, bArc, stpp.getSpineTaps(), minWidth);
// set the network number on this net
Iterator<ArcInst> it = ron.unroutedArcs.iterator();
@@ -7496,7 +9643,9 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
nr.growNetwork();
// check endpoints and place contacts there if needed
- if (nr.invalidPort(true, aPi) || nr.invalidPort(false, bPi)) continue;
+ boolean aInvalid = nr.invalidPort(true, false, aPi);
+ boolean bInvalid = nr.invalidPort(false, false, bPi);
+ if (aInvalid || bInvalid) continue;
ron.neededRoutes.add(nr);
}
@@ -7514,7 +9663,7 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
int thisNetNumber = nr.netID.intValue();
if (netNumber < 0) netNumber = thisNetNumber;
if (netNumber != thisNetNumber)
- error("Error: network " + ron.netName + " has network IDs " + netNumber + " and " + thisNetNumber);
+ error("Error: network " + ron.getName() + " has network IDs " + netNumber + " and " + thisNetNumber);
}
Integer id = Integer.valueOf(netNumber);
Set<RoutesOnNetwork> mergedRoutes = uniqueNets.get(id);
@@ -7532,7 +9681,7 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
{
if (rb == null)
{
- rb = new RouteBatch(ron.netName);
+ rb = new RouteBatch(ron.getName());
allBatches.add(rb);
}
for(ArcInst ai : ron.unroutedArcs)
@@ -7582,7 +9731,8 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
}
// sort batches
- Collections.sort(allBatches);
+ if (prefs.netOrder == SoGNetOrder.SOGNETORDERORIGINAL)
+ Collections.sort(allBatches);
RouteBatch[] routeBatches = new RouteBatch[allBatches.size()];
for(int i=0; i<allBatches.size(); i++)
@@ -7592,11 +9742,18 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
{
for(NeededRoute nr : rb.routesInBatch)
{
- if (nr.spineTaps != null) nr.routeName += " (spine)"; else
+ boolean paren = false;
+ if (nr.batch.routesInBatch.size() > 1)
+ {
+ nr.routeName += " (" + (nr.routeInBatch+1) + " of " + nr.batch.routesInBatch.size();
+ paren = true;
+ }
+ if (nr.spineTaps != null)
{
- if (nr.batch.routesInBatch.size() > 1)
- nr.routeName += " (" + (nr.routeInBatch+1) + " of " + nr.batch.routesInBatch.size() + ")";
+ nr.routeName += (paren ? ", " : " (") + "spine";
+ paren = true;
}
+ if (paren) nr.routeName += ")";
}
}
return routeBatches;
@@ -7634,11 +9791,11 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
// special case when route is null length
Wavefront d1 = nr.dirAtoB;
Wavefront d2 = nr.dirBtoA;
- if (DBMath.rectsIntersect(d1.fromRect, d1.toRect) && d1.toZ == d1.fromZ)
+ if (DBMath.rectsIntersect(d1.fromRect, d1.toPE.getRect()) && d1.toZ == d1.fromZ)
{
- double xVal = (Math.max(d1.fromRect.getMinX(), d1.toRect.getMinX()) + Math.min(d1.fromRect.getMaxX(), d1.toRect.getMaxX())) / 2;
- double yVal = (Math.max(d1.fromRect.getMinY(), d1.toRect.getMinY()) + Math.min(d1.fromRect.getMaxY(), d1.toRect.getMaxY())) / 2;
- SearchVertex sv = new SearchVertex(xVal, yVal, d1.toZ, d1.toC, 0, null, null, 0, d1, 0);
+ double xVal = (Math.max(d1.fromRect.getMinX(), d1.toPE.getRect().getMinX()) + Math.min(d1.fromRect.getMaxX(), d1.toPE.getRect().getMaxX())) / 2;
+ double yVal = (Math.max(d1.fromRect.getMinY(), d1.toPE.getRect().getMinY()) + Math.min(d1.fromRect.getMaxY(), d1.toPE.getRect().getMaxY())) / 2;
+ SearchVertex sv = new SearchVertex(xVal, yVal, d1.toZ, d1.toC, 0, null, null, 0, d1, 0, null);
if (nr.debuggingRouteFromA != null) RoutingDebug.ensureDebuggingShadow(sv, false);
nr.completeRoute(sv);
return null;
@@ -7759,17 +9916,6 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
// routing completed
boolean aGood = resultA != null && resultA != svAbandoned && resultA != svLimited && resultA != svExhausted;
boolean bGood = resultB != null && resultB != svAbandoned && resultB != svLimited && resultB != svExhausted;
-//String aNature = "succeeded";
-//if (resultA == null) aNature = "null"; else
-// if (resultA == svAbandoned) aNature = "abandoned"; else
-// if (resultA == svLimited) aNature = "limited"; else
-// if (resultA == svExhausted) aNature = "exhausted";
-//String bNature = "succeeded";
-//if (resultB == null) bNature = "null"; else
-// if (resultB == svAbandoned) bNature = "abandoned"; else
-// if (resultB == svLimited) bNature = "limited"; else
-// if (resultB == svExhausted) bNature = "exhausted";
-//System.out.println("ROUTE "+nr.routeName+" HAS A="+aNature+" AND B="+bNature);
if (aGood && bGood)
{
// both directions completed: choose the best
@@ -7811,7 +9957,6 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
}
}
-//System.out.println("ROUTE "+nr.routeName+" HAS A-LENGTH="+TextUtils.formatDistance(aLength)+" AND B-LENGTH="+TextUtils.formatDistance(bLength));
if (aLength < bLength || (aLength == bLength && aVias < bVias))
{
// A is better
@@ -7837,6 +9982,7 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
{
if (resultA == null) resultA = dirAtoB.advanceWavefront();
if (resultB == null) resultB = dirBtoA.advanceWavefront();
+
if (resultA != null || resultB != null)
{
if (resultA == svAborted || resultB == svAborted)
@@ -7879,7 +10025,8 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
*/
private SearchVertex tryToFindPath(Wavefront a, Wavefront b)
{
- SearchVertex bestSVA = null, bestSVB = null;
+ List<SearchVertex> bestPath = null;
+ SearchVertex bestSV = null;
double bestDistance = Double.MAX_VALUE;
for(int z=0; z<a.searchVertexPlanes.length; z++)
{
@@ -7895,85 +10042,156 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
SearchVertex foundInA = row.get(x);
double xCoord = x.intValue() / DBMath.GRID;
SearchVertex foundInB = b.getVertex(xCoord, yCoord, z);
- if (foundInB != null)
+ if (foundInB == null) continue;
+
+ // found a common point in the two wavefronts, check lengths against previous common point
+ double total = 0;
+ for(SearchVertex sv = foundInA; sv != null; sv = sv.last)
+ {
+ SearchVertex prev = sv.last;
+ if (prev == null) break;
+ double dX = sv.getX() - prev.getX();
+ double dY = sv.getY() - prev.getY();
+ total += Math.sqrt(dX*dX + dY*dY);
+ if (sv.getZ() != prev.getZ()) total++;
+ }
+ for(SearchVertex sv = foundInB; sv != null; sv = sv.last)
+ {
+ SearchVertex prev = sv.last;
+ if (prev == null) break;
+ double dX = sv.getX() - prev.getX();
+ double dY = sv.getY() - prev.getY();
+ total += Math.sqrt(dX*dX + dY*dY);
+ if (sv.getZ() != prev.getZ()) total++;
+ }
+ boolean better = DBMath.isLessThan(total, bestDistance);
+ if (!better) continue;
+
+ // see if the two halves have via contact issues
+ boolean fail = false;
+ for(SearchVertex sv = foundInB; sv != null; sv = sv.last)
+ {
+ if (sv.getSize() == null) continue;
+ SearchVertex lastSv = sv.last;
+ if (lastSv == null) continue;
+ int lowMetal = Math.min(sv.getZ(), lastSv.getZ());
+ int highMetal = Math.max(sv.getZ(), lastSv.getZ());
+ for(Poly conPoly : sv.getCutPolys())
+ {
+ String error = a.validCut(foundInA, lowMetal, highMetal, conPoly.getBounds2D(), conPoly.getLayer());
+ if (error != null) { fail = true; break; }
+ }
+ if (fail) break;
+ }
+ if (fail) continue;
+ for(SearchVertex sv = foundInA; sv != null; sv = sv.last)
{
- // found a common point in the two wavefronts
- double total = 0;
- for(SearchVertex sv = foundInA; sv != null; sv = sv.last)
+ if (sv.getSize() == null) continue;
+ SearchVertex lastSv = sv.last;
+ if (lastSv == null) continue;
+ int lowMetal = Math.min(sv.getZ(), lastSv.getZ());
+ int highMetal = Math.max(sv.getZ(), lastSv.getZ());
+ for(Poly conPoly : sv.getCutPolys())
{
- SearchVertex prev = sv.last;
- if (prev == null) break;
- double dX = sv.getX() - prev.getX();
- double dY = sv.getY() - prev.getY();
- total += Math.sqrt(dX*dX + dY*dY);
- if (sv.getZ() != prev.getZ()) total++;
+ String error = b.validCut(foundInB, lowMetal, highMetal, conPoly.getBounds2D(), conPoly.getLayer());
+ if (error != null) { fail = true; break; }
}
- for(SearchVertex sv = foundInB; sv != null; sv = sv.last)
+ if (fail) break;
+ }
+ if (fail) continue;
+
+ // see if minimum area rules stop this connection
+ SearchVertex svCurrent = null;
+ List<SearchVertex> halfPath = new ArrayList<SearchVertex>();
+ SearchVertex svBuild = foundInB;
+ while (svBuild != null)
+ {
+ SearchVertex svAdd = new SearchVertex(svBuild);
+ if (svCurrent == null && halfPath.size() > 0 && halfPath.get(halfPath.size()-1).getZ() != svAdd.getZ())
+ svCurrent = halfPath.get(halfPath.size()-1);
+ halfPath.add(svAdd);
+ svBuild = svBuild.last;
+ }
+ List<SearchVertex> path = new ArrayList<SearchVertex>();
+ Point2D lastSize = null;
+ Poly[] lastCuts = null;
+ int lastCutNumber = 0;
+ for(int i=0; i<halfPath.size(); i++)
+ {
+ SearchVertex thisOne = halfPath.get(i);
+ Point2D thisSize = thisOne.size;
+ Poly[] thisCuts = thisOne.getCutPolys();
+ int thisCutNumber = thisOne.zv & 0xFF;
+
+ thisOne.size = lastSize;
+ thisOne.cutPolys = lastCuts;
+ thisOne.zv = (thisOne.zv & 0xFFFFFF00) | (lastCutNumber & 0xFF);
+
+ lastSize = thisSize;
+ lastCuts = thisCuts;
+ lastCutNumber = thisCutNumber;
+ }
+ for(int i=halfPath.size()-1; i>=0; i--)
+ path.add(halfPath.get(i));
+ svBuild = foundInA;
+ while (svBuild != null)
+ {
+ path.add(new SearchVertex(svBuild));
+ svBuild = svBuild.last;
+ }
+ for(int i=0; i<path.size()-1; i++)
+ {
+ SearchVertex sv1 = path.get(i);
+ SearchVertex sv2 = path.get(i+1);
+ sv1.last = sv2;
+ }
+ path.get(path.size()-1).last = null;
+
+ boolean finalDest = false;
+ if (svCurrent == null) { svCurrent = path.get(0); finalDest = true; }
+ StringBuffer message = new StringBuffer();
+ MutableBoolean err = new MutableBoolean(false);
+ SearchVertexAddon sva = a.determineMinimumArea(svCurrent, svCurrent.getX(), svCurrent.getY(), svCurrent.getC(), svCurrent.getZ(),
+ svCurrent.getC(), svCurrent.getZ(), null, 0, 0, err, message, finalDest);
+ if (sva != null)
+ {
+ SearchVertex svGoodInsertion = null, svAnyInsertion = null;
+ for(SearchVertex sv = svCurrent; sv != null; sv = sv.last)
{
- SearchVertex prev = sv.last;
- if (prev == null) break;
- double dX = sv.getX() - prev.getX();
- double dY = sv.getY() - prev.getY();
- total += Math.sqrt(dX*dX + dY*dY);
- if (sv.getZ() != prev.getZ()) total++;
+ if (sv.addOn == null)
+ {
+ if (svAnyInsertion == null) svAnyInsertion = sv;
+ if (sv.getZ() != svCurrent.getZ())
+ {
+ svGoodInsertion = sv;
+ break;
+ }
+ }
}
-
- // see if this is the best so far
- boolean better = DBMath.isLessThan(total, bestDistance);
- if (better)
+ if (svGoodInsertion != null) svGoodInsertion.addOn = sva; else
+ if (svAnyInsertion != null) svAnyInsertion.addOn = sva; else
{
- bestDistance = total;
- bestSVA = foundInA;
- bestSVB = foundInB;
+ System.out.println("!!!!!!!!!!! ERROR: Failed to insert minimum area geometry " +
+ TextUtils.formatDistance(sva.addedGeometry[0].getMinX()) + "<=X<=" + TextUtils.formatDistance(sva.addedGeometry[0].getMaxX()) +
+ " AND " + TextUtils.formatDistance(sva.addedGeometry[0].getMinY()) + "<=Y<=" + TextUtils.formatDistance(sva.addedGeometry[0].getMaxY()) +
+ "," + sva.pureLayerNode.describe(false));
+ continue;
}
}
+ if (err.booleanValue()) continue;
+
+ // intersection is valid, save it
+ bestDistance = total;
+ bestPath = path;
+ bestSV = foundInA;
}
}
}
- if (bestSVA != null)
+ if (bestPath != null)
{
System.out.println("Network " + a.nr.routeName + " failed in both directions, but found a common point at (" +
- TextUtils.formatDistance(bestSVA.xv) + "," + TextUtils.formatDistance(bestSVA.yv) + ")");
- List<SearchVertex> halfPath = new ArrayList<SearchVertex>();
- while (bestSVB != null)
- {
- halfPath.add(bestSVB);
- bestSVB = bestSVB.last;
- }
- List<SearchVertex> path = new ArrayList<SearchVertex>();
- Point2D lastSize = null;
- Rectangle2D[] lastCuts = null;
- int lastCutNumber = 0;
- for(int i=0; i<halfPath.size(); i++)
- {
- SearchVertex thisOne = halfPath.get(i);
- Point2D thisSize = thisOne.size;
- Rectangle2D[] thisCuts = thisOne.getCutRects();
- int thisCutNumber = thisOne.zv & 0xFF;
-
- thisOne.size = lastSize;
- thisOne.cutRects = lastCuts;
- thisOne.zv = (thisOne.zv & 0xFFFFFF00) | (lastCutNumber & 0xFF);
-
- lastSize = thisSize;
- lastCuts = thisCuts;
- lastCutNumber = thisCutNumber;
- }
- for(int i=halfPath.size()-1; i>=0; i--)
- path.add(halfPath.get(i));
- while (bestSVA != null)
- {
- path.add(bestSVA);
- bestSVA = bestSVA.last;
- }
- for(int i=0; i<path.size()-1; i++)
- {
- SearchVertex sv1 = path.get(i);
- SearchVertex sv2 = path.get(i+1);
- sv1.last = sv2;
- }
- path.get(path.size()-1).last = null;
- SearchVertex result = path.get(0);
+ TextUtils.formatDistance(bestSV.xv) + "," + TextUtils.formatDistance(bestSV.yv) + ")");
+ SearchVertex result = bestPath.get(0);
result.wf = a;
return result;
}
@@ -8044,51 +10262,50 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
* @param cut2HY via #2 high Y.
* @return the corner-to-corner distance of the vias (0 if they touch or overlap).
*/
- private double cutDistance(double cut1LX, double cut1HX, double cut1LY, double cut1HY,
- double cut2LX, double cut2HX, double cut2LY, double cut2HY)
+ private double cutDistance(Rectangle2D cut1, Rectangle2D cut2)
{
- if (cut1LX <= cut2HX && cut1HX >= cut2LX)
+ if (cut1.getMinX() <= cut2.getMaxX() && cut1.getMaxX() >= cut2.getMinX())
{
- if (cut1LY <= cut2HY && cut1HY >= cut2LY)
+ if (cut1.getMinY() <= cut2.getMaxY() && cut1.getMaxY() >= cut2.getMinY())
{
// contacts touch
return 0;
} else
{
// contacts are one above the other
- if ((cut1LY+cut1HY)/2 > (cut2LY+cut2HY)/2)
- return cut1LY - cut2HY; else
- return cut2LY - cut1HY;
+ if ((cut1.getMinY()+cut1.getMaxY())/2 > (cut2.getMinY()+cut2.getMaxY())/2)
+ return cut1.getMinY() - cut2.getMaxY(); else
+ return cut2.getMinY() - cut1.getMaxY();
}
} else
{
- if (cut1LY <= cut2HY && cut1HY >= cut2LY)
+ if (cut1.getMinY() <= cut2.getMaxY() && cut1.getMaxY() >= cut2.getMinY())
{
// contacts are side-by-side
- if ((cut1LX+cut1HX)/2 > (cut2LX+cut2HX)/2)
- return cut1LX - cut2HX; else
- return cut2LX - cut1HX;
+ if ((cut1.getMinX()+cut1.getMaxX())/2 > (cut2.getMinX()+cut2.getMaxX())/2)
+ return cut1.getMinX() - cut2.getMaxX(); else
+ return cut2.getMinX() - cut1.getMaxX();
}
// diagonal offset, compute Euclidean distance to corners
double cut2CornerX, cut2CornerY, cut1CornerX, cut1CornerY;
- if ((cut2LX+cut2HX)/2 < (cut1LX+cut1HX)/2)
+ if ((cut2.getMinX()+cut2.getMaxX())/2 < (cut1.getMinX()+cut1.getMaxX())/2)
{
- cut2CornerX = cut2HX;
- cut1CornerX = cut1LX;
+ cut2CornerX = cut2.getMaxX();
+ cut1CornerX = cut1.getMinX();
} else
{
- cut2CornerX = cut2LX;
- cut1CornerX = cut1HX;
+ cut2CornerX = cut2.getMinX();
+ cut1CornerX = cut1.getMaxX();
}
- if ((cut2LY+cut2HY)/2 < (cut1LY+cut1HY)/2)
+ if ((cut2.getMinY()+cut2.getMaxY())/2 < (cut1.getMinY()+cut1.getMaxY())/2)
{
- cut2CornerY = cut2HY;
- cut1CornerY = cut1LY;
+ cut2CornerY = cut2.getMaxY();
+ cut1CornerY = cut1.getMinY();
} else
{
- cut2CornerY = cut2LY;
- cut1CornerY = cut1HY;
+ cut2CornerY = cut2.getMinY();
+ cut1CornerY = cut1.getMaxY();
}
double dX = cut2CornerX - cut1CornerX, dY = cut2CornerY - cut1CornerY;
return Math.sqrt(dX*dX + dY*dY);
@@ -8109,8 +10326,9 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
{
Connection c = it.next();
ArcInst ai = c.getArc();
- if (sogp.isPrevented(ai.getProto())) continue;
- if (!ai.getProto().getFunction().isMetal()) continue;
+ ArcProto ap = ai.getProto();
+ if (sogp.isPrevented(ap)) continue;
+ if (!ap.getFunction().isMetal()) continue;
double newWidth = ai.getLambdaBaseWidth();
if (newWidth > width) width = newWidth;
}
@@ -8148,39 +10366,40 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
/**
* Method to convert a linked list of SearchVertex objects to an optimized path.
- * @param initialThread the initial SearchVertex in the linked list.
- * @return a List of SearchVertex objects optimized to consolidate runs in the X or Y axes.
+ * Consolidates runs in the X or Y axes.
+ * @param initialVertex the initial SearchVertex in the linked list.
+ * @param realVertices a List where the optimized vertices will be stored.
*/
- void getOptimizedList(SearchVertex initialThread, List<SearchVertex> realVertices)
+ void getOptimizedList(SearchVertex initialVertex, List<SearchVertex> realVertices)
{
realVertices.clear();
- SearchVertex thread = initialThread;
- if (thread != null)
+ SearchVertex vertex = initialVertex;
+ if (vertex != null)
{
- SearchVertex lastVertex = thread;
+ SearchVertex lastVertex = vertex;
+ vertex = vertex.last;
realVertices.add(lastVertex);
- thread = thread.last;
- while (thread != null)
+ while (vertex != null)
{
- if (lastVertex.getZ() != thread.getZ())
+ if (lastVertex.getZ() != vertex.getZ())
{
- realVertices.add(thread);
- lastVertex = thread;
- thread = thread.last;
+ lastVertex = vertex;
+ vertex = vertex.last;
+ realVertices.add(lastVertex);
} else
{
// gather a run of vertices on this layer
- double dx = thread.getX() - lastVertex.getX();
- double dy = thread.getY() - lastVertex.getY();
- lastVertex = thread;
- thread = thread.last;
- while (thread != null)
- {
- if (lastVertex.getZ() != thread.getZ()) break;
- if ((dx == 0 && thread.getX() - lastVertex.getX() != 0) ||
- (dy == 0 && thread.getY() - lastVertex.getY() != 0)) break;
- lastVertex = thread;
- thread = thread.last;
+ double dx = vertex.getX() - lastVertex.getX();
+ double dy = vertex.getY() - lastVertex.getY();
+ lastVertex = vertex;
+ vertex = vertex.last;
+ while (vertex != null)
+ {
+ if (lastVertex.getZ() != vertex.getZ()) break;
+ if ((dx == 0 && vertex.getX() - lastVertex.getX() != 0) ||
+ (dy == 0 && vertex.getY() - lastVertex.getY() != 0)) break;
+ lastVertex = vertex;
+ vertex = vertex.last;
}
realVertices.add(lastVertex);
}
@@ -8278,8 +10497,8 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
total++;
} else
{
- RTNode<SOGBound> subrt = branch.getChildTree(i);
- total += getNumLeafs(subrt);
+ RTNode<SOGBound> subrt = branch.getChildTree(i);
+ total += getNumLeafs(subrt);
}
}
return total;
@@ -8344,7 +10563,7 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
for (Iterator<SOGBound> sea = bTree.search(rect); sea.hasNext();)
{
SOGBound sBound = sea.next();
- if (sBound.maskLayer != metCol) continue;
+ if (sBound.getMaskColor() != metCol) continue;
Rectangle2D bound = sBound.getBounds();
if (bound.getMaxX() <= rect.getMinX() || bound.getMinX() >= rect.getMaxX() ||
bound.getMaxY() <= rect.getMinY() || bound.getMinY() >= rect.getMaxY()) continue;
@@ -8363,13 +10582,13 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
for(SOGBound s : thingsThatGetRemoved)
{
PolyMerge merge = new PolyMerge();
- merge.addRectangle(metLayer, s.bound);
+ merge.addRectangle(metLayer, s.getBounds());
merge.subtract(metLayer, new Poly(rect));
List<PolyBase> remaining = merge.getMergedPoints(metLayer, true);
for(PolyBase pb : remaining)
{
ERectangle reducedBound = ERectangle.fromLambda(pb.getBounds2D());
- SOGBound sogb = new SOGBound(reducedBound, s.getNetID(), s.maskLayer);
+ SOGBound sogb = new SOGBound(reducedBound, s.getNetID(), s.getMaskColor());
RTNode<SOGBound> newRootFixp = RTNode.linkGeom(null, rootFixp, sogb);
if (newRootFixp != rootFixp) bTree.setRoot(rootFixp = newRootFixp);
}
@@ -8474,11 +10693,11 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
/**
* Method to parse the exclusion layer on the Generic:RoutingNode object.
* Examples:
- * "" no layers excluded
- * "ALL" all layers excluded
- * "1" Metal 1 excluded
- * "3,5" Metals 3 and 5 excluded
- * "2-6" Metals 2 through 6 excluded
+ * "" no layers excluded
+ * "ALL" all layers excluded
+ * "1" Metal 1 excluded
+ * "3,5" Metals 3 and 5 excluded
+ * "2-6" Metals 2 through 6 excluded
* @param layers the string with the exclusion layers
* @return a List of Integers with exclusion layers
*/
@@ -8624,16 +10843,17 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
if (sBound instanceof SOGPoly) continue;
// if an existing bound is bigger than new one, ignore this
- if (sBound.bound.getMinX() <= bounds.getMinX() &&
- sBound.bound.getMaxX() >= bounds.getMaxX() &&
- sBound.bound.getMinY() <= bounds.getMinY() &&
- sBound.bound.getMaxY() >= bounds.getMaxY()) return null;
+ ERectangle r = sBound.getBounds();
+ if (r.getMinX() <= bounds.getMinX() &&
+ r.getMaxX() >= bounds.getMaxX() &&
+ r.getMinY() <= bounds.getMinY() &&
+ r.getMaxY() >= bounds.getMaxY()) return null;
// if new one is bigger than an existing bound, remove existing one
- if (bounds.getMinX() <= sBound.bound.getMinX() &&
- bounds.getMaxX() >= sBound.bound.getMaxX() &&
- bounds.getMinY() <= sBound.bound.getMinY() &&
- bounds.getMaxY() >= sBound.bound.getMaxY())
+ if (bounds.getMinX() <= r.getMinX() &&
+ bounds.getMaxX() >= r.getMaxX() &&
+ bounds.getMinY() <= r.getMinY() &&
+ bounds.getMaxY() >= r.getMaxY())
{
if (removeThese == null) removeThese = new ArrayList<SOGBound>();
removeThese.add(sBound);
@@ -8711,9 +10931,25 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
private void addVia(ERectangle rect, Layer layer, MutableInteger netID, boolean lockTree)
{
BlockageTree bTree = rTrees.getViaTree(layer);
+
+ // remove duplicate vias and favor colored ones
+ int color = layer.getFunction().getMaskColor();
+ for(Iterator<SOGBound> it = bTree.search(rect); it.hasNext(); )
+ {
+ SOGBound sogb = it.next();
+ if (sogb.getBounds().getCenterX() == rect.getCenterX() && sogb.getBounds().getCenterY() == rect.getCenterY())
+ {
+ // found existing via at this location
+ if (sogb.getMaskColor() == 0 && color != 0)
+ sogb.setMaskColor(color);
+ return;
+ }
+ }
+
if (lockTree) bTree.lock();
try {
SOGBound sogb = new SOGVia(rect, netID);
+ sogb.setMaskColor(color);
RTNode<SOGBound> rootFixp = bTree.getRoot();
if (rootFixp == null)
{
@@ -8758,24 +10994,16 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
private class BlockageTrees
{
-// private final BlockageTree[][] metalTrees; // TODO: trees for every mask color
- private final BlockageTree[] metalTrees; // trees ignore mask color
-
+ private final BlockageTree[] metalTrees;
private final BlockageTree[] viaTrees;
BlockageTrees(int numMetals)
{
-// metalTrees = new BlockageTree[numMetals][]; // TODO: trees for every mask color
- metalTrees = new BlockageTree[numMetals]; // trees ignore mask color
-
+ metalTrees = new BlockageTree[numMetals];
viaTrees = new BlockageTree[numMetals];
for (int i = 0; i < metalTrees.length; i++)
{
-// metalTrees[i] = new BlockageTree[metalArcs[i].length]; // TODO: trees for every mask color
-// for(int c=0; c<metalArcs[i].length; c++)
-// metalTrees[i][c] = new BlockageTree(null);
- metalTrees[i] = new BlockageTree(null); // trees ignore mask color
-
+ metalTrees[i] = new BlockageTree(null);
viaTrees[i] = new BlockageTree(null);
}
}
@@ -8824,7 +11052,9 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
// update all MutableIntegers with the old value
List<MutableInteger> oldNetIDs = netIDsByValue.get(Integer.valueOf(netID.intValue()));
if (oldNetIDs == null) return;
- List<MutableInteger> newNetIDs = netIDsByValue.get(Integer.valueOf(n.intValue()));
+ Integer netIDI = Integer.valueOf(n.intValue());
+ List<MutableInteger> newNetIDs = netIDsByValue.get(netIDI);
+ if (newNetIDs == null) netIDsByValue.put(netIDI, newNetIDs = new ArrayList<MutableInteger>());
for(MutableInteger mi : oldNetIDs)
{
mi.setValue(n.intValue());
@@ -8890,6 +11120,10 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
@Override
public ERectangle getBounds() { return bound; }
+ public int getMaskColor() { return maskLayer; }
+
+ public void setMaskColor(int c) { maskLayer = c; }
+
public boolean containsPoint(double x, double y)
{
return x >= bound.getMinX() && x <= bound.getMaxX() && y >= bound.getMinY() && y <= bound.getMaxY();
@@ -9048,10 +11282,10 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
GRNet nn = null;
for(NeededRoute nr : rb.routesInBatch)
{
- int x1 = (int)((nr.aX - bounds.getMinX()) / bucketWidth);
- int y1 = (int)((nr.aY - bounds.getMinY()) / bucketHeight);
- int x2 = (int)((nr.bX - bounds.getMinX()) / bucketWidth);
- int y2 = (int)((nr.bY - bounds.getMinY()) / bucketHeight);
+ int x1 = (int)((nr.aEndpoints.getCenterX() - bounds.getMinX()) / bucketWidth);
+ int y1 = (int)((nr.aEndpoints.getCenterY() - bounds.getMinY()) / bucketHeight);
+ int x2 = (int)((nr.bEndpoints.getCenterX() - bounds.getMinX()) / bucketWidth);
+ int y2 = (int)((nr.bEndpoints.getCenterY() - bounds.getMinY()) / bucketHeight);
int bucket1 = y1*numXBuckets + x1;
int bucket2 = y2*numXBuckets + x2;
if (bucket1 == bucket2) continue;
@@ -9061,7 +11295,7 @@ System.out.println("WARNING: Placing Universal arc on route from port "+from.get
nn = new GRNet();
nets.add(nn);
}
- GRWire w = new GRWire(nr, buckets[bucket1], buckets[bucket2], EPoint.fromLambda(nr.aX, nr.aY), EPoint.fromLambda(nr.bX, nr.bY));
+ GRWire w = new GRWire(nr, buckets[bucket1], buckets[bucket2], nr.aEndpoints.getCenter(), nr.bEndpoints.getCenter());
nn.addWire(w);
}
}
diff --git a/com/sun/electric/tool/routing/seaOfGates/SeaOfGatesEngineFactory.java b/com/sun/electric/tool/routing/seaOfGates/SeaOfGatesEngineFactory.java
index 1dd135a..c95edba 100644
--- a/com/sun/electric/tool/routing/seaOfGates/SeaOfGatesEngineFactory.java
+++ b/com/sun/electric/tool/routing/seaOfGates/SeaOfGatesEngineFactory.java
@@ -4,7 +4,7 @@
*
* File: SeaOfGatesFactory.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -23,7 +23,7 @@ package com.sun.electric.tool.routing.seaOfGates;
/**
* @author Felix Schmidt
- *
+ *
*/
public class SeaOfGatesEngineFactory {
@@ -33,7 +33,7 @@ public class SeaOfGatesEngineFactory {
/**
* Create a SeaOfGates version using the default version
- *
+ *
* @return a SeaOfGates engine.
*/
public static SeaOfGatesEngine createSeaOfGatesEngine() {
diff --git a/com/sun/electric/tool/routing/seaOfGates/SeaOfGatesEngineNonoverlappingBatch.java b/com/sun/electric/tool/routing/seaOfGates/SeaOfGatesEngineNonoverlappingBatch.java
index e5568da..c446390 100644
--- a/com/sun/electric/tool/routing/seaOfGates/SeaOfGatesEngineNonoverlappingBatch.java
+++ b/com/sun/electric/tool/routing/seaOfGates/SeaOfGatesEngineNonoverlappingBatch.java
@@ -4,7 +4,7 @@
*
* File: SeaOfGatesEngineOld.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -41,7 +41,7 @@ import java.util.concurrent.TimeUnit;
/**
* @author Felix Schmidt
- *
+ *
*/
class SeaOfGatesEngineNonoverlappingBatch extends SeaOfGatesEngine
{
@@ -50,10 +50,10 @@ class SeaOfGatesEngineNonoverlappingBatch extends SeaOfGatesEngine
public SeaOfGatesEngineNonoverlappingBatch(SeaOfGatesEngineFactory.SeaOfGatesEngineType version) {
this.version = version;
}
-
+
/*
* (non-Javadoc)
- *
+ *
* @see
* com.sun.electric.tool.routing.seaOfGates.SeaOfGatesEngine#doRoutingParallel
* (int, java.util.List)
@@ -62,7 +62,7 @@ class SeaOfGatesEngineNonoverlappingBatch extends SeaOfGatesEngine
protected void doRoutingParallel(int numberOfThreads, List<NeededRoute> allRoutes)
{
debug("Do routing parallel with new parallel Infrastructure 3");
-
+
JoinExecutor executor;
switch (version) {
case batchSemaphore:
@@ -74,7 +74,7 @@ class SeaOfGatesEngineNonoverlappingBatch extends SeaOfGatesEngine
default:
throw new AssertionError();
}
-
+
List<NeededRoute> routesToDo = CollectionFactory.createArrayList();
// create list of routes and blocked areas
@@ -121,7 +121,7 @@ class SeaOfGatesEngineNonoverlappingBatch extends SeaOfGatesEngine
}
threadAssign++;
}
-
+
trace("process " + threadAssign + " routes in parallel");
executor.join();
flush();
@@ -137,7 +137,7 @@ class SeaOfGatesEngineNonoverlappingBatch extends SeaOfGatesEngine
executor.shutdown();
}
-
+
/**
* All three methods are called from the same thread
*/
@@ -146,7 +146,7 @@ class SeaOfGatesEngineNonoverlappingBatch extends SeaOfGatesEngine
abstract void join();
abstract void shutdown();
}
-
+
private static class SemaphoreExecutor extends JoinExecutor {
private final ExecutorService executor;
private final Semaphore sem = new Semaphore(0);
@@ -155,7 +155,7 @@ class SeaOfGatesEngineNonoverlappingBatch extends SeaOfGatesEngine
private SemaphoreExecutor(int parallelism) {
executor = Executors.newFixedThreadPool(parallelism);
}
-
+
@Override
public void execute(final Runnable command) {
joinCount++;
@@ -167,7 +167,7 @@ class SeaOfGatesEngineNonoverlappingBatch extends SeaOfGatesEngine
}
});
}
-
+
@Override
public void join() {
sem.acquireUninterruptibly(joinCount);
@@ -183,7 +183,7 @@ class SeaOfGatesEngineNonoverlappingBatch extends SeaOfGatesEngine
}
}
}
-
+
private static class InfrastructureExecutor extends JoinExecutor {
private ThreadPool pools;
private PJob seaOfGatesJob;
@@ -219,7 +219,7 @@ class SeaOfGatesEngineNonoverlappingBatch extends SeaOfGatesEngine
void join() {
seaOfGatesJob.join();
}
-
+
@Override
void shutdown() {
join();
diff --git a/com/sun/electric/tool/routing/seaOfGates/SeaOfGatesEngineOld.java b/com/sun/electric/tool/routing/seaOfGates/SeaOfGatesEngineOld.java
index 09386bc..588e2ff 100644
--- a/com/sun/electric/tool/routing/seaOfGates/SeaOfGatesEngineOld.java
+++ b/com/sun/electric/tool/routing/seaOfGates/SeaOfGatesEngineOld.java
@@ -4,7 +4,7 @@
*
* File: SeaOfGatesEngineOld.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -39,20 +39,20 @@ public class SeaOfGatesEngineOld extends SeaOfGatesEngine
int threadCount;
List<NeededRoute> myList;
int totalRoutes, routesDone;
-
+
Rectangle2D pendingArea;
List<Runnable> pendingRunnables = new ArrayList<Runnable>();
/*
* (non-Javadoc)
- *
+ *
* @see com.sun.electric.tool.routing.seaOfGates.SeaOfGatesEngine#doRoutingParallel(
* int, java.util.List)
* )
*/
@Override
protected void doRoutingParallel(int numberOfThreads, List<NeededRoute> allRoutes)
- {
+ {
debug("Do parallel routing with raw threads");
// create list of routes
@@ -152,7 +152,7 @@ public class SeaOfGatesEngineOld extends SeaOfGatesEngine
public void run()
{
Environment.setThreadEnvironment(env);
-
+
for(;;)
{
// get next available route to run
diff --git a/com/sun/electric/tool/routing/seaOfGates/SeaOfGatesHandlers.java b/com/sun/electric/tool/routing/seaOfGates/SeaOfGatesHandlers.java
index 1b124a9..6130d01 100644
--- a/com/sun/electric/tool/routing/seaOfGates/SeaOfGatesHandlers.java
+++ b/com/sun/electric/tool/routing/seaOfGates/SeaOfGatesHandlers.java
@@ -4,7 +4,7 @@
*
* File: SeaOfGatesHandlers.java
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -24,10 +24,28 @@ package com.sun.electric.tool.routing.seaOfGates;
import com.sun.electric.database.EditingPreferences;
import com.sun.electric.database.Snapshot;
import com.sun.electric.database.constraint.Layout;
+import com.sun.electric.database.geometry.EPoint;
+import com.sun.electric.database.geometry.Poly;
import com.sun.electric.database.hierarchy.Cell;
import com.sun.electric.database.hierarchy.EDatabase;
+import com.sun.electric.database.hierarchy.Export;
+import com.sun.electric.database.hierarchy.Library;
+import com.sun.electric.database.id.CellId;
+import com.sun.electric.database.id.ExportId;
+import com.sun.electric.database.prototype.NodeProto;
+import com.sun.electric.database.text.CellName;
+import com.sun.electric.database.text.TextUtils;
import com.sun.electric.database.topology.ArcInst;
+import com.sun.electric.database.topology.NodeInst;
+import com.sun.electric.database.topology.PortInst;
import com.sun.electric.database.variable.UserInterface;
+import com.sun.electric.technology.EdgeH;
+import com.sun.electric.technology.EdgeV;
+import com.sun.electric.technology.Layer;
+import com.sun.electric.technology.PrimitiveNode;
+import com.sun.electric.technology.Technology;
+import com.sun.electric.technology.Technology.ArcLayer;
+import com.sun.electric.technology.technologies.Generic;
import com.sun.electric.tool.Job;
import com.sun.electric.tool.JobException;
import com.sun.electric.tool.routing.Routing;
@@ -35,20 +53,29 @@ import com.sun.electric.tool.routing.Routing.SoGContactsStrategy;
import com.sun.electric.tool.routing.SeaOfGates;
import com.sun.electric.tool.routing.seaOfGates.SeaOfGatesEngine.RouteResolution;
import com.sun.electric.tool.user.ErrorLogger;
+import com.sun.electric.util.math.FixpCoord;
+import com.sun.electric.util.math.Orientation;
+import java.awt.geom.Point2D;
+import java.awt.geom.Rectangle2D;
import java.io.PrintStream;
import java.util.ArrayList;
+import java.util.BitSet;
import java.util.Collection;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
/**
* Factory class that provides #SeaOfGatesEngin.Handler's .
*/
public class SeaOfGatesHandlers {
- /**
- * Save mode determines how to save changes.
+ /** true to use mutable database access instead of immutable. */ private static final boolean USEMUTABLE = false;
+
+ /**
+ * Save mode determines how to save changes.
*/
public enum Save {
SAVE_ONCE, SAVE_PERIODIC, SAVE_SNAPSHOTS
@@ -100,6 +127,13 @@ public class SeaOfGatesHandlers {
* @param save specified Save mode
*/
public static SeaOfGatesEngine.Handler getDefault(Cell cell, String resultCellName, SoGContactsStrategy contactPlacementAction, Job job, EditingPreferences ep, Save save) {
+ if (USEMUTABLE)
+ {
+ // if placing in separate cell, use mutable engine
+ if (resultCellName != null)
+ return new MutableSeaOfGatesHook(cell, resultCellName, contactPlacementAction, job, ep);
+ }
+
return new DefaultSeaOfGatesHook(cell, resultCellName, contactPlacementAction, job, ep, save);
}
@@ -135,7 +169,6 @@ public class SeaOfGatesHandlers {
arcIdsToRoute = null;
}
prefs.getOptionsFromPreferences(false);
-// prefs.resultCellName = "dummyResult;1{lay}";
this.version = version;
this.save = save;
}
@@ -166,6 +199,143 @@ public class SeaOfGatesHandlers {
}
}
+ static class ContactTemplate
+ {
+ final CellId cellId;
+ Cell cell;
+ final Orientation orient;
+ final ExportId exportId;
+
+ ContactTemplate(CellId cellId, Orientation orient, ExportId exportId)
+ {
+ this.cellId = cellId;
+ this.cell = null;
+ this.orient = orient;
+ this.exportId = exportId;
+ }
+
+ Cell getCell(Library lib)
+ {
+ if (cell == null)
+ {
+ for(Iterator<Cell> it = lib.getCells(); it.hasNext(); )
+ {
+ Cell c = it.next();
+ if (c.getId() == cellId)
+ {
+ cell = c;
+ break;
+ }
+ }
+ }
+ return cell;
+ }
+ }
+
+ static class ContactKey
+ {
+ final PrimitiveNode pNp;
+ final EPoint size;
+ final int techBits;
+
+ ContactKey(PrimitiveNode pNp, EPoint size, int techBits)
+ {
+ if (pNp == null || size == null) throw new NullPointerException();
+ this.pNp = pNp;
+ this.size = size;
+ this.techBits = techBits;
+ }
+
+ @Override
+ public boolean equals(Object o)
+ {
+ if (o instanceof ContactKey)
+ {
+ ContactKey that = (ContactKey) o;
+ return this.pNp.equals(that.pNp) && this.size.equals(that.size) && this.techBits == that.techBits;
+ }
+ return false;
+ }
+
+ @Override
+ public int hashCode()
+ {
+ return 89 * pNp.hashCode() + size.hashCode() + techBits;
+ }
+
+ @Override
+ public String toString() {
+ assert(pNp instanceof PrimitiveNode);
+
+ PrimitiveNode pn = (PrimitiveNode)pNp;
+ double scale = pn.getTechnology().getScale();
+
+ double[] xExt = new double[2];
+ double[] yExt = new double[2];
+ double[] viaSize = new double[2];
+ double[] viaSpacing = new double[2];
+ String[] names = new String[2];
+ int count = 0;
+
+ for (Technology.NodeLayer node : pn.getNodeLayers())
+ {
+ Layer l = node.getLayer();
+
+ if (l.getFunction().isContact())
+ {
+ // via size
+ viaSize[0] = (FixpCoord.fixpToLambda(node.getMulticutSizeX().getFixp())); // x value
+ viaSize[1] = (FixpCoord.fixpToLambda(node.getMulticutSizeY().getFixp())); // y value
+
+ // via spacing
+ // @TODO assuming 1x1 cuts
+ viaSpacing[0] = (FixpCoord.fixpToLambda(node.getMulticutSep1D().getFixp())); // x value
+ viaSpacing[1] = (FixpCoord.fixpToLambda(node.getMulticutSep1D().getFixp())); // y value
+ continue;
+ }
+ String tmp = l.getName();
+ assert(count < 2);
+
+ // two potential substitutions
+ tmp = tmp.replaceAll("_MASK_1", "CA");
+ tmp = tmp.replaceAll("_MASK_2", "CB");
+ names[(count+1)%2] = tmp; // the upper layer must be first in names. First layer is always the bottom
+ EdgeH leftEdge = node.getLeftEdge();
+ EdgeH rightEdge = node.getRightEdge();
+ EdgeV topEdge = node.getTopEdge();
+ EdgeV bottomEdge = node.getBottomEdge();
+ long portLowX = leftEdge.getFixpValue(size);
+ long portHighX = rightEdge.getFixpValue(size);
+ long portLowY = bottomEdge.getFixpValue(size);
+ long portHighY = topEdge.getFixpValue(size);
+ xExt[count] = FixpCoord.fixpToLambda(portHighX-portLowX);
+ yExt[count] = FixpCoord.fixpToLambda(portHighY-portLowY);
+ count++;
+ }
+
+ // do extra process with vias once values have been identified
+ for (int i = 0; i < 2; i++)
+ {
+ xExt[i] = (xExt[i] - viaSize[0])*scale/2;
+ yExt[i] = (yExt[i] - viaSize[1])*scale/2;
+ }
+
+ // using -1 as number of fractions to force zero digits
+ String newName = names[0] + "_" + names[1] + "_"; // first the upper in names
+ newName += "X_"
+ + TextUtils.formatDouble(viaSize[0]*scale, -1) + "_" + TextUtils.formatDouble(viaSize[1]*scale, -1)
+ + "_1_1_"
+ + TextUtils.formatDouble(viaSpacing[0]*scale, -1) + "_" + TextUtils.formatDouble(viaSpacing[1]*scale, -1) + "_"
+ + TextUtils.formatDouble(xExt[0], -1) + "_" + TextUtils.formatDouble(yExt[0], -1) + "_"
+ + TextUtils.formatDouble(xExt[1], -1) + "_" + TextUtils.formatDouble(yExt[1], -1);
+ return newName;
+ }
+
+ CellName getDefaultCellName() {
+ return CellName.parseName(this + ";1{lay}");
+ }
+ }
+
private static class DefaultSeaOfGatesHook implements SeaOfGatesEngine.Handler {
private final EDatabase database;
@@ -321,7 +491,17 @@ public class SeaOfGatesHandlers {
cellBuilder.instantiate(resolution);
}
- /**
+ /**
+ * Method to tell the name of the cell where routing results are stored.
+ * If null, results are placed back in the original cell.
+ * @return the name of the routing results cell.
+ */
+ public String getRoutingCellName()
+ {
+ return cellBuilder.resultCellName;
+ }
+
+ /**
* flush changes
* @param force unconditionally perform the final flush
* Can be called only from database thread
@@ -340,6 +520,8 @@ public class SeaOfGatesHandlers {
force = true;
}
break;
+ case SAVE_ONCE:
+ break;
}
if (force) {
Snapshot snapshot = cellBuilder.commit();
@@ -356,6 +538,408 @@ public class SeaOfGatesHandlers {
}
}
+ /**
+ * Alternate handler that doesn't use the immutable database
+ */
+ private static class MutableSeaOfGatesHook implements SeaOfGatesEngine.Handler {
+
+ private final Cell originalCell;
+ private final Cell cell;
+ private final String resultCellName;
+ private final SoGContactsStrategy contactPlacementAction;
+ private final Job job;
+ private final EditingPreferences ep;
+ private final UserInterface ui = Job.getUserInterface();
+ private Map<ContactKey,ContactTemplate> contactTemplates = new HashMap<ContactKey,ContactTemplate>();
+
+ private MutableSeaOfGatesHook(Cell cell, String resultCellName, SoGContactsStrategy contactPlacementAction, Job job, EditingPreferences ep) {
+ originalCell = cell;
+ if (resultCellName == null) this.cell = cell; else
+ {
+ // create separate cell for results
+ this.cell = Cell.makeInstance(ep, cell.getLibrary(), resultCellName + "{lay}");
+
+ // instantiate results cell in original cell
+ NodeInst.makeInstance(this.cell, ep, new Point2D.Double(0, 0), 0, 0, originalCell);
+ }
+ this.resultCellName = resultCellName;
+ this.contactPlacementAction = contactPlacementAction;
+ this.job = job;
+ this.ep = ep;
+ }
+
+ /**
+ * Returns EditingPreferences
+ * @return EditingPreferences
+ */
+ @Override
+ public EditingPreferences getEditingPreferences() { return ep; }
+
+ /**
+ * Check if we are scheduled to abort. If so, print message if non null and return true.
+ * @return true on abort, false otherwise. If job is scheduled for abort or
+ * aborted. and it will report it to standard output
+ */
+ @Override
+ public boolean checkAbort() {
+ return job != null && job.checkAbort();
+ }
+
+ /**
+ * Log a message at the TRACE level.
+ * @param msg the message string to be logged
+ */
+ @Override
+ public void trace(String msg) { printMessage(msg, true); }
+
+ /**
+ * Log a message at the DEBUG level.
+ * @param msg the message string to be logged
+ */
+ @Override
+ public void debug(String msg) {
+ if (Job.getDebug()) {
+ printMessage(msg, true);
+ }
+ }
+
+ /**
+ * Log a message at the INFO level.
+ * @param msg the message string to be logged
+ */
+ @Override
+ public void info(String msg) { printMessage(msg, true); }
+
+ /**
+ * Log a message at the WARN level.
+ * @param msg the message string to be logged
+ */
+ @Override
+ public void warn(String msg) { printMessage("WARNING: " + msg, true); }
+
+ /**
+ * Log a message at the ERROR level.
+ * @param msg the message string to be logged
+ */
+ @Override
+ public void error(String msg) { printMessage("ERROR: " + msg, true); }
+
+ private void printMessage(String s, boolean newLine) {
+ if (newLine) {
+ System.out.println(s);
+ } else {
+ System.out.print(s);
+ }
+ }
+
+ /**
+ * Method called when all errors are logged. Initializes pointers for replay of errors.
+ */
+ @Override
+ public void termLogging(ErrorLogger errorLogger) { errorLogger.termLogging(true); }
+
+ /**
+ * Method to start the display of a progress dialog.
+ * @param msg the message to show in the progress dialog.
+ */
+ @Override
+ public void startProgressDialog(String msg) { ui.startProgressDialog(msg, null); }
+
+ /**
+ * Method to stop the progress bar
+ */
+ @Override
+ public void stopProgressDialog() { ui.stopProgressDialog(); }
+
+ /**
+ * Method to set a text message in the progress dialog.
+ * @param message the new progress message.
+ */
+ @Override
+ public void setProgressNote(String message) {
+ ui.setProgressNote(message);
+ if (Job.getDebug())
+ System.out.println(message);
+ }
+
+ /**
+ * Method to update the progress bar
+ * @param pct the percentage done (from 0 to 100).
+ */
+ @Override
+ public void setProgressValue(long done, long total) {
+ int val = (int) (done * 100 / total);
+ ui.setProgressValue(val);
+ }
+
+ /**
+ * Method to instantiate RouteResolution.
+ * @param resolution RouteResolution
+ */
+ @Override
+ public void instantiate(RouteResolution resolution) {
+ for(Integer aiKillID : resolution.arcsIDsToKill)
+ {
+ ArcInst aiKill = originalCell.getArcById(aiKillID.intValue());
+ if (aiKill != null && aiKill.isLinked()) aiKill.kill();
+ }
+ for(Integer niKillID : resolution.nodesIDsToKill)
+ {
+ NodeInst niKill = originalCell.getNodeById(niKillID.intValue());
+ niKill.kill();
+ }
+
+ // if placing contacts in subcells, create them now
+ if (contactPlacementAction != SoGContactsStrategy.SOGCONTACTSATTOPLEVEL)
+ {
+ for (SeaOfGatesEngine.RouteNode rn : resolution.nodesToRoute)
+ {
+ if (rn.exists()) continue;
+ PrimitiveNode pNp = (PrimitiveNode)rn.getProto();
+ if (!pNp.getFunction().isContact()) continue;
+ ContactTemplate contactTemplate = getTemplateForContact(pNp, rn.getSize(), rn.getTechBits());
+ if (contactTemplate == null)
+ {
+ makeTemplateForContact(pNp, rn.getSize(), rn.getTechBits());
+ }
+ }
+ }
+
+ for(SeaOfGatesEngine.RouteNode rn : resolution.nodesToRoute)
+ {
+ if (!rn.exists())
+ {
+ NodeProto np = rn.getProto();
+ Orientation orient = rn.getOrient();
+ if (np.getFunction().isContact())
+ {
+ PrimitiveNode pNp = (PrimitiveNode)np;
+ ContactTemplate contactTemplate = getTemplateForContact(pNp, rn.getSize(), rn.getTechBits());
+ if (contactTemplate != null)
+ {
+ // place cell "c" instead of primitive "protoId"
+ np = contactTemplate.getCell(cell.getLibrary());
+ orient = contactTemplate.orient;
+ }
+ }
+
+ NodeInst ni = null;
+ if (resultCellName == null || !(np instanceof PrimitiveNode))
+ {
+ ni = NodeInst.makeInstance(np, ep, rn.getLoc(), rn.getWidth(), rn.getHeight(), cell, orient, null, rn.getTechBits());
+ } else
+ {
+ NodeInst dummyNi = NodeInst.makeDummyInstance(np, ep, rn.getTechBits(), rn.getLoc(), rn.getWidth(), rn.getHeight(), orient);
+ Poly[] polys = np.getTechnology().getShapeOfNode(dummyNi);
+ for(int i=0; i<polys.length; i++)
+ {
+ Poly poly = polys[i];
+ PrimitiveNode pNp = poly.getLayer().getPureLayerNode();
+ Rectangle2D bounds = poly.getBounds2D();
+ Point2D ctr = new Point2D.Double(bounds.getCenterX(), bounds.getCenterY());
+ NodeInst niPoss = NodeInst.makeInstance(pNp, ep, ctr, bounds.getWidth(), bounds.getHeight(), cell);
+ if (ni == null) ni = niPoss;
+ }
+ }
+ if (ni != null)
+ {
+ rn.setPi(ni.getOnlyPortInst());
+ rn.setTapConnection(ni.getD());
+ }
+ }
+ }
+ for(SeaOfGatesEngine.RouteArc ra : resolution.arcsToRoute)
+ {
+ if (ra.getHead().getPi() == null || ra.getTail().getPi() == null) continue;
+ if (resultCellName == null)
+ {
+ // place arc in original cell
+ ArcInst ai = ArcInst.makeInstanceBase(ra.getProto(), ep, ra.getWidth(), ra.getHead().getPi(), ra.getTail().getPi(),
+ ra.getHead().getPi().getCenter(), ra.getTail().getPi().getCenter(), ra.getName());
+ if (ai == null)
+ System.out.println("****FAILED TO ROUTE ARC "+ra.getProto().describe());
+ } else
+ {
+ // place polygons for the arc in the result cell
+ EPoint headPt = ra.getHead().getPi().getCenter();
+ EPoint tailPt = ra.getTail().getPi().getCenter();
+ double lX = Math.min(headPt.getX(), tailPt.getX()) - ra.getWidth()/2;
+ double hX = Math.max(headPt.getX(), tailPt.getX()) + ra.getWidth()/2;
+ double lY = Math.min(headPt.getY(), tailPt.getY()) - ra.getWidth()/2;
+ double hY = Math.max(headPt.getY(), tailPt.getY()) + ra.getWidth()/2;
+ ArcLayer[] arcLayers = ra.getProto().getArcLayers();
+ PrimitiveNode pNp = arcLayers[0].getLayer().getPureLayerNode();
+ Point2D ctr = new Point2D.Double((lX+hX)/2, (lY+hY)/2);
+ NodeInst.makeInstance(pNp, ep, ctr, hX-lX, hY-lY, cell);
+ }
+ }
+
+ // if routing into original cell, add unrouted arcs that didn't get routed
+ if (resultCellName == null)
+ {
+ for(SeaOfGatesEngine.RouteAddUnrouted rau : resolution.unroutedToAdd.keySet())
+ {
+ String name = resolution.unroutedToAdd.get(rau);
+ PortInst piA = rau.getTailPort();
+ PortInst piB = rau.getHeadPort();
+ ArcInst.makeInstance(Generic.tech().unrouted_arc, ep, piA, piB, piA.getCenter(), piB.getCenter(), name);
+ }
+ }
+ }
+
+ /**
+ * Method to find a contact template to describe a given primitive node, when encapsulated
+ * @param pNp the contact to package.
+ * @param size the size of the contact.
+ * @param techBits technology bits of the contact
+ * @return a ContactTemplate that describes that packaged contact.
+ */
+ ContactTemplate getTemplateForContact(PrimitiveNode pNp, EPoint size, int techBits)
+ {
+ ContactKey contactKey = new ContactKey(pNp, size, techBits);
+ return contactTemplates.get(contactKey);
+ }
+
+ private boolean doesCellMatch(Cell contactCell, Poly[] shapeNodes)
+ {
+ BitSet matched = new BitSet();
+ for(Iterator<NodeInst> it = contactCell.getNodes(); it.hasNext(); )
+ {
+ NodeInst ni = it.next();
+ if (ni.isCellInstance()) continue;
+ PrimitiveNode pn = (PrimitiveNode)ni.getProto();
+ if (pn.getTechnology() == Generic.tech()) continue;
+ if (pn.getFunction() != PrimitiveNode.Function.NODE) return false;
+ if (ni.getTrace() != null) return false;
+
+ // get layer of this pure-layer node
+ Poly[] pureLayers = pn.getTechnology().getShapeOfNode(ni);
+ Layer lay = pureLayers[0].getLayer();
+
+ boolean foundMatch = false;
+ for(int i=0; i<shapeNodes.length; i++)
+ {
+ if (matched.get(i)) continue;
+ Poly sn = shapeNodes[i];
+ if (lay != sn.getLayer()) continue;
+ Rectangle2D bounds = sn.getBounds2D();
+ if (ni.getXSize() != bounds.getWidth() || ni.getYSize() != bounds.getHeight()) continue;
+ if (ni.getAnchorCenterX() != bounds.getCenterX() || ni.getAnchorCenterY() != bounds.getCenterY()) continue;
+ matched.set(i);
+ foundMatch = true;
+ break;
+ }
+ if (!foundMatch)
+ return false;
+ }
+ return matched.cardinality() == shapeNodes.length;
+ }
+
+ /**
+ * Method to create a CellId to describe a given primitive node, when encapsulated
+ * @param pNp the contact to package.
+ * @param size the size of the contact.
+ * @param techBits technology bits of the contact
+ * @return a ContactTemplate that describes that packaged contact.
+ */
+ private void makeTemplateForContact(PrimitiveNode pNp, EPoint size, int techBits)
+ {
+ assert pNp.getFunction().isContact();
+ ContactKey contactKey = new ContactKey(pNp, size, techBits);
+ Library lib = cell.getLibrary();
+
+ Cell contactCell = null;
+ Orientation contactTemplateOrientation = Orientation.IDENT;
+ if (contactPlacementAction != SoGContactsStrategy.SOGCONTACTSFORCESUBCELLS)
+ {
+ NodeInst ni = NodeInst.makeDummyInstance(pNp, ep, EPoint.ORIGIN, size.getX(), size.getY(), Orientation.IDENT);
+ Poly[] conShape = pNp.getTechnology().getShapeOfNode(ni);
+
+ NodeInst niRot = NodeInst.makeDummyInstance(pNp, ep, EPoint.ORIGIN, size.getX(), size.getY(), Orientation.R);
+ Poly[] conShapeRot = pNp.getTechnology().getShapeOfNode(niRot);
+
+ for (Iterator<Cell> it = lib.getCells(); it.hasNext(); )
+ {
+ Cell cell = it.next();
+ if (doesCellMatch(cell, conShape))
+ {
+ contactCell = cell;
+ break;
+ }
+ if (doesCellMatch(cell, conShapeRot))
+ {
+ contactCell = cell;
+ contactTemplateOrientation = Orientation.R;
+ break;
+ }
+ }
+ }
+
+ if (contactCell != null)
+ {
+ // Contact cell found, make sure it has an export
+ if (!contactCell.getExports().hasNext())
+ {
+ // no exports in contact cell: add one
+ pNp = Generic.tech().universalPinNode;
+ NodeInst ni = NodeInst.makeInstance(pNp, ep, EPoint.ORIGIN, pNp.getDefaultLambdaBaseWidth(ep),
+ pNp.getDefaultLambdaBaseHeight(ep), contactCell);
+ Export.newInstance(contactCell, ni.getOnlyPortInst(), "port", ep);
+ }
+
+ // remember this contact cell
+ ExportId eId = contactCell.getExports().next().getId();
+ ContactTemplate contactTemplate = new ContactTemplate(contactCell.getId(), contactTemplateOrientation, eId);
+ contactTemplates.put(contactKey, contactTemplate);
+ return;
+ }
+
+ // no contact cell found. Okay if not needed
+ if (contactPlacementAction == SoGContactsStrategy.SOGCONTACTSUSEEXISTINGSUBCELLS) return;
+
+ // Create a new contact cell, use new name strategy here
+ contactCell = Cell.makeInstance(ep, lib, contactKey.getDefaultCellName().getName());
+
+ // create geometry
+ NodeInst ni = NodeInst.makeDummyInstance(pNp, ep, EPoint.ORIGIN, size.getX()+pNp.getDefWidth(ep),
+ size.getY()+pNp.getDefHeight(ep), contactTemplateOrientation);
+ Poly[] conShape = pNp.getTechnology().getShapeOfNode(ni);
+ for(int i=0; i<conShape.length; i++)
+ {
+ Poly shape = conShape[i];
+ Layer lay = shape.getLayer();
+ PrimitiveNode pureNp = lay.getPureLayerNode();
+ Rectangle2D bounds = shape.getBounds2D();
+ Point2D ctr = new Point2D.Double(bounds.getCenterX(), bounds.getCenterY());
+ NodeInst.makeInstance(pureNp, ep, ctr, bounds.getWidth(), bounds.getHeight(), contactCell);
+ }
+
+ // Create export
+ pNp = Generic.tech().universalPinNode;
+ ni = NodeInst.makeInstance(pNp, ep, EPoint.ORIGIN, pNp.getDefaultLambdaBaseWidth(ep), pNp.getDefaultLambdaBaseHeight(ep), contactCell);
+ Export e = Export.newInstance(contactCell, ni.getOnlyPortInst(), "port", ep);
+
+ // save ContactTemplate
+ ContactTemplate contactTemplate = new ContactTemplate(contactCell.getId(), contactTemplateOrientation, e.getId());
+ contactTemplates.put(contactKey, contactTemplate);
+ }
+
+ /**
+ * Method to tell the name of the cell where routing results are stored.
+ * If null, results are placed back in the original cell.
+ * @return the name of the routing results cell.
+ */
+ public String getRoutingCellName() { return resultCellName; }
+
+ /**
+ * flush changes
+ * @param force unconditionally perform the final flush
+ * Can be called only from database thread
+ */
+ @Override
+ public void flush(boolean force) {}
+ }
+
private static class DummySeaOfGatesHandler implements SeaOfGatesEngine.Handler {
private final EditingPreferences ep;
@@ -482,6 +1066,17 @@ public class SeaOfGatesHandlers {
public void instantiate(RouteResolution resolution) {
}
+ /**
+ * Method to tell the name of the cell where routing results are stored.
+ * If null, results are placed back in the original cell.
+ * @return the name of the routing results cell.
+ */
+ @Override
+ public String getRoutingCellName()
+ {
+ return null;
+ }
+
/**
* flush changes
* Can be called only from database thread
diff --git a/com/sun/electric/tool/routing/seaOfGates/SoGWireQualityMetric.java b/com/sun/electric/tool/routing/seaOfGates/SoGWireQualityMetric.java
index 16f7f06..7dbe444 100644
--- a/com/sun/electric/tool/routing/seaOfGates/SoGWireQualityMetric.java
+++ b/com/sun/electric/tool/routing/seaOfGates/SoGWireQualityMetric.java
@@ -4,7 +4,7 @@
*
* File: SoGWireQualityMetric.java
*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -39,31 +39,31 @@ public class SoGWireQualityMetric extends WireQualityMetric
/**
* Method to calculate net quality
- * @param net Network to analyze
+ * @param batch batch of routes to examine.
*/
public QualityResults calculate(RouteBatch batch)
{
QualityResults result = null;
boolean atLeastOneSegment = false;
-
+
numberOfTotalNets++;
-
+
try {
result = startLogging(batch.netName);
-
+
result.wireLength = new Double(0);
result.vias = new Integer(0);
double minX = Double.MAX_VALUE, maxX = -Double.MAX_VALUE;
double minY = Double.MAX_VALUE, maxY = -Double.MAX_VALUE;
-
+
for(NeededRoute nr : batch.routesInBatch)
{
if (nr.getRoutedSucess())
{
numRoutedSegments++;
-
+
Wavefront winningWF = nr.getWavefront();
-
+
if (winningWF.vertices.size() < 2)
{
System.out.println("WARNING: Review net '" + batch.netName + "' - it has less than 2 vertices");
@@ -81,7 +81,7 @@ public class SoGWireQualityMetric extends WireQualityMetric
int endZ = theLast.getZ();
int maxZ = Math.max(startZ, endZ);
int countVias = 0;
-
+
// TODO: gather statistics for routeBatches[b].netName
for (int i=1; i<winningWF.vertices.size(); i++)
{
@@ -94,7 +94,7 @@ public class SoGWireQualityMetric extends WireQualityMetric
maxX = Math.max(maxX, svLast.getX());
maxY = Math.max(maxY, svLast.getY());
}
-
+
SearchVertex sv = winningWF.vertices.get(i);
if (svLast.getZ() != sv.getZ())
{
@@ -120,13 +120,19 @@ public class SoGWireQualityMetric extends WireQualityMetric
atLeastOneSegment = true;
} else
{
- if (nr.getErrorMessage() != null)
+ if (nr.isAlreadyRouted())
{
- numFailedSegments++;
+ numRoutedSegments++;
+ } else
+ {
+ if (nr.getErrorMessage() != null)
+ {
+ numFailedSegments++;
+ }
}
}
}
-
+
// Only when routing was found
double avgWLHPWLReal = 0, avgWLHPWLIdeal = 0;
if (atLeastOneSegment)
@@ -134,7 +140,7 @@ public class SoGWireQualityMetric extends WireQualityMetric
result.addSegmentHPWL((maxX - minX) + (maxY - minY), true); //.hpwlOLD = (maxX - minX) + (maxY - minY);
avgHpwlReal += result.getSegmentHPWL(false, true);
avgHpwlIdeal += result.getSegmentHPWL(false, false);
- totalWL += result.wireLength;
+ totalWL += result.wireLength;
avgVias += result.vias;
avgWLHPWLReal = result.getWLDivHPWL(true);
avgWLHPWLIdeal = result.getWLDivHPWL(false);
@@ -150,7 +156,7 @@ public class SoGWireQualityMetric extends WireQualityMetric
//logger.trace("calculate wire length");
info("wire length metric for net '" + batch.netName + "': " + result.wireLength);
-
+
// logger.trace("calculate unrouted nets");
// result.unroutedSegments = new UnroutedNetsMetric().calculate(cell);
// logger.debug("unrouted nets metric: " + result.unroutedSegments);
@@ -159,14 +165,14 @@ public class SoGWireQualityMetric extends WireQualityMetric
info("via amount metric for net '" + batch.netName + "': " + result.vias);
info("routed segment metric for net '" + batch.netName + "': " + result.numOfSegments(true));
info("via++ metric for net '" + batch.netName + "': " + result.getSegmentViaValue());
-
+
//logger.trace("calculate HPWL amount metric...");
info("Real HPWL amount metric for net '" + batch.netName + "': " + result.getSegmentHPWL(true, true));
info("Ideal HPWL amount metric for net '" + batch.netName + "': " + result.getSegmentHPWL(true, false));
-
+
info("Real WL v/s HPWL for net '" + batch.netName + "': " + avgWLHPWLReal);
info("Ideal WL v/s HPWL for net '" + batch.netName + "': " + avgWLHPWLIdeal);
-
+
info("============================");
} catch (UnknownHostException e) {
if (Job.getDebug())
diff --git a/com/sun/electric/tool/sandbox/DummyPreferences.java b/com/sun/electric/tool/sandbox/DummyPreferences.java
index 367d570..1266fa4 100644
--- a/com/sun/electric/tool/sandbox/DummyPreferences.java
+++ b/com/sun/electric/tool/sandbox/DummyPreferences.java
@@ -4,7 +4,7 @@
*
* File: DummyPreferences.java
*
- * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/sandbox/DummyPreferencesFactory.java b/com/sun/electric/tool/sandbox/DummyPreferencesFactory.java
index 6a5aba0..a4352b9 100644
--- a/com/sun/electric/tool/sandbox/DummyPreferencesFactory.java
+++ b/com/sun/electric/tool/sandbox/DummyPreferencesFactory.java
@@ -4,7 +4,7 @@
*
* File: DummyPreferencesFactory.java
*
- * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/sandbox/EClassLoader.java b/com/sun/electric/tool/sandbox/EClassLoader.java
index 274a3f6..4e47fe3 100644
--- a/com/sun/electric/tool/sandbox/EClassLoader.java
+++ b/com/sun/electric/tool/sandbox/EClassLoader.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: EClassLoader.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/sandbox/ESandBox.java b/com/sun/electric/tool/sandbox/ESandBox.java
index 5a54328..1c63f3a 100644
--- a/com/sun/electric/tool/sandbox/ESandBox.java
+++ b/com/sun/electric/tool/sandbox/ESandBox.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ESandBox.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/sandbox/TechExplorer.java b/com/sun/electric/tool/sandbox/TechExplorer.java
index d7ebb05..fea1a00 100644
--- a/com/sun/electric/tool/sandbox/TechExplorer.java
+++ b/com/sun/electric/tool/sandbox/TechExplorer.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: TechExplorer.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/sandbox/TechExplorerDriver.java b/com/sun/electric/tool/sandbox/TechExplorerDriver.java
index 40f8e6c..ee62332 100644
--- a/com/sun/electric/tool/sandbox/TechExplorerDriver.java
+++ b/com/sun/electric/tool/sandbox/TechExplorerDriver.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: TechExplorerDriver.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/sc/GetNetlist.java b/com/sun/electric/tool/sc/GetNetlist.java
index 1493a75..45a0af8 100644
--- a/com/sun/electric/tool/sc/GetNetlist.java
+++ b/com/sun/electric/tool/sc/GetNetlist.java
@@ -5,9 +5,9 @@
* File: GetNetlist.java
* Silicon compiler tool (QUISC): read a netlist
* Written by Andrew R. Kostiuk, Queen's University.
- * Translated to Java by Steven M. Rubin, Sun Microsystems.
+ * Translated to Java by Steven M. Rubin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/sc/Maker.java b/com/sun/electric/tool/sc/Maker.java
index 03ba627..d677d3a 100644
--- a/com/sun/electric/tool/sc/Maker.java
+++ b/com/sun/electric/tool/sc/Maker.java
@@ -5,9 +5,9 @@
* File: Maker.java
* Silicon compiler tool (QUISC): make Electric circuitry
* Written by Andrew R. Kostiuk, Queen's University.
- * Translated to Java by Steven M. Rubin, Sun Microsystems.
+ * Translated to Java by Steven M. Rubin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/sc/Place.java b/com/sun/electric/tool/sc/Place.java
index 981349b..fc31006 100644
--- a/com/sun/electric/tool/sc/Place.java
+++ b/com/sun/electric/tool/sc/Place.java
@@ -5,9 +5,9 @@
* File: Place.java
* Silicon compiler tool (QUISC): placement
* Written by Andrew R. Kostiuk, Queen's University.
- * Translated to Java by Steven M. Rubin, Sun Microsystems.
+ * Translated to Java by Steven M. Rubin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/sc/Route.java b/com/sun/electric/tool/sc/Route.java
index 5781a1a..255275b 100644
--- a/com/sun/electric/tool/sc/Route.java
+++ b/com/sun/electric/tool/sc/Route.java
@@ -5,9 +5,9 @@
* File: Route.java
* Silicon compiler tool (QUISC): routing
* Written by Andrew R. Kostiuk, Queen's University.
- * Translated to Java by Steven M. Rubin, Sun Microsystems.
+ * Translated to Java by Steven M. Rubin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/sc/SilComp.java b/com/sun/electric/tool/sc/SilComp.java
index ec8e77c..e8a9c49 100644
--- a/com/sun/electric/tool/sc/SilComp.java
+++ b/com/sun/electric/tool/sc/SilComp.java
@@ -5,9 +5,9 @@
* File: SilComp.java
* Silicon compiler tool (QUISC): control
* Written by Andrew R. Kostiuk, Queen's University.
- * Translated to Java by Steven M. Rubin, Sun Microsystems.
+ * Translated to Java by Steven M. Rubin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/BTreeSignal.java b/com/sun/electric/tool/simulation/BTreeSignal.java
index a392b9e..d2bafe3 100644
--- a/com/sun/electric/tool/simulation/BTreeSignal.java
+++ b/com/sun/electric/tool/simulation/BTreeSignal.java
@@ -2,7 +2,7 @@
*
* Electric(tm) VLSI Design System
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/BusSample.java b/com/sun/electric/tool/simulation/BusSample.java
index 05b18c5..4ee08f9 100644
--- a/com/sun/electric/tool/simulation/BusSample.java
+++ b/com/sun/electric/tool/simulation/BusSample.java
@@ -4,7 +4,7 @@
*
* File: BusSample.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/ComplexSample.java b/com/sun/electric/tool/simulation/ComplexSample.java
index a63db2d..4116061 100644
--- a/com/sun/electric/tool/simulation/ComplexSample.java
+++ b/com/sun/electric/tool/simulation/ComplexSample.java
@@ -4,7 +4,7 @@
*
* File: Signal.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/DerivedSignal.java b/com/sun/electric/tool/simulation/DerivedSignal.java
index 109223c..df2ffb4 100644
--- a/com/sun/electric/tool/simulation/DerivedSignal.java
+++ b/com/sun/electric/tool/simulation/DerivedSignal.java
@@ -4,7 +4,7 @@
*
* File: DerivedSignal.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/DigitalSample.java b/com/sun/electric/tool/simulation/DigitalSample.java
index 5900662..94ff60f 100644
--- a/com/sun/electric/tool/simulation/DigitalSample.java
+++ b/com/sun/electric/tool/simulation/DigitalSample.java
@@ -4,7 +4,7 @@
*
* File: Signal.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/Engine.java b/com/sun/electric/tool/simulation/Engine.java
index b7c03f2..9df3ba9 100644
--- a/com/sun/electric/tool/simulation/Engine.java
+++ b/com/sun/electric/tool/simulation/Engine.java
@@ -4,7 +4,7 @@
*
* File: Engine.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/MutableSignal.java b/com/sun/electric/tool/simulation/MutableSignal.java
index 0e4a900..6d011f5 100644
--- a/com/sun/electric/tool/simulation/MutableSignal.java
+++ b/com/sun/electric/tool/simulation/MutableSignal.java
@@ -4,7 +4,7 @@
*
* File: MutableSignal.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/RangeSample.java b/com/sun/electric/tool/simulation/RangeSample.java
index 9e3bbd5..e7ee965 100644
--- a/com/sun/electric/tool/simulation/RangeSample.java
+++ b/com/sun/electric/tool/simulation/RangeSample.java
@@ -4,7 +4,7 @@
*
* File: Signal.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/Sample.java b/com/sun/electric/tool/simulation/Sample.java
index c6b1412..0ac0028 100644
--- a/com/sun/electric/tool/simulation/Sample.java
+++ b/com/sun/electric/tool/simulation/Sample.java
@@ -4,7 +4,7 @@
*
* File: Signal.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/ScalarSample.java b/com/sun/electric/tool/simulation/ScalarSample.java
index d2430d6..e431445 100644
--- a/com/sun/electric/tool/simulation/ScalarSample.java
+++ b/com/sun/electric/tool/simulation/ScalarSample.java
@@ -4,7 +4,7 @@
*
* File: Signal.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/Signal.java b/com/sun/electric/tool/simulation/Signal.java
index 6dfef17..d2c1da7 100644
--- a/com/sun/electric/tool/simulation/Signal.java
+++ b/com/sun/electric/tool/simulation/Signal.java
@@ -4,7 +4,7 @@
*
* File: Signal.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/SignalCollection.java b/com/sun/electric/tool/simulation/SignalCollection.java
index edf9f12..3e5e382 100644
--- a/com/sun/electric/tool/simulation/SignalCollection.java
+++ b/com/sun/electric/tool/simulation/SignalCollection.java
@@ -4,7 +4,7 @@
*
* File: SignalCollection.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/SimulationTool.java b/com/sun/electric/tool/simulation/SimulationTool.java
index a62f619..9ad2148 100644
--- a/com/sun/electric/tool/simulation/SimulationTool.java
+++ b/com/sun/electric/tool/simulation/SimulationTool.java
@@ -4,7 +4,7 @@
*
* File: SimulationTool.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -1355,50 +1355,14 @@ public class SimulationTool extends Tool
public static void setSpiceMaxCharsPerLine(int c) { cacheSpiceMaxCharsPerLine.setInt(c); }
/** Get the max characters on a line of Spice output, by default */
public static int getFactorySpiceMaxCharsPerLine() { return cacheSpiceMaxCharsPerLine.getIntFactoryValue(); }
-
- private static Pref cacheSpicePartsLibrary = null;
- /**
- * Method to return the name of the current Spice parts library.
- * The Spice parts library is a library of icons that are used in Spice.
- * @return the name of the current Spice parts library.
- */
- public static String getSpicePartsLibrary()
- {
- if (cacheSpicePartsLibrary == null)
- {
- String [] libNames = LibFile.getSpicePartsLibraries();
- cacheSpicePartsLibrary = Pref.makeStringPref("SpicePartsLibrary", tool.prefs, libNames[0]);
- }
- return cacheSpicePartsLibrary.getString();
- }
- /**
- * Method to set the name of the current Spice parts library.
- * The Spice parts library is a library of icons that are used in Spice.
- * @param parts the name of the new current Spice parts library.
- */
- public static void setSpicePartsLibrary(String parts)
- {
- if (cacheSpicePartsLibrary == null)
- {
- String [] libNames = LibFile.getSpicePartsLibraries();
- cacheSpicePartsLibrary = Pref.makeStringPref("SpicePartsLibrary", tool.prefs, libNames[0]);
- }
- cacheSpicePartsLibrary.setString(parts);
- }
- /**
- * Method to return the name of the default Spice parts library.
- * The Spice parts library is a library of icons that are used in Spice.
- * @return the name of the default Spice parts library.
- */
- public static String getFactorySpicePartsLibrary()
- {
- if (cacheSpicePartsLibrary == null)
- {
- String [] libNames = LibFile.getSpicePartsLibraries();
- cacheSpicePartsLibrary = Pref.makeStringPref("SpicePartsLibrary", tool.prefs, libNames[0]);
- }
- return cacheSpicePartsLibrary.getStringFactoryValue();
- }
+
+ private static Pref cacheSpicePartsLibrary = Pref.makeStringPref("SpicePartsLibrary", tool.prefs, "spiceparts");
+ /** Get the spice run program arguments */
+ public static String getSpicePartsLibrary() { return cacheSpicePartsLibrary.getString(); }
+ /** Set the spice run program arguments */
+ public static void setSpicePartsLibrary(String c) { cacheSpicePartsLibrary.setString(c); }
+ /** Get the spice run program arguments, by default */
+ public static String getFactorySpicePartsLibrary() { return cacheSpicePartsLibrary.getStringFactoryValue(); }
private static Pref cacheSpiceHeaderCardInfo = Pref.makeStringPref("SpiceHeaderCardInfo", tool.prefs, "");
/**
diff --git a/com/sun/electric/tool/simulation/Stimuli.java b/com/sun/electric/tool/simulation/Stimuli.java
index 2ce60f9..aac6d3a 100644
--- a/com/sun/electric/tool/simulation/Stimuli.java
+++ b/com/sun/electric/tool/simulation/Stimuli.java
@@ -4,7 +4,7 @@
*
* File: Stimuli.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/SweptSample.java b/com/sun/electric/tool/simulation/SweptSample.java
index 9cc89f7..2407c29 100644
--- a/com/sun/electric/tool/simulation/SweptSample.java
+++ b/com/sun/electric/tool/simulation/SweptSample.java
@@ -4,7 +4,7 @@
*
* File: SweptSample.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/als/ALS.java b/com/sun/electric/tool/simulation/als/ALS.java
index c213db2..05a04e8 100644
--- a/com/sun/electric/tool/simulation/als/ALS.java
+++ b/com/sun/electric/tool/simulation/als/ALS.java
@@ -5,9 +5,9 @@
* File: ALS.java
* Asynchronous Logic Simulator main module
* Original C Code written by Brent Serbin and Peter J. Gallant
- * Translated to Java by Steven M. Rubin, Sun Microsystems.
+ * Translated to Java by Steven M. Rubin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/als/Command.java b/com/sun/electric/tool/simulation/als/Command.java
index bf93dbe..a50d5d8 100644
--- a/com/sun/electric/tool/simulation/als/Command.java
+++ b/com/sun/electric/tool/simulation/als/Command.java
@@ -5,9 +5,9 @@
* File: Command.java
* Asynchronous Logic Simulator command handler
* Original C Code written by Brent Serbin and Peter J. Gallant
- * Translated to Java by Steven M. Rubin, Sun Microsystems.
+ * Translated to Java by Steven M. Rubin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/als/Flat.java b/com/sun/electric/tool/simulation/als/Flat.java
index 9376be6..6755c2b 100644
--- a/com/sun/electric/tool/simulation/als/Flat.java
+++ b/com/sun/electric/tool/simulation/als/Flat.java
@@ -5,9 +5,9 @@
* File: Flat.java
* Asynchronous Logic Simulator network flattening
* Original C Code written by Brent Serbin and Peter J. Gallant
- * Translated to Java by Steven M. Rubin, Sun Microsystems.
+ * Translated to Java by Steven M. Rubin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/als/Sim.java b/com/sun/electric/tool/simulation/als/Sim.java
index 37ee249..6f36bd7 100644
--- a/com/sun/electric/tool/simulation/als/Sim.java
+++ b/com/sun/electric/tool/simulation/als/Sim.java
@@ -5,9 +5,9 @@
* File: Sim.java
* Asynchronous Logic Simulator engine
* Original C Code written by Brent Serbin and Peter J. Gallant
- * Translated to Java by Steven M. Rubin, Sun Microsystems.
+ * Translated to Java by Steven M. Rubin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/als/UserCom.java b/com/sun/electric/tool/simulation/als/UserCom.java
index 10290dd..244f8c6 100644
--- a/com/sun/electric/tool/simulation/als/UserCom.java
+++ b/com/sun/electric/tool/simulation/als/UserCom.java
@@ -5,9 +5,9 @@
* File: UserCom.java
* Asynchronous Logic Simulator user functions
* Original C Code written by Brent Serbin and Peter J. Gallant
- * Translated to Java by Steven M. Rubin, Sun Microsystems.
+ * Translated to Java by Steven M. Rubin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/interval/Diode.java b/com/sun/electric/tool/simulation/interval/Diode.java
index 057b95d..d1ffdfc 100644
--- a/com/sun/electric/tool/simulation/interval/Diode.java
+++ b/com/sun/electric/tool/simulation/interval/Diode.java
@@ -4,7 +4,7 @@
*
* File: Diode.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/interval/ExprEval.java b/com/sun/electric/tool/simulation/interval/ExprEval.java
index 91882e4..1e56a5c 100644
--- a/com/sun/electric/tool/simulation/interval/ExprEval.java
+++ b/com/sun/electric/tool/simulation/interval/ExprEval.java
@@ -4,7 +4,7 @@
*
* File: ExprEval.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/interval/RawFile.java b/com/sun/electric/tool/simulation/interval/RawFile.java
index 9b40dab..0076c72 100644
--- a/com/sun/electric/tool/simulation/interval/RawFile.java
+++ b/com/sun/electric/tool/simulation/interval/RawFile.java
@@ -4,7 +4,7 @@
*
* File: RawFile.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/interval/UnivariateTaylorModel.java b/com/sun/electric/tool/simulation/interval/UnivariateTaylorModel.java
index 11529f4..2c3975d 100644
--- a/com/sun/electric/tool/simulation/interval/UnivariateTaylorModel.java
+++ b/com/sun/electric/tool/simulation/interval/UnivariateTaylorModel.java
@@ -4,7 +4,7 @@
*
* File: MutableInterval.java
*
- * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/irsim/IRSIM.java b/com/sun/electric/tool/simulation/irsim/IRSIM.java
index 9eb4fcd..bec2b6c 100644
--- a/com/sun/electric/tool/simulation/irsim/IRSIM.java
+++ b/com/sun/electric/tool/simulation/irsim/IRSIM.java
@@ -4,7 +4,7 @@
*
* File: IRSIM.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/sctiming/Arc.java b/com/sun/electric/tool/simulation/sctiming/Arc.java
index a766f49..8b3855b 100644
--- a/com/sun/electric/tool/simulation/sctiming/Arc.java
+++ b/com/sun/electric/tool/simulation/sctiming/Arc.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: Arc.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/sctiming/LibData.java b/com/sun/electric/tool/simulation/sctiming/LibData.java
index 6ef0890..965546c 100644
--- a/com/sun/electric/tool/simulation/sctiming/LibData.java
+++ b/com/sun/electric/tool/simulation/sctiming/LibData.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: LibData.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/sctiming/PinEdge.java b/com/sun/electric/tool/simulation/sctiming/PinEdge.java
index 6a26963..7422f2f 100644
--- a/com/sun/electric/tool/simulation/sctiming/PinEdge.java
+++ b/com/sun/electric/tool/simulation/sctiming/PinEdge.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: PinEdge.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/sctiming/SCRunBase.java b/com/sun/electric/tool/simulation/sctiming/SCRunBase.java
index 7560ea1..f35e9fc 100644
--- a/com/sun/electric/tool/simulation/sctiming/SCRunBase.java
+++ b/com/sun/electric/tool/simulation/sctiming/SCRunBase.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: SCRunBase.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/sctiming/SCSettings.java b/com/sun/electric/tool/simulation/sctiming/SCSettings.java
index 984443a..19f89e3 100644
--- a/com/sun/electric/tool/simulation/sctiming/SCSettings.java
+++ b/com/sun/electric/tool/simulation/sctiming/SCSettings.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: SCSettings.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -382,9 +382,8 @@ public class SCSettings {
}
/**
- * Set the setup, hold, and clock-2-q characterization to simple
- * mode (matches Sun Microelectronics). Rather than optimizing
- * for a minimal setup+clk2q delay, this measures clk2q on a
+ * Set the setup, hold, and clock-2-q characterization to simple mode.
+ * Rather than optimizing for a minimal setup+clk2q delay, this measures clk2q on a
* static input, and then decreases the setup time until the clk2q
* delay gets pushed out (moved) by an amount specified.
* @param b true to set to simple mode
diff --git a/com/sun/electric/tool/simulation/sctiming/SCTiming.java b/com/sun/electric/tool/simulation/sctiming/SCTiming.java
index d4e24c7..8fb698d 100644
--- a/com/sun/electric/tool/simulation/sctiming/SCTiming.java
+++ b/com/sun/electric/tool/simulation/sctiming/SCTiming.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: SCTiming.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/sctiming/SCTimingException.java b/com/sun/electric/tool/simulation/sctiming/SCTimingException.java
index f839aa9..c00687d 100644
--- a/com/sun/electric/tool/simulation/sctiming/SCTimingException.java
+++ b/com/sun/electric/tool/simulation/sctiming/SCTimingException.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: SCTimingException.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/sctiming/Table2D.java b/com/sun/electric/tool/simulation/sctiming/Table2D.java
index 079cd39..39745fe 100644
--- a/com/sun/electric/tool/simulation/sctiming/Table2D.java
+++ b/com/sun/electric/tool/simulation/sctiming/Table2D.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: Table2D.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/sctiming/TableData.java b/com/sun/electric/tool/simulation/sctiming/TableData.java
index f40c772..6235134 100644
--- a/com/sun/electric/tool/simulation/sctiming/TableData.java
+++ b/com/sun/electric/tool/simulation/sctiming/TableData.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: TableData.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/Agilent34970A.java b/com/sun/electric/tool/simulation/test/Agilent34970A.java
index 75deba6..8903afd 100644
--- a/com/sun/electric/tool/simulation/test/Agilent34970A.java
+++ b/com/sun/electric/tool/simulation/test/Agilent34970A.java
@@ -5,7 +5,7 @@
* File: Agilent34970A.java
* Written by Tom O'Neill
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/Agilent34970AChannel.java b/com/sun/electric/tool/simulation/test/Agilent34970AChannel.java
index d560e38..c7786ec 100644
--- a/com/sun/electric/tool/simulation/test/Agilent34970AChannel.java
+++ b/com/sun/electric/tool/simulation/test/Agilent34970AChannel.java
@@ -5,7 +5,7 @@
* File: Agilent34970AChannel.java
* Written by Tom O'Neill.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/Agilent6031A.java b/com/sun/electric/tool/simulation/test/Agilent6031A.java
index 63803a3..8e9f6d8 100644
--- a/com/sun/electric/tool/simulation/test/Agilent6031A.java
+++ b/com/sun/electric/tool/simulation/test/Agilent6031A.java
@@ -5,7 +5,7 @@
* File: Agilent6031A.java
* Written by Tom O'Neill and Nathaniel Pinckney.
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/Agilent6031AChannel.java b/com/sun/electric/tool/simulation/test/Agilent6031AChannel.java
index 843ce36..51e4825 100644
--- a/com/sun/electric/tool/simulation/test/Agilent6031AChannel.java
+++ b/com/sun/electric/tool/simulation/test/Agilent6031AChannel.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: Agilent6031AChannel.java
- * Written by Tom O'Neill and Nathaniel Pinckney, Sun Microsystems.
+ * Written by Tom O'Neill and Nathaniel Pinckney.
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/AmpsVsVolts.java b/com/sun/electric/tool/simulation/test/AmpsVsVolts.java
index 0d9c97b..9c25f91 100644
--- a/com/sun/electric/tool/simulation/test/AmpsVsVolts.java
+++ b/com/sun/electric/tool/simulation/test/AmpsVsVolts.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: AmpsVsVolts.java
- * Written by Tom O'Neill, Sun Microsystems.
+ * Written by Tom O'Neill.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/BERT.java b/com/sun/electric/tool/simulation/test/BERT.java
index 3e1e89d..5d010be 100644
--- a/com/sun/electric/tool/simulation/test/BERT.java
+++ b/com/sun/electric/tool/simulation/test/BERT.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: BERT.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/BitVector.java b/com/sun/electric/tool/simulation/test/BitVector.java
index a78c558..a46b6b3 100644
--- a/com/sun/electric/tool/simulation/test/BitVector.java
+++ b/com/sun/electric/tool/simulation/test/BitVector.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: BitVector.java
- * Written by Eric Kim and JTom O'Neill, Sun Microsystems.
+ * Written by Eric Kim and JTom O'Neill.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/BussedIO.java b/com/sun/electric/tool/simulation/test/BussedIO.java
index 57fa58c..9f40861 100644
--- a/com/sun/electric/tool/simulation/test/BussedIO.java
+++ b/com/sun/electric/tool/simulation/test/BussedIO.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: BussedIO.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/BypassJtagTester.java b/com/sun/electric/tool/simulation/test/BypassJtagTester.java
index 69bbf9f..fe5488a 100644
--- a/com/sun/electric/tool/simulation/test/BypassJtagTester.java
+++ b/com/sun/electric/tool/simulation/test/BypassJtagTester.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: BypassJtagTester.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/ChainControl.java b/com/sun/electric/tool/simulation/test/ChainControl.java
index b659437..c77a6ed 100644
--- a/com/sun/electric/tool/simulation/test/ChainControl.java
+++ b/com/sun/electric/tool/simulation/test/ChainControl.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ChainControl.java
- * Written by Eric Kim and Tom O'Neill, Sun Microsystems.
+ * Written by Eric Kim and Tom O'Neill.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/ChainControlFake.java b/com/sun/electric/tool/simulation/test/ChainControlFake.java
index a38ae74..99cab82 100644
--- a/com/sun/electric/tool/simulation/test/ChainControlFake.java
+++ b/com/sun/electric/tool/simulation/test/ChainControlFake.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ChainControlFake.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/ChainG.dtd b/com/sun/electric/tool/simulation/test/ChainG.dtd
index 7704196..440d0ba 100644
--- a/com/sun/electric/tool/simulation/test/ChainG.dtd
+++ b/com/sun/electric/tool/simulation/test/ChainG.dtd
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ChainG.dtd, GUI JTAG utility
- * Written by Eric Kim, Sun Microsystems.
+ * Written by Eric Kim.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/ChainG.java b/com/sun/electric/tool/simulation/test/ChainG.java
index b12625d..a01d0ce 100644
--- a/com/sun/electric/tool/simulation/test/ChainG.java
+++ b/com/sun/electric/tool/simulation/test/ChainG.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ChainG.java
- * Written by Eric Kim, Sun Microsystems.
+ * Written by Eric Kim.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/ChainModel.java b/com/sun/electric/tool/simulation/test/ChainModel.java
index 5773383..f825569 100644
--- a/com/sun/electric/tool/simulation/test/ChainModel.java
+++ b/com/sun/electric/tool/simulation/test/ChainModel.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ChainModel.java
- * Written by Eric Kim and Tom O'Neill, Sun Microsystems.
+ * Written by Eric Kim and Tom O'Neill.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/ChainNode.java b/com/sun/electric/tool/simulation/test/ChainNode.java
index 321eea8..90e92da 100644
--- a/com/sun/electric/tool/simulation/test/ChainNode.java
+++ b/com/sun/electric/tool/simulation/test/ChainNode.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ChainNode.java
- * Written by Eric Kim and Tom O'Neill, Sun Microsystems.
+ * Written by Eric Kim and Tom O'Neill.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/ChainNodeDuplicate.java b/com/sun/electric/tool/simulation/test/ChainNodeDuplicate.java
index 9888b1d..4efcb6c 100644
--- a/com/sun/electric/tool/simulation/test/ChainNodeDuplicate.java
+++ b/com/sun/electric/tool/simulation/test/ChainNodeDuplicate.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ChainNodeDuplicate.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/ChainTest.java b/com/sun/electric/tool/simulation/test/ChainTest.java
index 53c7004..a875937 100644
--- a/com/sun/electric/tool/simulation/test/ChainTest.java
+++ b/com/sun/electric/tool/simulation/test/ChainTest.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ChainTest.java
- * Written by Tom O'Neill, Sun Microsystems.
+ * Written by Tom O'Neill.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/ChipModel.java b/com/sun/electric/tool/simulation/test/ChipModel.java
index 43a8486..eba8d3a 100644
--- a/com/sun/electric/tool/simulation/test/ChipModel.java
+++ b/com/sun/electric/tool/simulation/test/ChipModel.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ChipModel.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/ChipNode.java b/com/sun/electric/tool/simulation/test/ChipNode.java
index d5ed14c..4f758da 100644
--- a/com/sun/electric/tool/simulation/test/ChipNode.java
+++ b/com/sun/electric/tool/simulation/test/ChipNode.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ChipNode.java
- * Written by Eric Kim, Sun Microsystems.
+ * Written by Eric Kim.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/CompareXML.java b/com/sun/electric/tool/simulation/test/CompareXML.java
index 0e00853..fb0c853 100644
--- a/com/sun/electric/tool/simulation/test/CompareXML.java
+++ b/com/sun/electric/tool/simulation/test/CompareXML.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: CompareXML.java
- * Written by Tom O'Neill, Sun Microsystems.
+ * Written by Tom O'Neill.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/CurrentReadable.java b/com/sun/electric/tool/simulation/test/CurrentReadable.java
index 6c25a3f..7054353 100644
--- a/com/sun/electric/tool/simulation/test/CurrentReadable.java
+++ b/com/sun/electric/tool/simulation/test/CurrentReadable.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: CurrentReadable.java
- * Written by Tom O'Neill, Sun Microsystems.
+ * Written by Tom O'Neill.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/Equipment.java b/com/sun/electric/tool/simulation/test/Equipment.java
index 0607ebe..d33c905 100644
--- a/com/sun/electric/tool/simulation/test/Equipment.java
+++ b/com/sun/electric/tool/simulation/test/Equipment.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: Equipment.java
- * Written by Eric Kim and Tom O'Neill, Sun Microsystems.
+ * Written by Eric Kim and Tom O'Neill.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/EquipmentInterface.java b/com/sun/electric/tool/simulation/test/EquipmentInterface.java
index 79e37f8..ea1350c 100644
--- a/com/sun/electric/tool/simulation/test/EquipmentInterface.java
+++ b/com/sun/electric/tool/simulation/test/EquipmentInterface.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: EquipmentInterface.java
- * Written by Frankie Liu, Sun Microsystems.
+ * Written by Frankie Liu.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/ExecProcess.java b/com/sun/electric/tool/simulation/test/ExecProcess.java
index e188671..0a61e43 100644
--- a/com/sun/electric/tool/simulation/test/ExecProcess.java
+++ b/com/sun/electric/tool/simulation/test/ExecProcess.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ExecProcess.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/GPIB.java b/com/sun/electric/tool/simulation/test/GPIB.java
index d925474..412f4b4 100644
--- a/com/sun/electric/tool/simulation/test/GPIB.java
+++ b/com/sun/electric/tool/simulation/test/GPIB.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: GPIB.java
- * Written by Eric Kim and Tom O'Neill, Sun Microsystems.
+ * Written by Eric Kim and Tom O'Neill.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/HP34401A.java b/com/sun/electric/tool/simulation/test/HP34401A.java
index 4d99d1d..87151e9 100644
--- a/com/sun/electric/tool/simulation/test/HP34401A.java
+++ b/com/sun/electric/tool/simulation/test/HP34401A.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: HP34401A.java
- * Written by Dave Hopkins and Tom O'Neill, Sun Microsystems.
+ * Written by Dave Hopkins and Tom O'Neill.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/HP548xxA.java b/com/sun/electric/tool/simulation/test/HP548xxA.java
index 3202256..39c11f5 100644
--- a/com/sun/electric/tool/simulation/test/HP548xxA.java
+++ b/com/sun/electric/tool/simulation/test/HP548xxA.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: HP548xxA.java
- * Written by Ron Ho and Tom O'Neill, Sun Microsystems.
+ * Written by Ron Ho and Tom O'Neill.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/HP6624A.java b/com/sun/electric/tool/simulation/test/HP6624A.java
index 3245b37..122bc20 100644
--- a/com/sun/electric/tool/simulation/test/HP6624A.java
+++ b/com/sun/electric/tool/simulation/test/HP6624A.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: HP6624A.java
- * Written by David Hopkins and Tom O'Neill, Sun Microsystems.
+ * Written by David Hopkins and Tom O'Neill.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/HP6624AChannel.java b/com/sun/electric/tool/simulation/test/HP6624AChannel.java
index 245c31a..5b81c4d 100644
--- a/com/sun/electric/tool/simulation/test/HP6624AChannel.java
+++ b/com/sun/electric/tool/simulation/test/HP6624AChannel.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: HP6624AChannel.java
- * Written by Tom O'Neill, Sun Microsystems.
+ * Written by Tom O'Neill.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/HP80000.java b/com/sun/electric/tool/simulation/test/HP80000.java
index a1cb133..8fd1139 100644
--- a/com/sun/electric/tool/simulation/test/HP80000.java
+++ b/com/sun/electric/tool/simulation/test/HP80000.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: HP80000.java
- * Written by David Hopkins, Sun Microsystems.
+ * Written by David Hopkins.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/HP81250.java b/com/sun/electric/tool/simulation/test/HP81250.java
index 98c198b..5ab930d 100644
--- a/com/sun/electric/tool/simulation/test/HP81250.java
+++ b/com/sun/electric/tool/simulation/test/HP81250.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: HP81250.java
- * Written by Ajanta Chakraborty, Sun Microsystems.
+ * Written by Ajanta Chakraborty.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/HsimModel.java b/com/sun/electric/tool/simulation/test/HsimModel.java
index 4a557ba..30cb543 100644
--- a/com/sun/electric/tool/simulation/test/HsimModel.java
+++ b/com/sun/electric/tool/simulation/test/HsimModel.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: HsimModel.java
- * Written by Frankie Liu, Sun Microsystems.
+ * Written by Frankie Liu.
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/IndirectSet.java b/com/sun/electric/tool/simulation/test/IndirectSet.java
index 22c2d3c..da7c0a8 100644
--- a/com/sun/electric/tool/simulation/test/IndirectSet.java
+++ b/com/sun/electric/tool/simulation/test/IndirectSet.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: IndirectSet.java
- * Written by Tom O'Neill, Sun Microsystems.
+ * Written by Tom O'Neill.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/Infrastructure.java b/com/sun/electric/tool/simulation/test/Infrastructure.java
index 92bb0bc..ed0630b 100644
--- a/com/sun/electric/tool/simulation/test/Infrastructure.java
+++ b/com/sun/electric/tool/simulation/test/Infrastructure.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: Infrastructure.java
- * Written by Tom O'Neill, Sun Microsystems.
+ * Written by Tom O'Neill.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/JtagLogicLevel.java b/com/sun/electric/tool/simulation/test/JtagLogicLevel.java
index 08020df..846b6f8 100644
--- a/com/sun/electric/tool/simulation/test/JtagLogicLevel.java
+++ b/com/sun/electric/tool/simulation/test/JtagLogicLevel.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: JtagLogicLevel.java
- * Written by Tom O'Neill, Sun Microsystems.
+ * Written by Tom O'Neill.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/JtagSubchainTesterModel.java b/com/sun/electric/tool/simulation/test/JtagSubchainTesterModel.java
index a5669fd..2bb04ad 100644
--- a/com/sun/electric/tool/simulation/test/JtagSubchainTesterModel.java
+++ b/com/sun/electric/tool/simulation/test/JtagSubchainTesterModel.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: JtagSubchainTesterModel.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/JtagTester.java b/com/sun/electric/tool/simulation/test/JtagTester.java
index 911576a..739e32c 100644
--- a/com/sun/electric/tool/simulation/test/JtagTester.java
+++ b/com/sun/electric/tool/simulation/test/JtagTester.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: JtagTester.java
- * Written by Tom O'Neill, Sun Microsystems.
+ * Written by Tom O'Neill.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/JtagTesterModel.java b/com/sun/electric/tool/simulation/test/JtagTesterModel.java
index 4a11b95..8f07505 100644
--- a/com/sun/electric/tool/simulation/test/JtagTesterModel.java
+++ b/com/sun/electric/tool/simulation/test/JtagTesterModel.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: JtagTesterModel.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/Logger.java b/com/sun/electric/tool/simulation/test/Logger.java
index 4ca01ba..4606d66 100644
--- a/com/sun/electric/tool/simulation/test/Logger.java
+++ b/com/sun/electric/tool/simulation/test/Logger.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: Logger.java
- * Written by Tom O'Neill, Sun Microsystems.
+ * Written by Tom O'Neill.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/LogicLevel.java b/com/sun/electric/tool/simulation/test/LogicLevel.java
index 335c10a..88b805e 100644
--- a/com/sun/electric/tool/simulation/test/LogicLevel.java
+++ b/com/sun/electric/tool/simulation/test/LogicLevel.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: LogicLevel.java
- * Written by Tom O'Neill, Sun Microsystems.
+ * Written by Tom O'Neill.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/LogicSettable.java b/com/sun/electric/tool/simulation/test/LogicSettable.java
index 9be4c4f..2067df9 100644
--- a/com/sun/electric/tool/simulation/test/LogicSettable.java
+++ b/com/sun/electric/tool/simulation/test/LogicSettable.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: LogicSettable.java
- * Written by Tom O'Neill, Sun Microsystems.
+ * Written by Tom O'Neill.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/LogicSettableArray.java b/com/sun/electric/tool/simulation/test/LogicSettableArray.java
index 2025124..76313a5 100644
--- a/com/sun/electric/tool/simulation/test/LogicSettableArray.java
+++ b/com/sun/electric/tool/simulation/test/LogicSettableArray.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: LogicSettableArray.java
- * Written by Tom O'Neill, Sun Microsystems.
+ * Written by Tom O'Neill.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/ManualPowerChannel.java b/com/sun/electric/tool/simulation/test/ManualPowerChannel.java
index 5e099fa..295364e 100644
--- a/com/sun/electric/tool/simulation/test/ManualPowerChannel.java
+++ b/com/sun/electric/tool/simulation/test/ManualPowerChannel.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ManualPowerChannel.java
- * Written by Tom O'Neill, Sun Microsystems.
+ * Written by Tom O'Neill.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/MockJtag.java b/com/sun/electric/tool/simulation/test/MockJtag.java
index 362ffa6..5f42e1f 100644
--- a/com/sun/electric/tool/simulation/test/MockJtag.java
+++ b/com/sun/electric/tool/simulation/test/MockJtag.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: MockJtag.java
- * Written by Tom O'Neill, Sun Microsystems.
+ * Written by Tom O'Neill.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/MyChartFrame.java b/com/sun/electric/tool/simulation/test/MyChartFrame.java
index fd40a50..2efccdf 100644
--- a/com/sun/electric/tool/simulation/test/MyChartFrame.java
+++ b/com/sun/electric/tool/simulation/test/MyChartFrame.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: MyChartFrame.java
- * Written by Tom O'Neill, Sun Microsystems.
+ * Written by Tom O'Neill.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/MyTreeNode.java b/com/sun/electric/tool/simulation/test/MyTreeNode.java
index 6156ed1..ff21d6b 100644
--- a/com/sun/electric/tool/simulation/test/MyTreeNode.java
+++ b/com/sun/electric/tool/simulation/test/MyTreeNode.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: MyTreeNode.java
- * Written by Eric Kim, Sun Microsystems.
+ * Written by Eric Kim.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/Name.java b/com/sun/electric/tool/simulation/test/Name.java
index 4bb7954..305dea7 100644
--- a/com/sun/electric/tool/simulation/test/Name.java
+++ b/com/sun/electric/tool/simulation/test/Name.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: Name.java
- * Written by Eric Kim, Sun Microsystems.
+ * Written by Eric Kim.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/NanosimBERT.java b/com/sun/electric/tool/simulation/test/NanosimBERT.java
index a427364..9ee4217 100644
--- a/com/sun/electric/tool/simulation/test/NanosimBERT.java
+++ b/com/sun/electric/tool/simulation/test/NanosimBERT.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: Name.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/NanosimDataAnalyzer.java b/com/sun/electric/tool/simulation/test/NanosimDataAnalyzer.java
index 30ee4d3..9d83f54 100644
--- a/com/sun/electric/tool/simulation/test/NanosimDataAnalyzer.java
+++ b/com/sun/electric/tool/simulation/test/NanosimDataAnalyzer.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: NanosimDataAnalyzer.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/NanosimDataGen.java b/com/sun/electric/tool/simulation/test/NanosimDataGen.java
index 3443253..ea3de59 100644
--- a/com/sun/electric/tool/simulation/test/NanosimDataGen.java
+++ b/com/sun/electric/tool/simulation/test/NanosimDataGen.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: NanosimDataGen.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/NanosimJtag.java b/com/sun/electric/tool/simulation/test/NanosimJtag.java
index 6ed3c3d..986e22c 100644
--- a/com/sun/electric/tool/simulation/test/NanosimJtag.java
+++ b/com/sun/electric/tool/simulation/test/NanosimJtag.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: NanosimJtag.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/NanosimJtagSubchainTester.java b/com/sun/electric/tool/simulation/test/NanosimJtagSubchainTester.java
index 10de6ee..013b95e 100644
--- a/com/sun/electric/tool/simulation/test/NanosimJtagSubchainTester.java
+++ b/com/sun/electric/tool/simulation/test/NanosimJtagSubchainTester.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: NanosimJtagSubchainTester.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/NanosimJtagTester.java b/com/sun/electric/tool/simulation/test/NanosimJtagTester.java
index bb563b0..679ae82 100644
--- a/com/sun/electric/tool/simulation/test/NanosimJtagTester.java
+++ b/com/sun/electric/tool/simulation/test/NanosimJtagTester.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: NanosimJtagTester.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/NanosimLogicSettable.java b/com/sun/electric/tool/simulation/test/NanosimLogicSettable.java
index 9124c8a..cbe727c 100644
--- a/com/sun/electric/tool/simulation/test/NanosimLogicSettable.java
+++ b/com/sun/electric/tool/simulation/test/NanosimLogicSettable.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: NanosimLogicSettable.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/NanosimModel.java b/com/sun/electric/tool/simulation/test/NanosimModel.java
index 11327b8..893f124 100644
--- a/com/sun/electric/tool/simulation/test/NanosimModel.java
+++ b/com/sun/electric/tool/simulation/test/NanosimModel.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: NanosimModel.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/Netscan.java b/com/sun/electric/tool/simulation/test/Netscan.java
index d117e66..6755e16 100644
--- a/com/sun/electric/tool/simulation/test/Netscan.java
+++ b/com/sun/electric/tool/simulation/test/Netscan.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: Netscan.java
- * Written by Eric Kim and Tom O'Neill, Sun Microsystems.
+ * Written by Eric Kim and Tom O'Neill.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/Netscan4.java b/com/sun/electric/tool/simulation/test/Netscan4.java
index 11841cd..2bc97bd 100644
--- a/com/sun/electric/tool/simulation/test/Netscan4.java
+++ b/com/sun/electric/tool/simulation/test/Netscan4.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: Netscan4.java
- * Written by Tom O'Neill, Sun Microsystems.
+ * Written by Tom O'Neill.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/Netscan4Driver.java b/com/sun/electric/tool/simulation/test/Netscan4Driver.java
index 0988325..a0d18e4 100644
--- a/com/sun/electric/tool/simulation/test/Netscan4Driver.java
+++ b/com/sun/electric/tool/simulation/test/Netscan4Driver.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: Netscan4Driver.java
- * Written by Tom O'Neill, Sun Microsystems.
+ * Written by Tom O'Neill.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/Netscan4JNI.java b/com/sun/electric/tool/simulation/test/Netscan4JNI.java
index b92fcf4..d58e98b 100644
--- a/com/sun/electric/tool/simulation/test/Netscan4JNI.java
+++ b/com/sun/electric/tool/simulation/test/Netscan4JNI.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: Netscan4JNI.java
- * Written by Alex Chow and Tom O'Neill, Sun Microsystems.
+ * Written by Alex Chow and Tom O'Neill.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/NetscanGeneric.java b/com/sun/electric/tool/simulation/test/NetscanGeneric.java
index 5679cc1..75ae0fc 100644
--- a/com/sun/electric/tool/simulation/test/NetscanGeneric.java
+++ b/com/sun/electric/tool/simulation/test/NetscanGeneric.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: NetscanGeneric.java
- * Written by Eric Kim and Tom O'Neill, Sun Microsystems.
+ * Written by Eric Kim and Tom O'Neill.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/NetscanJNI.java b/com/sun/electric/tool/simulation/test/NetscanJNI.java
index 7c47017..909aee7 100644
--- a/com/sun/electric/tool/simulation/test/NetscanJNI.java
+++ b/com/sun/electric/tool/simulation/test/NetscanJNI.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: NetscanJNI.java
- * Written by Eric Kim and Tom O'Neill, Sun Microsystems.
+ * Written by Eric Kim and Tom O'Neill.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/PowerChannel.java b/com/sun/electric/tool/simulation/test/PowerChannel.java
index 96298bc..7456f0b 100644
--- a/com/sun/electric/tool/simulation/test/PowerChannel.java
+++ b/com/sun/electric/tool/simulation/test/PowerChannel.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: PowerChannel.java
- * Written by Tom O'Neill, Sun Microsystems.
+ * Written by Tom O'Neill.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/PowerChannelResistorVoltageReadable.java b/com/sun/electric/tool/simulation/test/PowerChannelResistorVoltageReadable.java
index 1f189f1..3ef82c4 100644
--- a/com/sun/electric/tool/simulation/test/PowerChannelResistorVoltageReadable.java
+++ b/com/sun/electric/tool/simulation/test/PowerChannelResistorVoltageReadable.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: PowerChannelResistorVoltageReadable.java
- * Written by Michael Dayringer and Adam Megacz, Sun Microsystems.
+ * Written by Michael Dayringer and Adam Megacz.
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/Pst3202.java b/com/sun/electric/tool/simulation/test/Pst3202.java
index ecd53e2..27775c3 100644
--- a/com/sun/electric/tool/simulation/test/Pst3202.java
+++ b/com/sun/electric/tool/simulation/test/Pst3202.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: Pst3202.java
- * Written by Ajanta Chakraborty, Sun Microsystems.
+ * Written by Ajanta Chakraborty.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/Pst3202Channel.java b/com/sun/electric/tool/simulation/test/Pst3202Channel.java
index ed039ef..ea325ce 100644
--- a/com/sun/electric/tool/simulation/test/Pst3202Channel.java
+++ b/com/sun/electric/tool/simulation/test/Pst3202Channel.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: Pst3202Channel.java
- * Written by Tom O'Neill, Sun Microsystems.
+ * Written by Tom O'Neill.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/ResistorCurrent.java b/com/sun/electric/tool/simulation/test/ResistorCurrent.java
index fd9d90a..6f2232e 100644
--- a/com/sun/electric/tool/simulation/test/ResistorCurrent.java
+++ b/com/sun/electric/tool/simulation/test/ResistorCurrent.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ResistorCurrent.java
- * Written by Tom O'Neill, Sun Microsystems.
+ * Written by Tom O'Neill.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/SamplerControl.java b/com/sun/electric/tool/simulation/test/SamplerControl.java
index de1b893..a944838 100644
--- a/com/sun/electric/tool/simulation/test/SamplerControl.java
+++ b/com/sun/electric/tool/simulation/test/SamplerControl.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: SamplerControl.java
- * Written by Tom O'Neill, Sun Microsystems.
+ * Written by Tom O'Neill.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/ScanChainXML.java b/com/sun/electric/tool/simulation/test/ScanChainXML.java
index d604af3..6a04415 100644
--- a/com/sun/electric/tool/simulation/test/ScanChainXML.java
+++ b/com/sun/electric/tool/simulation/test/ScanChainXML.java
@@ -4,7 +4,7 @@
*
* File: ScanChainXML.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -2276,7 +2276,7 @@ public class ScanChainXML extends HierarchyEnumerator.Visitor {
* Get the network attached to port 'portName' on nodable 'no'.
* @param no
* @param portName
- * @return
+ * @return attached Network
*/
private static Network getNetwork(Nodable no, Netlist netlist, String portName) {
for (Iterator<PortProto> it = no.getProto().getPorts(); it.hasNext(); ) {
diff --git a/com/sun/electric/tool/simulation/test/Signalyzer.java b/com/sun/electric/tool/simulation/test/Signalyzer.java
index bae1208..525336f 100644
--- a/com/sun/electric/tool/simulation/test/Signalyzer.java
+++ b/com/sun/electric/tool/simulation/test/Signalyzer.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: SamplerControl.java
- * Written by Adam Megacz, Sun Microsystems.
+ * Written by Adam Megacz.
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/SiliconChip.java b/com/sun/electric/tool/simulation/test/SiliconChip.java
index b3b5341..695c826 100644
--- a/com/sun/electric/tool/simulation/test/SiliconChip.java
+++ b/com/sun/electric/tool/simulation/test/SiliconChip.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: SiliconChip.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/SimpleBus.java b/com/sun/electric/tool/simulation/test/SimpleBus.java
index 5639903..c884907 100644
--- a/com/sun/electric/tool/simulation/test/SimpleBus.java
+++ b/com/sun/electric/tool/simulation/test/SimpleBus.java
@@ -4,7 +4,7 @@
*
* File: SimpleBus.java
*
- * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/SimulationModel.java b/com/sun/electric/tool/simulation/test/SimulationModel.java
index 7250922..3a3267a 100644
--- a/com/sun/electric/tool/simulation/test/SimulationModel.java
+++ b/com/sun/electric/tool/simulation/test/SimulationModel.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: SimulationModel.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/SocketEquipment.java b/com/sun/electric/tool/simulation/test/SocketEquipment.java
index 04a0b1c..2543741 100644
--- a/com/sun/electric/tool/simulation/test/SocketEquipment.java
+++ b/com/sun/electric/tool/simulation/test/SocketEquipment.java
@@ -4,7 +4,7 @@
*
* File: SocketEquipment.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/SubchainNode.java b/com/sun/electric/tool/simulation/test/SubchainNode.java
index a322eee..e391baa 100644
--- a/com/sun/electric/tool/simulation/test/SubchainNode.java
+++ b/com/sun/electric/tool/simulation/test/SubchainNode.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: SubchainNode.java
- * Written by Eric Kim and Tom O'Neill, Sun Microsystems.
+ * Written by Eric Kim and Tom O'Neill.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/T2500.java b/com/sun/electric/tool/simulation/test/T2500.java
index c33249a..63dfe4d 100644
--- a/com/sun/electric/tool/simulation/test/T2500.java
+++ b/com/sun/electric/tool/simulation/test/T2500.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: T2500.java
- * Written by Hesam Fathi Moghadam, Sun Microsystems.
+ * Written by Hesam Fathi Moghadam.
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/TestNode.java b/com/sun/electric/tool/simulation/test/TestNode.java
index c58d298..2171a31 100644
--- a/com/sun/electric/tool/simulation/test/TestNode.java
+++ b/com/sun/electric/tool/simulation/test/TestNode.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: TestNode.java
- * Written by Tom O'Neill, Sun Microsystems.
+ * Written by Tom O'Neill.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/TextUtils.java b/com/sun/electric/tool/simulation/test/TextUtils.java
index a5231f6..8e0fb64 100644
--- a/com/sun/electric/tool/simulation/test/TextUtils.java
+++ b/com/sun/electric/tool/simulation/test/TextUtils.java
@@ -4,7 +4,7 @@
*
* File: TextUtils.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/VerilogJtagSubchainTester.java b/com/sun/electric/tool/simulation/test/VerilogJtagSubchainTester.java
index 28d373e..bb0ad82 100644
--- a/com/sun/electric/tool/simulation/test/VerilogJtagSubchainTester.java
+++ b/com/sun/electric/tool/simulation/test/VerilogJtagSubchainTester.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: VerilogJtagSubchainTester.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/VerilogJtagTester.java b/com/sun/electric/tool/simulation/test/VerilogJtagTester.java
index 0868a6f..6916d61 100644
--- a/com/sun/electric/tool/simulation/test/VerilogJtagTester.java
+++ b/com/sun/electric/tool/simulation/test/VerilogJtagTester.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: VerilogJtagTester.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/VerilogLogicSettable.java b/com/sun/electric/tool/simulation/test/VerilogLogicSettable.java
index 3104071..62d83ca 100644
--- a/com/sun/electric/tool/simulation/test/VerilogLogicSettable.java
+++ b/com/sun/electric/tool/simulation/test/VerilogLogicSettable.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: VerilogLogicSettable.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/VerilogModel.java b/com/sun/electric/tool/simulation/test/VerilogModel.java
index 73e998e..33c689a 100644
--- a/com/sun/electric/tool/simulation/test/VerilogModel.java
+++ b/com/sun/electric/tool/simulation/test/VerilogModel.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: VerilogModel.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/VerilogParser.java b/com/sun/electric/tool/simulation/test/VerilogParser.java
index e0fe488..258af9d 100644
--- a/com/sun/electric/tool/simulation/test/VerilogParser.java
+++ b/com/sun/electric/tool/simulation/test/VerilogParser.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: VerilogParser.java
- * Written by Jonathan Gainsley, Sun Microsystems.
+ * Written by Jonathan Gainsley.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/VoltageReadable.java b/com/sun/electric/tool/simulation/test/VoltageReadable.java
index f420007..5c8db52 100644
--- a/com/sun/electric/tool/simulation/test/VoltageReadable.java
+++ b/com/sun/electric/tool/simulation/test/VoltageReadable.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: VoltageReadable.java
- * Written by Tom O'Neill, Sun Microsystems.
+ * Written by Tom O'Neill.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/XMLIO.java b/com/sun/electric/tool/simulation/test/XMLIO.java
index 512da24..ca2e78f 100644
--- a/com/sun/electric/tool/simulation/test/XMLIO.java
+++ b/com/sun/electric/tool/simulation/test/XMLIO.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: XMLIO.java
- * Written by Eric Kim, Sun Microsystems.
+ * Written by Eric Kim.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/f206.java b/com/sun/electric/tool/simulation/test/f206.java
index 892dd80..8e4984d 100644
--- a/com/sun/electric/tool/simulation/test/f206.java
+++ b/com/sun/electric/tool/simulation/test/f206.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: f206.java
- * Written by Ajanta Chakraborty, Sun Microsystems.
+ * Written by Ajanta Chakraborty.
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/simulation/test/package.html b/com/sun/electric/tool/simulation/test/package.html
index 9bc6624..f7f60cc 100644
--- a/com/sun/electric/tool/simulation/test/package.html
+++ b/com/sun/electric/tool/simulation/test/package.html
@@ -2,7 +2,7 @@
<BODY>
Chip-independent test software library for the
-Asynchronous Design Group in Sun Labs, see bottom
+Asynchronous Design Group in Oracle Labs, see bottom
for locations of documentation.
Each heading below is a copy of one documentation file that used to be
@@ -10,7 +10,7 @@ in the old <tt>com.sun.electric.tool.simulation.test</tt> CVS repository. All
non-documentation files now appear
in <tt>electric/srcj/com/sun/async/test/</tt>. The only remaining
files which do not appear in either of these two places are the
-following files, whose copyright is held by entities other than Sun
+following files, whose copyright is held by entities other than Oracle
(and therefore we can't distribute them with Electric):
<pre>
diff --git a/com/sun/electric/tool/user/ActivityLogger.java b/com/sun/electric/tool/user/ActivityLogger.java
index 1513690..3cb69d2 100644
--- a/com/sun/electric/tool/user/ActivityLogger.java
+++ b/com/sun/electric/tool/user/ActivityLogger.java
@@ -4,7 +4,7 @@
*
* File: ActivityLogger.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -43,7 +43,6 @@ import java.security.SecureRandom;
*/
public class ActivityLogger {
- /** true if a test version */ private static final boolean TEST_VERSION = Version.getVersion().getDetail() != 999;
/** log menu activations */ private static boolean logMenuActivations;
/** log jobs starting */ private static boolean logJobs;
/** timestamp everything */ private static boolean logTimeStamps;
@@ -115,11 +114,6 @@ public class ActivityLogger {
*/
public static synchronized void finished() {
if (out != null) out.close();
- if (exceptionLogged && TEST_VERSION) {
- Job.getUserInterface().showInformationMessage(
- "Exception logged. Please send \n \""+outputFile+"\"\n to the developers",
- "Exception Logged");
- }
}
/**
@@ -213,18 +207,9 @@ public class ActivityLogger {
out.flush();
}
e.printStackTrace(System.out);
- String msg1 = "Exception Caught!!!";
- String msg2 = "The exception below has been logged in '" +outputFile+"'.";
- String msg3 = "Please help us and report error to developers using 'Bugzilla'. In case of no access, send logfile to the developers.";
- String msg4 = e.toString();
- String msg;
- if (TEST_VERSION)
- {
- msg = msg1 + "\n" + msg2 + "\n" + msg3 + "\n" + msg4;
- } else
- {
- msg = msg1 + "\n" + msg2 + "\n" + msg4;
- }
+ String msg = "Exception Caught!!!\n" +
+ e.toString() + "\n" +
+ "The exception has been logged in '" +outputFile+"'";
if (Job.getUserInterface() != null) {
Job.getUserInterface().showErrorMessage(msg, "Exception Caught");
} else {
diff --git a/com/sun/electric/tool/user/CantEditException.java b/com/sun/electric/tool/user/CantEditException.java
index a1b6910..92b5f21 100644
--- a/com/sun/electric/tool/user/CantEditException.java
+++ b/com/sun/electric/tool/user/CantEditException.java
@@ -4,7 +4,7 @@
*
* File: CantEditException.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/CellChangeJobs.java b/com/sun/electric/tool/user/CellChangeJobs.java
index 18ca09d..eb87fee 100644
--- a/com/sun/electric/tool/user/CellChangeJobs.java
+++ b/com/sun/electric/tool/user/CellChangeJobs.java
@@ -4,7 +4,7 @@
*
* File: CellChangeJobs.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/CircuitChangeJobs.java b/com/sun/electric/tool/user/CircuitChangeJobs.java
index eb0c75b..a6eefeb 100644
--- a/com/sun/electric/tool/user/CircuitChangeJobs.java
+++ b/com/sun/electric/tool/user/CircuitChangeJobs.java
@@ -4,7 +4,7 @@
*
* File: CircuitChangeJobs.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -1949,7 +1949,7 @@ public class CircuitChangeJobs
if (cantEdit(cell, ni, true, false, true) != 0) return false;
ni.move(dX, dY);
- if (verbose) System.out.println("Moved node " + ni.describe(false) + " by (" + dX + "," + dY + ")");
+ if (verbose) System.out.println("Moved node " + ni.describe(false) + " by (" + TextUtils.formatDistance(dX) + "," + TextUtils.formatDistance(dY) + ")");
updateStatusBar = true;
fieldVariableChanged("updateStatusBar");
return true;
@@ -2074,7 +2074,7 @@ public class CircuitChangeJobs
{
ArcInst ai = (ArcInst)eobj;
ai.modify(dX, dY, dX, dY);
- if (verbose) System.out.println("Moved arc " + ai.describe(false) + " by (" + dX + "," + dY + ")");
+ if (verbose) System.out.println("Moved arc " + ai.describe(false) + " by (" + TextUtils.formatDistance(dX) + "," + TextUtils.formatDistance(dY) + ")");
}
}
updateStatusBar = true;
@@ -2886,7 +2886,7 @@ public class CircuitChangeJobs
*/
public static NodeInst replaceNodeInst(NodeInst oldNi, NodeProto newNp, PrimitiveNode.Function newFunc, boolean ignorePortNames,
boolean allowMissingPorts, boolean preseveParameters, EditingPreferences ep) {
- BatchChanges.NodeReplacement replacement = new BatchChanges.NodeReplacement(oldNi, newNp, newFunc);
+ BatchChanges.NodeReplacement replacement = new BatchChanges.NodeReplacement(oldNi, newNp, newFunc, null);
if (!oldNi.checkReplacement(replacement, ep, ignorePortNames, allowMissingPorts)) {
return null;
}
diff --git a/com/sun/electric/tool/user/CircuitChanges.java b/com/sun/electric/tool/user/CircuitChanges.java
index 3096971..1b91453 100644
--- a/com/sun/electric/tool/user/CircuitChanges.java
+++ b/com/sun/electric/tool/user/CircuitChanges.java
@@ -4,7 +4,7 @@
*
* File: CircuitChanges.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -839,13 +839,24 @@ public class CircuitChanges
List<NodeInst> selected = MenuCommands.getSelectedNodes();
List<NodeInst> instances = new ArrayList<NodeInst>();
+ int schematicCells = 0;
for(NodeInst ni : selected)
{
- if (ni.isCellInstance()) instances.add(ni);
+ if (!ni.isCellInstance()) continue;
+ if (!ni.getProto().getTechnology().isLayout())
+ {
+ schematicCells++;
+ continue;
+ }
+ instances.add(ni);
}
+ if (schematicCells > 0)
+ System.out.println("WARNING: Cannot extract non-layout cells (" + schematicCells + " selected)");
if (instances.size() == 0)
{
- System.out.println("No cell instances are selected...no extraction done");
+ String msg = "No extraction done";
+ if (schematicCells == 0) msg = "No cell instances are selected..." + msg;
+ System.out.println(msg);
return;
}
new CellChangeJobs.ExtractCellInstances(cell, instances, depth, User.isExtractCopiesExports(),
diff --git a/com/sun/electric/tool/user/Clipboard.java b/com/sun/electric/tool/user/Clipboard.java
index da9d2e9..f2e48f7 100644
--- a/com/sun/electric/tool/user/Clipboard.java
+++ b/com/sun/electric/tool/user/Clipboard.java
@@ -4,7 +4,7 @@
*
* File: Clipboard.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -933,7 +933,9 @@ public class Clipboard //implements ClipboardOwner
public static void clear()
{
Cell clipCell = getClipCell();
- // delete all arcs in the clipboard
+ if (clipCell == null) return;
+
+ // delete all arcs in the clipboard
List<ArcInst> arcsToDelete = new ArrayList<ArcInst>();
for(Iterator<ArcInst> it = clipCell.getArcs(); it.hasNext(); )
arcsToDelete.add(it.next());
diff --git a/com/sun/electric/tool/user/CompileVHDL.java b/com/sun/electric/tool/user/CompileVHDL.java
index 80640d6..8bc6a4a 100644
--- a/com/sun/electric/tool/user/CompileVHDL.java
+++ b/com/sun/electric/tool/user/CompileVHDL.java
@@ -5,9 +5,9 @@
* File: CompileVHDL.java
* Compile VHDL to a netlist
* Written by Andrew R. Kostiuk, Queen's University.
- * Translated to Java by Steven M. Rubin, Sun Microsystems.
+ * Translated to Java by Steven M. Rubin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/CompileVerilogStruct.java b/com/sun/electric/tool/user/CompileVerilogStruct.java
index e5e08e7..8206d3e 100644
--- a/com/sun/electric/tool/user/CompileVerilogStruct.java
+++ b/com/sun/electric/tool/user/CompileVerilogStruct.java
@@ -5,7 +5,7 @@
* File: CompileVerilogStruct.java
* Compile Structural Verilog to a netlist
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ErrorHighlight.java b/com/sun/electric/tool/user/ErrorHighlight.java
index ce8cea9..6a778ee 100644
--- a/com/sun/electric/tool/user/ErrorHighlight.java
+++ b/com/sun/electric/tool/user/ErrorHighlight.java
@@ -4,7 +4,7 @@
*
* File: ErrorHighlight.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ErrorLogger.java b/com/sun/electric/tool/user/ErrorLogger.java
index f6dd0d1..f99ab61 100644
--- a/com/sun/electric/tool/user/ErrorLogger.java
+++ b/com/sun/electric/tool/user/ErrorLogger.java
@@ -4,7 +4,7 @@
*
* File: ErrorLogger.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -79,12 +79,12 @@ import org.xml.sax.helpers.DefaultHandler;
*/
public class ErrorLogger implements Serializable
{
- private final static int MAX_MESSAGELOGS = 100000;
+// private final static int MAX_MESSAGELOGS = 100000;
/**
* Method to replace invalid characters in XML such as > or <
* @param message
- * @return
+ * @return corrected String.
*/
private static String correctXmlString(String message)
{
@@ -313,6 +313,7 @@ public class ErrorLogger implements Serializable
private String errorSystem;
private boolean terminated;
private boolean persistent; // cannot be deleted
+ private boolean disablePopups;
private Map<Integer,String> sortKeysToGroupNames; // association of sortKeys to GroupNames
Map<Geometric,Set<MessageLog>> findLogs = new HashMap<Geometric,Set<MessageLog>>();
@@ -320,7 +321,11 @@ public class ErrorLogger implements Serializable
public String getSystem() { return errorSystem; }
- public boolean isPersistent() {return persistent;}
+ public boolean isPersistent() { return persistent; }
+
+ public boolean isPopupsDisabled() { return disablePopups; }
+
+ public void disablePopups() { disablePopups = true; }
public ErrorLogger() {}
@@ -394,6 +399,7 @@ public class ErrorLogger implements Serializable
logger.errorLimit = User.getErrorLimit();
logger.terminated = false;
logger.persistent = persistent;
+ logger.disablePopups = false;
// logger.alreadyExplained = false;
logger.sortKeysToGroupNames = null;
return logger;
diff --git a/com/sun/electric/tool/user/Exec.java b/com/sun/electric/tool/user/Exec.java
index 986af87..15b9fc6 100644
--- a/com/sun/electric/tool/user/Exec.java
+++ b/com/sun/electric/tool/user/Exec.java
@@ -4,7 +4,7 @@
*
* File: Exec.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ExportChanges.java b/com/sun/electric/tool/user/ExportChanges.java
index 7dfb17d..daf2dfc 100644
--- a/com/sun/electric/tool/user/ExportChanges.java
+++ b/com/sun/electric/tool/user/ExportChanges.java
@@ -4,7 +4,7 @@
*
* File: ExportChanges.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/GraphicsPreferences.java b/com/sun/electric/tool/user/GraphicsPreferences.java
index 9c20b62..3548a0e 100644
--- a/com/sun/electric/tool/user/GraphicsPreferences.java
+++ b/com/sun/electric/tool/user/GraphicsPreferences.java
@@ -4,7 +4,7 @@
*
* File: GraphicsPreferences.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/Highlight.java b/com/sun/electric/tool/user/Highlight.java
index a8b3695..de4b96a 100644
--- a/com/sun/electric/tool/user/Highlight.java
+++ b/com/sun/electric/tool/user/Highlight.java
@@ -4,7 +4,7 @@
*
* File: Highlight.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/HighlightConnectivity.java b/com/sun/electric/tool/user/HighlightConnectivity.java
new file mode 100644
index 0000000..8f5f750
--- /dev/null
+++ b/com/sun/electric/tool/user/HighlightConnectivity.java
@@ -0,0 +1,1271 @@
+/* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: HighlightConnectivity.java
+ * Module to find topology quickly
+ * Written by: Steven M. Rubin
+ *
+ * Copyright (c) 2016, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.user;
+
+import com.sun.electric.database.geometry.EPoint;
+import com.sun.electric.database.geometry.ERectangle;
+import com.sun.electric.database.geometry.Poly;
+import com.sun.electric.database.geometry.PolyBase;
+import com.sun.electric.database.geometry.PolyBase.Point;
+import com.sun.electric.database.geometry.PolyMerge;
+import com.sun.electric.database.hierarchy.Cell;
+import com.sun.electric.database.topology.ArcInst;
+import com.sun.electric.database.topology.Geometric;
+import com.sun.electric.database.topology.NodeInst;
+import com.sun.electric.database.topology.RTBounds;
+import com.sun.electric.database.topology.RTNode;
+import com.sun.electric.database.variable.ElectricObject;
+import com.sun.electric.database.variable.Variable;
+import com.sun.electric.technology.ArcProto;
+import com.sun.electric.technology.Layer;
+import com.sun.electric.technology.PrimitiveNode;
+import com.sun.electric.technology.Technology;
+import com.sun.electric.technology.Technology.ArcLayer;
+import com.sun.electric.technology.Technology.NodeLayer;
+import com.sun.electric.tool.Job;
+import com.sun.electric.tool.JobException;
+import com.sun.electric.tool.user.ui.EditWindow;
+import com.sun.electric.util.math.DBMath;
+import com.sun.electric.util.math.FixpTransform;
+import com.sun.electric.util.math.MutableInteger;
+import com.sun.electric.util.math.Orientation;
+
+import java.awt.Color;
+import java.awt.geom.Point2D;
+import java.awt.geom.Rectangle2D;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Class to do quick extraction of a cell, comparing metals and vias to establish topology.
+ */
+public class HighlightConnectivity
+{
+ /** Cell in which routing occurs. */ private Cell cell;
+ private List<ConnectingLayer> allConnectingLayers;
+ private List<ConnectingVia> allConnectingVias;
+ /** layer that removes metal in the technology. */ private Map<Layer,Layer> removeLayers;
+ /** the extracted topology */ private String [] topology;
+ /** key of Variable holding cell topology. */ public static final Variable.Key TOPOLOGY_QUICK_DATA = Variable.newKey("USER_topology_quick");
+ /** key of Variable holding date of cell topology. */ public static final Variable.Key TOPOLOGY_QUICK_DATE = Variable.newKey("USER_topology_quick_date");
+
+ public HighlightConnectivity(Cell cell)
+ {
+ this.cell = cell;
+
+ // see if stored topology is present and valid
+ Variable varData = cell.getVar(TOPOLOGY_QUICK_DATA);
+ if (varData != null)
+ {
+ Variable varDate = cell.getVar(TOPOLOGY_QUICK_DATE);
+ if (varDate != null)
+ {
+ Long t = (Long)varDate.getObject();
+ Date topologyDate = new Date(t.longValue());
+ if (topologyDate.after(cell.getRevisionDate()))
+ {
+ // use data stored in cell
+ topology = (String[])varData.getObject();
+ return;
+ }
+ }
+ }
+
+ // must compute topology. Start by gathering design rules and layers
+ initializeDesignRules();
+
+ // build R-Trees for all relevant layers
+ buildRTrees();
+
+ // traverse R-Trees to determine connectivity
+ extractRTrees();
+
+ // debug: show results
+// showGeometryInArea();
+
+ // gather connected geometry
+ Rectangle2D limit = cell.getBounds();
+ Map<Integer,StringBuffer> geomsOnNet = new HashMap<Integer,StringBuffer>();
+ for(ConnectingLayer cl : allConnectingLayers)
+ {
+ for (Iterator<QCBound> sea = cl.tree.search(limit); sea.hasNext();)
+ {
+ QCBound sBound = sea.next();
+ Geometric geom = sBound.getTopGeom();
+ if (geom == null) continue;
+ int thisNet = 0;
+ if (sBound.getNetID() != null && sBound.getNetID().intValue() != 0) thisNet = sBound.getNetID().intValue();
+ if (thisNet != 0)
+ {
+ Integer thisNetInt = new Integer(thisNet);
+ StringBuffer sb = geomsOnNet.get(thisNetInt);
+ if (sb == null) geomsOnNet.put(thisNetInt, sb = new StringBuffer());
+ if (sb.length() != 0) sb.append("/");
+ if (geom instanceof NodeInst)
+ {
+ NodeInst ni = (NodeInst)geom;
+ sb.append("N" + ni.getName());
+ } else
+ {
+ ArcInst ai = (ArcInst)geom;
+ sb.append("A" + ai.getName());
+ }
+ ERectangle geomRect = geom.getBounds();
+ ERectangle rTreeRect = sBound.getBounds();
+ if (geomRect.equals(sBound.getBounds())) continue;
+ sb.append("[" + rTreeRect.getMinX() + ";" + rTreeRect.getMinY() + ";" + rTreeRect.getWidth() + ";" + rTreeRect.getHeight() + "]");
+ }
+ }
+ }
+
+ // store network information
+ int numNets = geomsOnNet.size();
+ topology = new String[numNets];
+ int netNum = 0;
+ for(Integer key : geomsOnNet.keySet())
+ {
+ StringBuffer sb = geomsOnNet.get(key);
+ topology[netNum++] = sb.toString();
+ }
+ new StoreTopology(cell, topology);
+ }
+
+ /**
+ * Method to return the extracted topology.
+ * This is an array of Strings, each string listing all of the node and arc names that are connected to each other.
+ * @return the extracted topology.
+ */
+ public String[] getTopology() { return topology; }
+
+ /**
+ * Class to save computed topology in a Cell.
+ */
+ public static class StoreTopology extends Job
+ {
+ private Cell cell;
+ private String[] topology;
+
+ public StoreTopology(Cell cell, String[] topology)
+ {
+ super("Store quick topology", User.getUserTool(), Job.Type.CHANGE, null, null, Job.Priority.USER);
+ this.cell = cell;
+ this.topology = topology;
+ startJob();
+ }
+
+ public boolean doIt() throws JobException
+ {
+ // get current revision date of the cell
+ Date revDate = cell.getRevisionDate();
+
+ // store the data
+ Date nowDate = new Date();
+ cell.newVar(TOPOLOGY_QUICK_DATE, new Long(nowDate.getTime()), getEditingPreferences());
+ cell.newVar(TOPOLOGY_QUICK_DATA, topology, getEditingPreferences());
+
+ // reset revision date to ignore this change
+ cell.lowLevelSetRevisionDate(revDate);
+ return true;
+ }
+ }
+
+ /***************************** METHODS TO BUILD THE R-TREE *****************************/
+
+ private void buildRTrees()
+ {
+ // recursively add all polygons in the cell
+ Map<Layer,List<Rectangle2D>> removeGeometry = new HashMap<Layer,List<Rectangle2D>>();
+ List<EPoint> linesInNonMahnattan = new ArrayList<EPoint>();
+ boolean nonMan = addArea(cell, true, Orientation.IDENT.pureRotate(), linesInNonMahnattan, removeGeometry);
+ if (nonMan)
+ System.out.println("Non-Manhattan geometry found");
+
+ // now remove any geometry that was covered by a removal layer
+ for(Layer cutLayer : removeGeometry.keySet())
+ {
+ Layer primaryLayer = removeLayers.get(cutLayer);
+ List<Rectangle2D> removeRects = removeGeometry.get(cutLayer);
+ ConnectingLayer thisCL = null;
+ for(ConnectingLayer cl : allConnectingLayers)
+ {
+ if (cl.layers.contains(primaryLayer)) { thisCL = cl; break; }
+ }
+ if (thisCL == null) continue;
+ GeometryTree bTree = thisCL.tree;
+ for(Rectangle2D rect : removeRects)
+ {
+ List<QCBound> thingsThatGetRemoved = new ArrayList<QCBound>();
+ for (Iterator<QCBound> sea = bTree.search(rect); sea.hasNext();)
+ {
+ QCBound sBound = sea.next();
+ Rectangle2D bound = sBound.getBounds();
+ if (bound.getMaxX() <= rect.getMinX() || bound.getMinX() >= rect.getMaxX() ||
+ bound.getMaxY() <= rect.getMinY() || bound.getMinY() >= rect.getMaxY()) continue;
+ thingsThatGetRemoved.add(sBound);
+ }
+
+ // remove those R-Tree elements that get cut
+ RTNode<QCBound> rootFixp = bTree.getRoot();
+ for(QCBound s : thingsThatGetRemoved)
+ {
+ RTNode<QCBound> newRootFixp = RTNode.unLinkGeom(null, rootFixp, s);
+ if (newRootFixp != rootFixp) bTree.setRoot(rootFixp = newRootFixp);
+ }
+
+ // now reinsert geometry that wasn't removed
+ for(QCBound s : thingsThatGetRemoved)
+ {
+ PolyMerge merge = new PolyMerge();
+ merge.addRectangle(cutLayer, s.getBounds());
+ merge.subtract(cutLayer, new Poly(rect));
+ List<PolyBase> remaining = merge.getMergedPoints(cutLayer, true);
+ for(PolyBase pb : remaining)
+ {
+ ERectangle reducedBound = ERectangle.fromLambda(pb.getBounds2D());
+ QCBound qcb = new QCBound(reducedBound, s.getNetID(), s.getTopGeom());
+ RTNode<QCBound> newRootFixp = RTNode.linkGeom(null, rootFixp, qcb);
+ if (newRootFixp != rootFixp) bTree.setRoot(rootFixp = newRootFixp);
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * Method to add geometry to the blockage R-Trees.
+ * @param cell
+ * @param transToTop
+ * @param topLevel
+ * @param nextNetNumber
+ * @param linesInNonMahnattan List to store non-Manhattan geometry
+ * @return true if some of the geometry is nonmanhattan (and may cause problems)
+ */
+ private boolean addArea(Cell cell, boolean topLevel, FixpTransform transToTop,
+ List<EPoint> linesInNonMahnattan, Map<Layer,List<Rectangle2D>> removeGeometry)
+ {
+ // first add nodes
+ boolean hasNonmanhattan = false;
+ for(Iterator<NodeInst> it = cell.getNodes(); it.hasNext(); )
+ {
+ NodeInst ni = it.next();
+ if (ni.isCellInstance())
+ {
+ FixpTransform transBack = ni.transformOut(transToTop);
+ addArea((Cell)ni.getProto(), false, transBack, linesInNonMahnattan, removeGeometry);
+ } else
+ {
+ PrimitiveNode pNp = (PrimitiveNode)ni.getProto();
+ if (pNp.getFunction() == PrimitiveNode.Function.PIN) continue;
+ FixpTransform nodeTrans = ni.rotateOut(transToTop);
+ Technology tech = pNp.getTechnology();
+ Poly[] nodeInstPolyList = tech.getShapeOfNode(ni, true, false, null);
+ for (int i = 0; i < nodeInstPolyList.length; i++)
+ {
+ PolyBase poly = nodeInstPolyList[i];
+ if (addLayer(poly, topLevel ? ni : null, nodeTrans, linesInNonMahnattan, removeGeometry)) hasNonmanhattan = true;
+ }
+ }
+ }
+
+ // next add arcs
+ for(Iterator<ArcInst> it = cell.getArcs(); it.hasNext(); )
+ {
+ ArcInst ai = it.next();
+ Technology tech = ai.getProto().getTechnology();
+ PolyBase[] polys = tech.getShapeOfArc(ai);
+ for (int i = 0; i < polys.length; i++)
+ {
+ PolyBase poly = polys[i];
+ if (addLayer(poly, topLevel ? ai : null, transToTop, linesInNonMahnattan, removeGeometry)) hasNonmanhattan = true;
+ }
+ }
+ return hasNonmanhattan;
+ }
+
+ /**
+ * Method to add geometry to the R-Tree.
+ * @param poly the polygon to add (only rectangles are added, so the bounds is used).
+ * @param trans a transformation matrix to apply to the polygon.
+ * @param netID the global network ID of the geometry.
+ * (converted to non-pseudo and stored). False to ignore pseudo-layers.
+ * @param lockTree true to lock the R-Tree before accessing it (when doing parallel routing).
+ * @return true if the geometry is nonmanhattan (and may cause problems).
+ */
+ private boolean addLayer(PolyBase poly, Geometric topGeom, FixpTransform trans, List<EPoint> linesInNonMahnattan, Map<Layer,List<Rectangle2D>> removeGeometry)
+ {
+ boolean isNonmanhattan = false;
+ Layer layer = poly.getLayer();
+
+ // save any removal geometry
+ Layer removeLay = removeLayers.get(layer);
+ if (removeLay != null)
+ {
+ List<Rectangle2D> geomsToRemove = removeGeometry.get(layer);
+ if (geomsToRemove == null) removeGeometry.put(layer, geomsToRemove = new ArrayList<Rectangle2D>());
+ poly.transform(trans);
+ Rectangle2D bounds = poly.getBox();
+ if (bounds == null) return true;
+ geomsToRemove.add(bounds);
+ return false;
+ }
+
+ for(ConnectingLayer cl : allConnectingLayers)
+ {
+ if (cl.layers.contains(layer))
+ {
+ // ignore polygons that aren't solid filled areas
+ if (poly.getStyle() != Poly.Type.FILLED) return false;
+ poly.transform(trans);
+ Rectangle2D bounds = poly.getBox();
+ if (bounds == null)
+ {
+ addPolygon(poly, cl, topGeom);
+ Point[] points = poly.getPoints();
+ for (int i=1; i<points.length; i++)
+ {
+ if (points[i-1].getX() != points[i].getX() && points[i-1].getY() != points[i].getY())
+ {
+ isNonmanhattan = true;
+ linesInNonMahnattan.add(EPoint.fromLambda(points[i-1].getX(), points[i-1].getY()));
+ linesInNonMahnattan.add(EPoint.fromLambda(points[i].getX(), points[i].getY()));
+ }
+ }
+ } else
+ {
+ addRectangle(bounds, cl, topGeom);
+ }
+ }
+ }
+
+ for(ConnectingVia cv : allConnectingVias)
+ {
+ if (layer == cv.viaLayer)
+ {
+ Rectangle2D bounds = poly.getBounds2D();
+ DBMath.transformRect(bounds, trans);
+ addVia(ERectangle.fromLambda(bounds), cv);
+ }
+ }
+ return isNonmanhattan;
+ }
+
+ /**
+ * Method to add a rectangle to the metal R-Tree.
+ * @param bounds the rectangle to add.
+ * @param layer the metal layer on which to add the rectangle.
+ * @param netID the global network ID of the geometry.
+ * @param lockTree true to lock the R-Tree before accessing it (when doing parallel routing).
+ */
+ private QCBound addRectangle(Rectangle2D bounds, ConnectingLayer cl, Geometric topGeom)
+ {
+ QCBound qcb = null;
+ GeometryTree bTree = cl.tree;
+
+ // avoid duplication
+ List<QCBound> removeThese = null;
+ for (Iterator<QCBound> sea = bTree.search(bounds); sea.hasNext(); )
+ {
+ QCBound sBound = sea.next();
+ if (sBound instanceof QCPoly) continue;
+
+ // if an existing bound is bigger than new one, ignore this
+ ERectangle r = sBound.getBounds();
+ if (r.getMinX() <= bounds.getMinX() &&
+ r.getMaxX() >= bounds.getMaxX() &&
+ r.getMinY() <= bounds.getMinY() &&
+ r.getMaxY() >= bounds.getMaxY()) return null;
+
+ // if new one is bigger than an existing bound, remove existing one
+ if (bounds.getMinX() <= r.getMinX() &&
+ bounds.getMaxX() >= r.getMaxX() &&
+ bounds.getMinY() <= r.getMinY() &&
+ bounds.getMaxY() >= r.getMaxY())
+ {
+ if (removeThese == null) removeThese = new ArrayList<QCBound>();
+ removeThese.add(sBound);
+ }
+ }
+
+ if (removeThese != null)
+ {
+ RTNode<QCBound> rootFixp = bTree.getRoot();
+ for(QCBound s : removeThese)
+ {
+ RTNode<QCBound> newRootFixp = RTNode.unLinkGeom(null, rootFixp, s);
+ if (newRootFixp != rootFixp) bTree.setRoot(rootFixp = newRootFixp);
+ }
+ }
+
+ qcb = new QCBound(ERectangle.fromLambda(bounds), null, topGeom);
+ RTNode<QCBound> rootFixp = bTree.getRoot();
+ if (rootFixp == null)
+ {
+ rootFixp = RTNode.makeTopLevel();
+ bTree.setRoot(rootFixp);
+ }
+ RTNode<QCBound> newRootFixp = RTNode.linkGeom(null, rootFixp, qcb);
+ if (newRootFixp != rootFixp) bTree.setRoot(newRootFixp);
+ return qcb;
+ }
+
+ /**
+ * Method to add a polygon to the metal R-Tree.
+ * @param poly the polygon to add.
+ * @param layer the metal layer on which to add the rectangle.
+ * @param netID the global network ID of the geometry.
+ * @param lockTree true to lock the R-Tree before accessing it (when doing parallel routing).
+ */
+ private void addPolygon(PolyBase poly, ConnectingLayer cl, Geometric topGeom)
+ {
+ GeometryTree bTree = cl.tree;
+ QCBound qcb = new QCPoly(ERectangle.fromLambda(poly.getBounds2D()), null, poly, topGeom);
+ RTNode<QCBound> rootFixp = bTree.getRoot();
+ if (rootFixp == null)
+ {
+ rootFixp = RTNode.makeTopLevel();
+ bTree.setRoot(rootFixp);
+ }
+ RTNode<QCBound> newRootFixp = RTNode.linkGeom(null, rootFixp, qcb);
+ if (newRootFixp != rootFixp) bTree.setRoot(newRootFixp);
+ }
+
+ /**
+ * Method to add a point to the via R-Tree.
+ * @param loc the point to add.
+ * @param layer the via layer on which to add the point.
+ * @param netID the global network ID of the geometry.
+ * @param lockTree true to lock the R-Tree before accessing it (when doing parallel routing).
+ */
+ private void addVia(ERectangle rect, ConnectingVia cv)
+ {
+ GeometryTree bTree = cv.tree;
+
+ // remove duplicate vias and favor colored ones
+ for(Iterator<QCBound> it = bTree.search(rect); it.hasNext(); )
+ {
+ QCBound qcb = it.next();
+ if (qcb.getBounds().getCenterX() == rect.getCenterX() && qcb.getBounds().getCenterY() == rect.getCenterY())
+ {
+ return;
+ }
+ }
+
+ QCBound qcb = new QCVia(rect, null);
+ RTNode<QCBound> rootFixp = bTree.getRoot();
+ if (rootFixp == null)
+ {
+ rootFixp = RTNode.makeTopLevel();
+ bTree.setRoot(rootFixp);
+ }
+ RTNode<QCBound> newRootFixp = RTNode.linkGeom(null, rootFixp, qcb);
+ if (newRootFixp != rootFixp) bTree.setRoot(newRootFixp);
+ }
+
+ /***************************** METHODS TO TRAVERSE THE R-TREE *****************************/
+
+ Map<Integer,List<MutableInteger>> netIDsByValue = new HashMap<Integer,List<MutableInteger>>();
+
+ private void extractRTrees()
+ {
+ int netID = 1;
+ for(ConnectingLayer cl : allConnectingLayers)
+ {
+ for (Iterator<QCBound> sea = cl.tree.search(cell.getBounds()); sea.hasNext();)
+ {
+ QCBound sBound = sea.next();
+ if (sBound.getNetID() != null) continue;
+ MutableInteger mi = new MutableInteger(netID++);
+ sBound.setNetID(mi);
+ growArea(sBound, cl, sBound.getNetID());
+ }
+ }
+ }
+
+ private void growArea(QCBound sBound, ConnectingLayer cl, MutableInteger idNumber)
+ {
+ GeometryTree metalTree = cl.tree;
+ Rectangle2D bound = sBound.getBounds();
+ for (Iterator<QCBound> sea = metalTree.search(bound); sea.hasNext(); )
+ {
+ QCBound subBound = sea.next();
+ if (subBound == sBound) continue;
+ if (sBound instanceof QCPoly || subBound instanceof QCPoly)
+ {
+ // make sure they really intersect
+ if (!doesIntersect(sBound, subBound)) continue;
+ }
+ if (subBound.getNetID() == null)
+ {
+ subBound.setNetID(idNumber);
+ growArea(subBound, cl, idNumber);
+ continue;
+ }
+ subBound.updateNetID(idNumber, netIDsByValue);
+ }
+
+ // find vias that connect this to a different layer
+ for(ConnectingVia cv : allConnectingVias)
+ {
+ if (cl != cv.layer1 && cl != cv.layer2) continue;
+ ConnectingLayer otherLayer = (cl == cv.layer1 ? cv.layer2 : cv.layer1);
+ GeometryTree viaTree = cv.tree;
+ if (!viaTree.isEmpty())
+ {
+ for (Iterator<QCBound> sea = viaTree.search(bound); sea.hasNext(); )
+ {
+ QCVia subBound = (QCVia)sea.next();
+ if (sBound instanceof QCPoly)
+ {
+ // make sure they really intersect
+ if (!doesIntersect(sBound, subBound)) continue;
+ }
+ if (subBound.getNetID() == null)
+ {
+ subBound.setNetID(idNumber);
+ growPoint(subBound.getBounds().getCenterX(), subBound.getBounds().getCenterY(), otherLayer, idNumber);
+ continue;
+ }
+ subBound.updateNetID(idNumber, netIDsByValue);
+ }
+ }
+ }
+ }
+
+ /**
+ * Method to accumulate a list of blockage rectangles that are at a given coordinate.
+ * @param x the X coordinate.
+ * @param y the Y coordinate.
+ * @param layerNum the metal layer number (0-based).
+ * @param idNumber the network number being propagated.
+ * @return true if this network number is already at the coordinate.
+ */
+ private boolean growPoint(double x, double y, ConnectingLayer layer, MutableInteger idNumber)
+ {
+ Rectangle2D search = new Rectangle2D.Double(x, y, 0, 0);
+ GeometryTree bTree = layer.tree;
+ if (bTree.isEmpty()) return false;
+ boolean foundNet = false;
+ for (Iterator<QCBound> sea = bTree.search(search); sea.hasNext();)
+ {
+ QCBound subBound = sea.next();
+ if (!subBound.containsPoint(x, y)) continue;
+ if (subBound.getNetID() == null)
+ {
+ subBound.setNetID(idNumber);
+ growArea(subBound, layer, idNumber);
+ continue;
+ } else
+ {
+ if (!subBound.isSameBasicNet(idNumber))
+ subBound.updateNetID(idNumber, netIDsByValue);
+ }
+ }
+ return foundNet;
+ }
+
+ private boolean doesIntersect(QCBound bound1, QCBound bound2)
+ {
+ // first see if the polygons are Manhattan
+ if (!bound1.isManhattan() || !bound2.isManhattan()) return true;
+
+ EPoint[] points1;
+ if (bound1 instanceof QCPoly)
+ {
+ QCPoly p = (QCPoly)bound1;
+ Point[] po = p.poly.getPoints();
+ points1 = new EPoint[po.length];
+ for(int i=0; i<po.length; i++) points1[i] = EPoint.fromLambda(po[i].getX(), po[i].getY());
+ } else
+ {
+ points1 = new EPoint[5];
+ ERectangle r = bound1.getBounds();
+ points1[0] = EPoint.fromLambda(r.getMinX(), r.getMinY());
+ points1[1] = EPoint.fromLambda(r.getMinX(), r.getMaxY());
+ points1[2] = EPoint.fromLambda(r.getMaxX(), r.getMaxY());
+ points1[3] = EPoint.fromLambda(r.getMaxX(), r.getMinY());
+ points1[4] = EPoint.fromLambda(r.getMinX(), r.getMinY());
+ }
+
+ EPoint[] points2;
+ if (bound2 instanceof QCPoly)
+ {
+ QCPoly p = (QCPoly)bound2;
+ Point[] po = p.poly.getPoints();
+ points2 = new EPoint[po.length];
+ for(int i=0; i<po.length; i++) points2[i] = EPoint.fromLambda(po[i].getX(), po[i].getY());
+ } else
+ {
+ points2 = new EPoint[5];
+ ERectangle r = bound2.getBounds();
+ points2[0] = EPoint.fromLambda(r.getMinX(), r.getMinY());
+ points2[1] = EPoint.fromLambda(r.getMinX(), r.getMaxY());
+ points2[2] = EPoint.fromLambda(r.getMaxX(), r.getMaxY());
+ points2[3] = EPoint.fromLambda(r.getMaxX(), r.getMinY());
+ points2[4] = EPoint.fromLambda(r.getMinX(), r.getMinY());
+ }
+
+ // now look for line intersections
+ for(int i=1; i<points1.length; i++)
+ {
+ EPoint p1a = points1[i-1];
+ EPoint p1b = points1[i];
+ if (p1a.getX() == p1b.getX() && p1a.getY() == p1b.getY()) continue;
+ double l1X = Math.min(p1a.getX(), p1b.getX());
+ double h1X = Math.max(p1a.getX(), p1b.getX());
+ double l1Y = Math.min(p1a.getY(), p1b.getY());
+ double h1Y = Math.max(p1a.getY(), p1b.getY());
+ for(int j=1; j<points2.length; j++)
+ {
+ EPoint p2a = points2[j-1];
+ EPoint p2b = points2[j];
+ if (p2a.getX() == p2b.getX() && p2a.getY() == p2b.getY()) continue;
+ double l2X = Math.min(p2a.getX(), p2b.getX());
+ double h2X = Math.max(p2a.getX(), p2b.getX());
+ double l2Y = Math.min(p2a.getY(), p2b.getY());
+ double h2Y = Math.max(p2a.getY(), p2b.getY());
+
+ if (l1X == h1X)
+ {
+ // line 1 is vertical
+ if (l2X == h2X)
+ {
+ // both lines are vertical
+ if (l1X != l2X) continue;
+ if (h1Y > l2Y && h2Y > l1Y) return true;
+ continue;
+ }
+
+ // line one vertical, line two horizontal
+ if (l1X > l2X && l1X < h2X && l2Y > l1Y && l2Y < h1Y) return true;
+ continue;
+ } else
+ {
+ // line 1 is horizontal
+ if (l2Y == h2Y)
+ {
+ // both lines are horizontal
+ if (l1Y != l2Y) continue;
+ if (h1X > l2X && h2X > l1X) return true;
+ continue;
+ }
+
+ // line one horizontal, line two vertical
+ if (l1Y > l2Y && l1Y < h2Y && l2X > l1X && l2X < h1X) return true;
+ continue;
+ }
+ }
+ }
+
+ // no intersection. Check for complete surround
+ Poly p1 = new Poly(points1);
+ if (p1.contains(points2[0])) return true;
+
+ Poly p2 = new Poly(points2);
+ if (p2.contains(points1[0])) return true;
+
+ // they do not intersect
+ return false;
+ }
+
+ /***************************** METHODS TO DISPLAY THE R-TREE *****************************/
+
+ /**
+ * Method to show blockages in a routing area.
+ * @param nr the NeededRoute to view.
+ */
+ private void showGeometryInArea()
+ {
+ EditWindow wnd = EditWindow.getCurrent();
+ Cell cell = wnd.getCell();
+ Highlighter h = wnd.getRulerHighlighter();
+ h.clear();
+ Map<Integer,Color> netColors = new HashMap<Integer,Color>();
+ MutableInteger colorAssigned = new MutableInteger(0);
+ double highestX = Double.MIN_VALUE, highestY = Double.MIN_VALUE;
+
+ // show geometry in area
+ Rectangle2D limit = cell.getBounds();
+ Map<Layer,List<QCBound>> allAssigned = new HashMap<Layer,List<QCBound>>();
+ for(ConnectingLayer cl : allConnectingLayers)
+ {
+ Layer layer = cl.primaryLayer;
+ List<QCBound> assigned = new ArrayList<QCBound>();
+ allAssigned.put(layer, assigned);
+ for (Iterator<QCBound> sea = cl.tree.search(limit); sea.hasNext();)
+ {
+ QCBound sBound = sea.next();
+ if (sBound.getNetID() != null && sBound.getNetID().intValue() != 0) assigned.add(sBound); else
+ {
+ ERectangle drawn = showGeometryPiece(sBound, limit, layer, netColors, colorAssigned);
+ if (drawn != null)
+ {
+ if (drawn.getMaxX() > highestX) highestX = drawn.getMaxX();
+ if (drawn.getMaxY() > highestY) highestY = drawn.getMaxY();
+ }
+ }
+ }
+ }
+ for(ConnectingLayer cl : allConnectingLayers)
+ {
+ Layer layer = cl.primaryLayer;
+ List<QCBound> assigned = allAssigned.get(layer);
+ for(QCBound sBound : assigned)
+ {
+ ERectangle drawn = showGeometryPiece(sBound, limit, layer, netColors, colorAssigned);
+ if (drawn != null)
+ {
+ if (drawn.getMaxX() > highestX) highestX = drawn.getMaxX();
+ if (drawn.getMaxY() > highestY) highestY = drawn.getMaxY();
+ }
+ }
+ }
+
+ // show key
+ double pos = highestY - 2;
+ for(Integer netIDI : netColors.keySet())
+ {
+ showBlockageRect(cell, new Rectangle2D.Double(highestX+1, pos, 4, 2), h, netColors.get(netIDI));
+ String netName = "Net " + netIDI.intValue();
+ h.addMessage(cell, netName, EPoint.fromLambda(highestX+6, pos+1));
+ pos -= 3;
+ }
+ h.finished();
+ EditWindow.repaintAllContents();
+ }
+
+ private static Color[] allColors = new Color[] {
+ new Color(65535>>8, 16385>>8, 16385>>8), // Red
+ new Color(0>>8, 39321>>8, 0>>8), // Green
+ new Color(0>>8, 0>>8, 65535>>8), // Blue
+ new Color(39321>>8, 0>>8, 31457>>8), // Purple
+ new Color(65535>>8, 32768>>8, 32768>>8), // Salmon
+ new Color(0>>8, 65535>>8, 0>>8), // Lime
+ new Color(16385>>8, 65535>>8, 65535>>8), // Turquoise
+ new Color(65535>>8, 32768>>8, 58981>>8), // Light purple
+ new Color(39321>>8, 26208>>8, 0>>8), // Brown
+ new Color(52428>>8, 34958>>8, 0>>8), // Light brown
+ new Color(65535>>8, 32764>>8, 16385>>8), // Orange
+ new Color(0>>8, 52428>>8, 26586>>8), // Teal
+ new Color(0>>8, 0>>8, 39321>>8), // Dark blue
+ new Color(65535>>8, 49151>>8, 55704>>8)}; // Pink
+
+ private ERectangle showGeometryPiece(QCBound sBound, Rectangle2D limit, Layer lay, Map<Integer,Color> netColors, MutableInteger colorAssigned)
+ {
+ Integer netIDI;
+ MutableInteger mi = sBound.getNetID();
+ if (mi == null) netIDI = Integer.valueOf(0); else
+ netIDI = Integer.valueOf(mi.intValue());
+ Color color = Color.BLACK;
+ if (netIDI.intValue() != 0)
+ {
+ color = netColors.get(netIDI);
+ if (color == null)
+ {
+ netColors.put(netIDI, color = allColors[colorAssigned.intValue() % allColors.length]);
+ colorAssigned.increment();
+ }
+ }
+ ERectangle draw = sBound.getBounds();
+ EditWindow wnd = EditWindow.getCurrent();
+ Cell cell = wnd.getCell();
+ Highlighter h = wnd.getRulerHighlighter();
+ if (sBound instanceof QCPoly)
+ {
+ QCPoly pol = (QCPoly)sBound;
+ PolyBase pb = pol.getPoly();
+ Point[] points = pb.getPoints();
+ for(int i=0; i<points.length; i++)
+ {
+ int lastI = (i == 0 ? points.length-1 : i-1);
+ h.addLine(points[lastI], points[i], cell, true, color, false);
+ }
+ } else
+ {
+ double lX = draw.getMinX();
+ double hX = draw.getMaxX();
+ double lY = draw.getMinY();
+ double hY = draw.getMaxY();
+ if (lX < limit.getMinX()) { lX = limit.getMinX(); draw = null; }
+ if (hX > limit.getMaxX()) { hX = limit.getMaxX(); draw = null; }
+ if (lY < limit.getMinY()) { lY = limit.getMinY(); draw = null; }
+ if (hY > limit.getMaxY()) { hY = limit.getMaxY(); draw = null; }
+ if (draw == null) draw = ERectangle.fromLambda(lX, lY, hX-lX, hY-lY);
+ showBlockageRect(cell, draw, h, color);
+ }
+ return draw;
+ }
+
+ /**
+ * Method to draw a thick rectangular outline.
+ * @param cell the Cell in which to draw the outline.
+ * @param bounds the rectangle to draw.
+ * @param h the Highlighter to use.
+ * @param col the Color to draw it.
+ */
+ private void showBlockageRect(Cell cell, Rectangle2D bounds, Highlighter h, Color col)
+ {
+// Poly poly = new Poly(bounds);
+// poly.setStyle(Poly.Type.FILLED);
+// h.addPoly(poly, cell, col);
+
+ Point2D p1 = new Point2D.Double(bounds.getMinX(), bounds.getMinY());
+ Point2D p2 = new Point2D.Double(bounds.getMinX(), bounds.getMaxY());
+ Point2D p3 = new Point2D.Double(bounds.getMaxX(), bounds.getMaxY());
+ Point2D p4 = new Point2D.Double(bounds.getMaxX(), bounds.getMinY());
+ h.addLine(p1, p2, cell, true, col, false);
+ h.addLine(p2, p3, cell, true, col, false);
+ h.addLine(p3, p4, cell, true, col, false);
+ h.addLine(p4, p1, cell, true, col, false);
+
+ h.addLine(p1, p3, cell, true, col, false);
+ h.addLine(p2, p4, cell, true, col, false);
+ }
+
+ /***************************** INITIALIZATION *****************************/
+
+ /**
+ * Method to initialize technology information, including design rules.
+ * @return true on error.
+ */
+ private boolean initializeDesignRules()
+ {
+ Technology tech = cell.getTechnology();
+ allConnectingLayers = new ArrayList<ConnectingLayer>();
+ allConnectingVias = new ArrayList<ConnectingVia>();
+
+ // find the metal layers
+ for(Iterator<Layer> it = tech.getLayers(); it.hasNext(); )
+ {
+ Layer lay = it.next();
+ if (!lay.getFunction().isMetal()) continue;
+ if ((lay.getFunctionExtras()&Layer.Function.CUTLAYER) != 0) continue;
+ int metNum = lay.getFunction().getLevel() - 1;
+ boolean found = false;
+ for(ConnectingLayer cl : allConnectingLayers)
+ {
+ for(Layer otherLayer : cl.layers)
+ {
+ if (otherLayer.getFunction().isMetal() && otherLayer.getFunction().getLevel()-1 == metNum)
+ {
+ cl.layers.add(lay);
+ found = true;
+ break;
+ }
+ }
+ if (found) break;
+ }
+ if (!found)
+ {
+ ConnectingLayer cl = new ConnectingLayer();
+ cl.layers.add(lay);
+ allConnectingLayers.add(cl);
+ }
+ }
+ for(ConnectingLayer cl : allConnectingLayers)
+ {
+ for(Layer lay : cl.layers)
+ {
+ int colorNum = lay.getFunction().getMaskColor();
+ if (colorNum == 0) cl.primaryLayer = lay;
+ }
+ if (cl.primaryLayer == null) cl.primaryLayer = cl.layers.get(0);
+ }
+
+ // find the poly layers
+ for(Iterator<Layer> it = tech.getLayers(); it.hasNext(); )
+ {
+ Layer lay = it.next();
+ if (!lay.getFunction().isPoly()) continue;
+ if ((lay.getFunctionExtras()&Layer.Function.CUTLAYER) != 0) continue;
+ ConnectingLayer cl = new ConnectingLayer();
+ cl.layers.add(lay);
+ cl.primaryLayer = lay;
+ allConnectingLayers.add(cl);
+ }
+
+ // find all arcs related to these layers
+ for(ConnectingLayer cl : allConnectingLayers)
+ {
+ for(Layer lay : cl.layers)
+ {
+ for(Iterator<ArcProto> it = tech.getArcs(); it.hasNext(); )
+ {
+ ArcProto ap = it.next();
+ ArcLayer[] arcLayers = ap.getArcLayers();
+ for(int i=0; i<arcLayers.length; i++)
+ {
+ ArcLayer al = arcLayers[i];
+ if (al.getLayer() == lay)
+ {
+ cl.arcs.add(ap);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // now gather the via information
+ for (Iterator<PrimitiveNode> it = tech.getNodes(); it.hasNext();)
+ {
+ PrimitiveNode np = it.next();
+ if (!np.getFunction().isContact()) continue;
+
+ // this is a contact
+ NodeLayer[] nodeLayers = np.getNodeLayers();
+ Layer viaLayer = null;
+ for(int i=0; i<nodeLayers.length; i++)
+ {
+ NodeLayer nl = nodeLayers[i];
+ if (!nl.getLayer().getFunction().isContact()) continue;
+ viaLayer = nl.getLayer();
+ break;
+ }
+ if (viaLayer == null)
+ {
+ System.out.println("WARNING: Contact " + np.describe(false) + " has no via layer in it");
+ continue;
+ }
+
+ ConnectingVia thisCV = null;
+ for(ConnectingVia cv : allConnectingVias)
+ {
+ if (cv.viaLayer == viaLayer) { thisCV = cv; break; }
+ }
+ if (thisCV == null)
+ {
+ thisCV = new ConnectingVia();
+ thisCV.viaLayer = viaLayer;
+ allConnectingVias.add(thisCV);
+ }
+
+ // find connecting arcs
+ ArcProto[] conns = np.getPort(0).getConnections();
+ List<ArcProto> validArcs = new ArrayList<ArcProto>();
+ for(int i=0; i<conns.length; i++)
+ {
+ ArcProto ap = conns[i];
+ if (ap.getTechnology() != tech) continue;
+ validArcs.add(ap);
+ }
+ if (validArcs.size() != 2) System.out.println("WARNING: Node "+np.describe(false)+" connects to " + validArcs.size() + " arcs (should be 2)"); else
+ {
+ ConnectingLayer lay1 = null, lay2 = null;
+ for(ArcProto ap : validArcs)
+ {
+ for(ConnectingLayer cl : allConnectingLayers)
+ {
+ if (cl.arcs.contains(ap))
+ {
+ if (lay1 == null) lay1 = cl; else
+ lay2 = cl;
+ break;
+ }
+ }
+ }
+ if (lay1 == null || lay2 == null)
+ {
+ System.out.println("WARNING: Could not find layers for arcs " + validArcs.get(0).describe() + " and " + validArcs.get(1).describe());
+ continue;
+ }
+ if (thisCV.layer1 != null)
+ {
+ // validate the layers
+ if ((thisCV.layer1 != lay1 || thisCV.layer2 != lay2) &&
+ (thisCV.layer1 != lay2 || thisCV.layer2 != lay1))
+ {
+ System.out.println("WARNING: Via "+thisCV.viaLayer.getName() + " connects layers " +
+ thisCV.layer1.primaryLayer.getName() + " and " + thisCV.layer2.primaryLayer.getName() + " but contact " +
+ np.describe(false) + " joins layers " + lay1.primaryLayer.getName() + " and " + lay2.primaryLayer.getName());
+ }
+ } else
+ {
+ thisCV.layer1 = lay1;
+ thisCV.layer2 = lay2;
+ }
+ }
+ }
+
+ // find the layers that cut others
+ removeLayers = new HashMap<Layer,Layer>();
+ for(Iterator<Layer> it = tech.getLayers(); it.hasNext(); )
+ {
+ Layer lay = it.next();
+ int extra = lay.getFunctionExtras();
+ if ((extra&Layer.Function.CUTLAYER) == 0) continue;
+ if (lay.getFunction().isMetal())
+ {
+ int metNum = lay.getFunction().getLevel() - 1;
+ boolean found = false;
+ for(ConnectingLayer cl : allConnectingLayers)
+ {
+ for(Layer otherLayer : cl.layers)
+ {
+ if (otherLayer.getFunction().isMetal() && otherLayer.getFunction().getLevel()-1 == metNum)
+ {
+ removeLayers.put(lay, cl.primaryLayer);
+ found = true;
+ break;
+ }
+ }
+ if (found) break;
+ }
+ } else if (lay.getFunction().isPoly())
+ {
+ int polyNum = lay.getFunction().getLevel() - 1;
+ boolean found = false;
+ for(ConnectingLayer cl : allConnectingLayers)
+ {
+ for(Layer otherLayer : cl.layers)
+ {
+ if (otherLayer.getFunction().isPoly() && otherLayer.getFunction().getLevel()-1 == polyNum)
+ {
+ removeLayers.put(lay, cl.primaryLayer);
+ found = true;
+ break;
+ }
+ }
+ if (found) break;
+ }
+ }
+ }
+
+//for(ConnectingLayer cl : allConnectingLayers)
+//{
+// System.out.print("LAYER "+cl.primaryLayer.getName()+" INCLUDES LAYERS:");
+// for(Layer lay : cl.layers) System.out.print(" "+lay.getName());
+// System.out.println();
+// System.out.print(" AND ARCS:");
+// for(ArcProto ap : cl.arcs) System.out.print(" "+ap.describe());
+// System.out.println();
+//}
+//for(ConnectingVia cv : allConnectingVias)
+// System.out.println("VIA LAYER "+cv.viaLayer.getName() + " CONNECTS LAYERS "+cv.layer1+" AND "+cv.layer2);
+//for(Layer lay : removeLayers.keySet())
+//{
+// Layer otherLay = removeLayers.get(lay);
+// System.out.println("LAYER "+lay.getName()+" CUTS LAYER "+otherLay.getName());
+//}
+
+ return false;
+ }
+
+ /***************************** STRUCTURES *****************************/
+
+ class ConnectingLayer
+ {
+ private Layer primaryLayer;
+ private List<Layer> layers;
+ private List<ArcProto> arcs;
+ private GeometryTree tree;
+
+ ConnectingLayer()
+ {
+ layers = new ArrayList<Layer>();
+ arcs = new ArrayList<ArcProto>();
+ tree = new GeometryTree(null);
+ }
+ }
+
+ class ConnectingVia
+ {
+ private Layer viaLayer;
+ private ConnectingLayer layer1, layer2;
+ private GeometryTree tree;
+
+ ConnectingVia()
+ {
+ tree = new GeometryTree(null);
+ }
+ }
+
+ private static class GeometryTree
+ {
+ private RTNode<QCBound> root;
+
+// public static GeometryTree emptyTree = new GeometryTree(null);
+
+ private GeometryTree(RTNode<QCBound> root) { this.root = root; }
+
+ private RTNode<QCBound> getRoot() { return root; }
+
+ private void setRoot(RTNode<QCBound> root) { this.root = root; }
+
+ private boolean isEmpty() { return root == null; }
+
+ private Iterator<QCBound> search(Rectangle2D searchArea)
+ {
+ if (root == null)
+ return Collections.<QCBound>emptyList().iterator();
+ Iterator<QCBound> it = new RTNode.Search<QCBound>(searchArea, root, true);
+ return it;
+ }
+ }
+
+ public static class QCNetID
+ {
+ private MutableInteger netID;
+ private Geometric topGeom;
+
+ QCNetID(MutableInteger netID, Geometric topGeom)
+ {
+ this.netID = netID;
+ this.topGeom = topGeom;
+ }
+
+ /**
+ * Method to return the global network ID for this QCNetID.
+ * Numbers > 0 are normal network IDs.
+ * Numbers <= 0 are blockages added around the ends of routes.
+ * @return the global network ID for this QCNetID.
+ */
+ public MutableInteger getNetID() { return netID; }
+
+ /**
+ * Method to return the Geometric object associated with this QCNetID.
+ * @return the Geometric object associated with this QCNetID.
+ */
+ public Geometric getTopGeom() { return topGeom; }
+
+ /**
+ * Method to set the global network ID for this QCNetID.
+ * @param n the global network ID for this QCNetID.
+ */
+ public void setNetID(MutableInteger n)
+ {
+ netID = n;
+ }
+
+ public void updateNetID(MutableInteger n, Map<Integer,List<MutableInteger>> netIDsByValue)
+ {
+ if (isSameBasicNet(n)) return;
+
+ // update all MutableIntegers with the old value
+ List<MutableInteger> oldNetIDs = netIDsByValue.get(Integer.valueOf(netID.intValue()));
+ if (oldNetIDs == null) return;
+ Integer netIDI = Integer.valueOf(n.intValue());
+ List<MutableInteger> newNetIDs = netIDsByValue.get(netIDI);
+ if (newNetIDs == null) netIDsByValue.put(netIDI, newNetIDs = new ArrayList<MutableInteger>());
+ for(MutableInteger mi : oldNetIDs)
+ {
+ mi.setValue(n.intValue());
+ newNetIDs.add(mi);
+ }
+ oldNetIDs.clear();
+ }
+
+ /**
+ * Method to tell whether this QCNetID is on a given network.
+ * Network numbers are encoded integers, where some values indicate
+ * variations on the type of network (for example, the area near routing points
+ * is marked with a "pseudo" blockage that keeps the area clear).
+ * @param otherNetID the network ID of the other net.
+ * @return true if this and the other net IDs are equivalent.
+ */
+ public boolean isSameBasicNet(MutableInteger otherNetID)
+ {
+ int netValue = 0;
+ if (netID != null) netValue = netID.intValue();
+ if (netValue == otherNetID.intValue()) return true;
+ return false;
+ }
+ }
+
+ /**
+ * Class to define an R-Tree leaf node for geometry in the data structure.
+ */
+ public static class QCBound extends QCNetID implements RTBounds
+ {
+ private ERectangle bound;
+
+ QCBound(ERectangle bound, MutableInteger netID, Geometric topGeom)
+ {
+ super(netID, topGeom);
+ this.bound = bound;
+ }
+
+ @Override
+ public ERectangle getBounds() { return bound; }
+
+ public boolean containsPoint(double x, double y)
+ {
+ return x >= bound.getMinX() && x <= bound.getMaxX() && y >= bound.getMinY() && y <= bound.getMaxY();
+ }
+
+ public boolean isManhattan() { return true; }
+
+ @Override
+ public String toString() { return "Geometry on net " + getNetID(); }
+ }
+
+ public static class QCPoly extends QCBound
+ {
+ private PolyBase poly;
+
+ QCPoly(ERectangle bound, MutableInteger netID, PolyBase poly, Geometric topGeom)
+ {
+ super(bound, netID, topGeom);
+ this.poly = poly;
+ }
+
+ public boolean containsPoint(double x, double y)
+ {
+ return poly.isInside(new Point2D.Double(x, y));
+ }
+
+ public boolean isManhattan()
+ {
+ Point[] pts = poly.getPoints();
+ for(int i=1; i<pts.length; i++)
+ {
+ if (pts[i].getX() != pts[i-1].getX() && pts[i].getY() != pts[i-1].getY()) return false;
+ }
+ return true;
+ }
+
+ public PolyBase getPoly() { return poly; }
+ }
+
+ /**
+ * Class to define an R-Tree leaf node for vias in the geometric data structure.
+ */
+ public static class QCVia extends QCBound
+ {
+ QCVia(ERectangle rect, MutableInteger netID)
+ {
+ super(rect, netID, null);
+ }
+
+ @Override
+ public String toString() { return "Via on net " + getNetID(); }
+ }
+
+}
diff --git a/com/sun/electric/tool/user/HighlightListener.java b/com/sun/electric/tool/user/HighlightListener.java
index 3f861d8..ae6ea1f 100644
--- a/com/sun/electric/tool/user/HighlightListener.java
+++ b/com/sun/electric/tool/user/HighlightListener.java
@@ -4,7 +4,7 @@
*
* File: HighlightListener.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/Highlighter.java b/com/sun/electric/tool/user/Highlighter.java
index 3945008..848d72a 100644
--- a/com/sun/electric/tool/user/Highlighter.java
+++ b/com/sun/electric/tool/user/Highlighter.java
@@ -4,7 +4,7 @@
*
* File: Highlighter.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -48,6 +48,7 @@ import com.sun.electric.technology.Layer;
import com.sun.electric.technology.PrimitiveNode;
import com.sun.electric.technology.PrimitivePort;
import com.sun.electric.technology.Technology;
+import com.sun.electric.technology.technologies.Generic;
import com.sun.electric.technology.technologies.Schematics;
import com.sun.electric.tool.Job;
import com.sun.electric.tool.routing.Router;
@@ -84,8 +85,8 @@ import javax.swing.Timer;
/**
* Class for per-window highlighting information.
*/
-public class Highlighter implements DatabaseChangeListener {
-
+public class Highlighter implements DatabaseChangeListener
+{
private static Highlighter currentHighlighter = null;
/** Screen offset for display of highlighting. */ private long highOffX, highOffY;
@@ -426,6 +427,101 @@ public class Highlighter implements DatabaseChangeListener {
}
}
+ if (nets.size() == 1)
+ {
+ // see if this cell has all nodes (and no arcs, so no connectivity information)
+ boolean hasTopology = false;
+ for(Iterator<ArcInst> it = cell.getArcs(); it.hasNext(); )
+ {
+ ArcInst ai = it.next();
+ if (ai.getProto().getTechnology() == Generic.tech()) continue;
+ hasTopology = true;
+ break;
+ }
+ if (!hasTopology)
+ {
+ Network net = nets.iterator().next();
+ NodeInst ni = net.getNodes().next();
+ String nodeName = ni.getName();
+
+ boolean flashHighlight = false;
+ HighlightConnectivity qc = new HighlightConnectivity(cell);
+ String[] topology = qc.getTopology();
+ if (topology != null)
+ {
+ boolean first = true;
+ for(int i=0; i<topology.length; i++)
+ {
+ String[] nodeNames = topology[i].split("/");
+ for(int j=0; j<nodeNames.length; j++)
+ {
+ if (nodeNames[j].charAt(0) != 'N') continue;
+ int sPos = nodeNames[j].indexOf('[');
+ String listedName = sPos < 0 ? nodeNames[j].substring(1) : nodeNames[j].substring(1, sPos);
+ if (listedName.equals(nodeName))
+ {
+ // found the node in the quick topology, show all geometry
+ if (first) clear();
+ first = false;
+ for(int k=0; k<nodeNames.length; k++)
+ {
+ String element = nodeNames[k];
+ Rectangle2D altRect = null;
+ int squarePos = element.indexOf('[');
+ if (squarePos >= 0)
+ {
+ int eSquarePos = element.indexOf(']', squarePos+1);
+ if (eSquarePos >= 0)
+ {
+ String[] coords = element.substring(squarePos+1, eSquarePos).split(";");
+ if (coords.length == 4)
+ {
+ double x = TextUtils.atof(coords[0]);
+ double y = TextUtils.atof(coords[1]);
+ double w = TextUtils.atof(coords[2]);
+ double h = TextUtils.atof(coords[3]);
+ altRect = new Rectangle2D.Double(x, y, w, h);
+ }
+ }
+ }
+ if (altRect != null)
+ {
+ addArea(altRect, cell);
+ Point2D p1 = new Point2D.Double(altRect.getMinX(), altRect.getMinY());
+ Point2D p2 = new Point2D.Double(altRect.getMinX(), altRect.getMaxY());
+ Point2D p3 = new Point2D.Double(altRect.getMaxX(), altRect.getMaxY());
+ Point2D p4 = new Point2D.Double(altRect.getMaxX(), altRect.getMinY());
+ addLine(p1, p2, cell, false, flashHighlight);
+ addLine(p2, p3, cell, false, flashHighlight);
+ addLine(p3, p4, cell, false, flashHighlight);
+ addLine(p4, p1, cell, false, flashHighlight);
+ } else
+ {
+ if (element.charAt(0) == 'N')
+ {
+ String niName = element.substring(1);
+ NodeInst niObj = cell.findNode(niName);
+ addElectricObject(niObj, flashHighlight, cell);
+ } else
+ {
+ String aiName = element.substring(1);
+ ArcInst aiObj = cell.findArc(aiName);
+ addElectricObject(aiObj, flashHighlight, cell);
+ }
+ }
+ }
+ }
+ }
+ }
+ if (!first)
+ {
+ finished();
+ return;
+ }
+ }
+ }
+ }
+
// see if there are other cells being displayed that might be able to be cross-probed
List<EditWindow> crossProbeWindows = new ArrayList<EditWindow>();
for(Iterator<WindowFrame> it = WindowFrame.getWindows(); it.hasNext(); )
@@ -440,7 +536,7 @@ public class Highlighter implements DatabaseChangeListener {
}
int showNetworkLevel;
- synchronized(this) {
+ synchronized(this) {
showNetworkLevel = this.showNetworkLevel;
}
if (showNetworkLevel == 0)
diff --git a/com/sun/electric/tool/user/KeyBindingManager.java b/com/sun/electric/tool/user/KeyBindingManager.java
index 8ec6b39..d7b871c 100644
--- a/com/sun/electric/tool/user/KeyBindingManager.java
+++ b/com/sun/electric/tool/user/KeyBindingManager.java
@@ -4,7 +4,7 @@
*
* File: KeyBindingManager.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/MessagesStream.java b/com/sun/electric/tool/user/MessagesStream.java
index 97eded1..2ebf011 100644
--- a/com/sun/electric/tool/user/MessagesStream.java
+++ b/com/sun/electric/tool/user/MessagesStream.java
@@ -4,7 +4,7 @@
*
* File: MessagesStream.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/NetworkHighlighter.java b/com/sun/electric/tool/user/NetworkHighlighter.java
index 59fd9bf..dcf780f 100644
--- a/com/sun/electric/tool/user/NetworkHighlighter.java
+++ b/com/sun/electric/tool/user/NetworkHighlighter.java
@@ -4,7 +4,7 @@
*
* File: NetworkHighlighter.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -197,7 +197,7 @@ public class NetworkHighlighter extends HierarchyEnumerator.Visitor {
/**
* Retrieves the User's preference color for NodeInst objects
- * @return
+ * @return the preference color.
*/
private static Color getNodeOrPortColor()
{
diff --git a/com/sun/electric/tool/user/Resources.java b/com/sun/electric/tool/user/Resources.java
index 683e3aa..8270b0b 100644
--- a/com/sun/electric/tool/user/Resources.java
+++ b/com/sun/electric/tool/user/Resources.java
@@ -4,7 +4,7 @@
*
* File: Resources.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/User.java b/com/sun/electric/tool/user/User.java
index bbbcfb6..6632e6d 100644
--- a/com/sun/electric/tool/user/User.java
+++ b/com/sun/electric/tool/user/User.java
@@ -4,7 +4,7 @@
*
* File: User.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/UserInterfaceMain.java b/com/sun/electric/tool/user/UserInterfaceMain.java
index 8e59d58..3a76d19 100644
--- a/com/sun/electric/tool/user/UserInterfaceMain.java
+++ b/com/sun/electric/tool/user/UserInterfaceMain.java
@@ -4,7 +4,7 @@
*
* File: UserInterfaceMain.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ViewChanges.java b/com/sun/electric/tool/user/ViewChanges.java
index 12c407e..627f71d 100644
--- a/com/sun/electric/tool/user/ViewChanges.java
+++ b/com/sun/electric/tool/user/ViewChanges.java
@@ -4,7 +4,7 @@
*
* File: ViewChanges.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/About.form b/com/sun/electric/tool/user/dialogs/About.form
index 6f595b6..39c2a15 100644
--- a/com/sun/electric/tool/user/dialogs/About.form
+++ b/com/sun/electric/tool/user/dialogs/About.form
@@ -290,7 +290,7 @@
<Component class="javax.swing.JLabel" name="jLabel8">
<Properties>
<Property name="horizontalAlignment" type="int" value="2"/>
- <Property name="text" type="java.lang.String" value="Copyright (c) 2010 Oracle and/or its affiliates"/>
+ <Property name="text" type="java.lang.String" value="Copyright (c) 2010 Static Free Software"/>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
diff --git a/com/sun/electric/tool/user/dialogs/About.java b/com/sun/electric/tool/user/dialogs/About.java
index 12b230e..c82d7e4 100644
--- a/com/sun/electric/tool/user/dialogs/About.java
+++ b/com/sun/electric/tool/user/dialogs/About.java
@@ -4,7 +4,7 @@
*
* File: About.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -460,7 +460,7 @@ public class About extends EDialog
Bottom.add(jLabel9, gridBagConstraints);
jLabel8.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
- jLabel8.setText("Copyright (c) 2010 Oracle and/or its affiliates");
+ jLabel8.setText("Copyright (c) 2016 Static Free Software");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
diff --git a/com/sun/electric/tool/user/dialogs/AnnularRing.java b/com/sun/electric/tool/user/dialogs/AnnularRing.java
index 98d5826..f06fd56 100644
--- a/com/sun/electric/tool/user/dialogs/AnnularRing.java
+++ b/com/sun/electric/tool/user/dialogs/AnnularRing.java
@@ -4,7 +4,7 @@
*
* File: AnnularRing.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/Array.java b/com/sun/electric/tool/user/dialogs/Array.java
index 75c33b9..8c1440c 100644
--- a/com/sun/electric/tool/user/dialogs/Array.java
+++ b/com/sun/electric/tool/user/dialogs/Array.java
@@ -4,7 +4,7 @@
*
* File: Array.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/ArtworkLook.java b/com/sun/electric/tool/user/dialogs/ArtworkLook.java
index d334442..5c5ec55 100644
--- a/com/sun/electric/tool/user/dialogs/ArtworkLook.java
+++ b/com/sun/electric/tool/user/dialogs/ArtworkLook.java
@@ -4,7 +4,7 @@
*
* File: ArtworkLook.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/Attributes.java b/com/sun/electric/tool/user/dialogs/Attributes.java
index d971b47..f0e2f4f 100644
--- a/com/sun/electric/tool/user/dialogs/Attributes.java
+++ b/com/sun/electric/tool/user/dialogs/Attributes.java
@@ -4,7 +4,7 @@
*
* File: Attributes.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/AttributesTable.java b/com/sun/electric/tool/user/dialogs/AttributesTable.java
index c9aacff..d2877ed 100644
--- a/com/sun/electric/tool/user/dialogs/AttributesTable.java
+++ b/com/sun/electric/tool/user/dialogs/AttributesTable.java
@@ -4,7 +4,7 @@
*
* File: AttributesTable.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/BusParameters.java b/com/sun/electric/tool/user/dialogs/BusParameters.java
index abdc048..57811e5 100644
--- a/com/sun/electric/tool/user/dialogs/BusParameters.java
+++ b/com/sun/electric/tool/user/dialogs/BusParameters.java
@@ -4,7 +4,7 @@
*
* File: BusParameters.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -163,7 +163,7 @@ public class BusParameters extends EDialog
* Added for ArchGen Plugin - BVE
* @param libParam
* @param libPopup
- * @return
+ * @return the Library with parameters.
*/
private static Library initializeLibParameters(Map<Library,String[]> libParam, JComboBox libPopup)
{
@@ -422,13 +422,12 @@ public class BusParameters extends EDialog
}
/**
- * Internal method for replacing a bus parameter in a string. Refactored to
- * permit reuse.
+ * Internal method for replacing a bus parameter in a string. Refactored to permit reuse.
* Added for ArchGen Plugin - BVE
* @param var
* @param lib
* @param libParameters
- * @return
+ * @return the new Variable string.
*/
private static String replaceVariableInString(String var, Library lib, Map<Library,String[]> libParameters) {
String varString = var;
diff --git a/com/sun/electric/tool/user/dialogs/CVSLog.java b/com/sun/electric/tool/user/dialogs/CVSLog.java
index 1503e59..5448955 100644
--- a/com/sun/electric/tool/user/dialogs/CVSLog.java
+++ b/com/sun/electric/tool/user/dialogs/CVSLog.java
@@ -4,7 +4,7 @@
*
* File: CVSLog.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/CellBrowser.java b/com/sun/electric/tool/user/dialogs/CellBrowser.java
index 5e4c5b2..d34e434 100644
--- a/com/sun/electric/tool/user/dialogs/CellBrowser.java
+++ b/com/sun/electric/tool/user/dialogs/CellBrowser.java
@@ -4,7 +4,7 @@
*
* File: CellBrowser.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/CellLists.java b/com/sun/electric/tool/user/dialogs/CellLists.java
index fc8328d..12f967b 100644
--- a/com/sun/electric/tool/user/dialogs/CellLists.java
+++ b/com/sun/electric/tool/user/dialogs/CellLists.java
@@ -4,7 +4,7 @@
*
* File: CellLists.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/CellProperties.java b/com/sun/electric/tool/user/dialogs/CellProperties.java
index 456751b..a1ae4f6 100644
--- a/com/sun/electric/tool/user/dialogs/CellProperties.java
+++ b/com/sun/electric/tool/user/dialogs/CellProperties.java
@@ -4,7 +4,7 @@
*
* File: CellProperties.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/Change.java b/com/sun/electric/tool/user/dialogs/Change.java
index 650f8a7..9616e25 100644
--- a/com/sun/electric/tool/user/dialogs/Change.java
+++ b/com/sun/electric/tool/user/dialogs/Change.java
@@ -4,7 +4,7 @@
*
* File: Change.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -1179,7 +1179,7 @@ public class Change extends EModelessDialog implements HighlightListener
return;
}
PrimitiveNode.Function fun = func != null ? func : PrimitiveNode.Function.UNKNOWN;
- BatchChanges.NodeReplacement nr = new BatchChanges.NodeReplacement(lNi, np, fun);
+ BatchChanges.NodeReplacement nr = new BatchChanges.NodeReplacement(lNi, np, fun, null);
if (lNi.checkReplacement(nr, ep, ignorePortNames, allowMissingPorts)) {
replacements.put(lNi, nr);
} else {
diff --git a/com/sun/electric/tool/user/dialogs/ChangeCellGroup.java b/com/sun/electric/tool/user/dialogs/ChangeCellGroup.java
index 618e625..f1dfb6a 100644
--- a/com/sun/electric/tool/user/dialogs/ChangeCellGroup.java
+++ b/com/sun/electric/tool/user/dialogs/ChangeCellGroup.java
@@ -4,7 +4,7 @@
*
* File: ChangeCellGroup.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/ChangeCurrentLib.java b/com/sun/electric/tool/user/dialogs/ChangeCurrentLib.java
index 788c013..50366e1 100644
--- a/com/sun/electric/tool/user/dialogs/ChangeCurrentLib.java
+++ b/com/sun/electric/tool/user/dialogs/ChangeCurrentLib.java
@@ -4,7 +4,7 @@
*
* File: ChangeCurrentLib.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/ChangeText.java b/com/sun/electric/tool/user/dialogs/ChangeText.java
index e12ffba..ca7c197 100644
--- a/com/sun/electric/tool/user/dialogs/ChangeText.java
+++ b/com/sun/electric/tool/user/dialogs/ChangeText.java
@@ -4,7 +4,7 @@
*
* File: ChangeText.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/ColorPatternPanel.java b/com/sun/electric/tool/user/dialogs/ColorPatternPanel.java
index 3e10f81..e7ed8ce 100644
--- a/com/sun/electric/tool/user/dialogs/ColorPatternPanel.java
+++ b/com/sun/electric/tool/user/dialogs/ColorPatternPanel.java
@@ -4,7 +4,7 @@
*
* File: ColorPatternPanel.java
*
-* Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+* Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/ComponentMenu.java b/com/sun/electric/tool/user/dialogs/ComponentMenu.java
index e1b8ad5..a438518 100644
--- a/com/sun/electric/tool/user/dialogs/ComponentMenu.java
+++ b/com/sun/electric/tool/user/dialogs/ComponentMenu.java
@@ -4,7 +4,7 @@
*
* File: ComponentMenuTab.java
*
- * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -258,7 +258,7 @@ public class ComponentMenu extends EDialog
techName = name;
Technology tech = Technology.findTechnology(name);
- if (compMenuPrefs.isModified(tech))
+ if (tech != null && compMenuPrefs.isModified(tech))
{
warningMessage.setForeground(Color.RED);
warningMessage.setText("NOTE: This technology's component menu has been modified in the Preferences. To restore the default menu, use the 'Reset' button.");
@@ -279,7 +279,7 @@ public class ComponentMenu extends EDialog
if (o instanceof Xml.PrimitiveNode)
{
Xml.PrimitiveNode np = (Xml.PrimitiveNode)o;
- if (np.function == null)
+ if (np.function == null && tech != null)
{
PrimitiveNode pnp = tech.findNodeProto(np.name);
if (pnp != null)
diff --git a/com/sun/electric/tool/user/dialogs/CrossLibCopy.java b/com/sun/electric/tool/user/dialogs/CrossLibCopy.java
index 90ed974..dafe55b 100644
--- a/com/sun/electric/tool/user/dialogs/CrossLibCopy.java
+++ b/com/sun/electric/tool/user/dialogs/CrossLibCopy.java
@@ -4,7 +4,7 @@
*
* File: CrossLibCopy.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/DesignRulesPanel.java b/com/sun/electric/tool/user/dialogs/DesignRulesPanel.java
index 72a9802..8537106 100644
--- a/com/sun/electric/tool/user/dialogs/DesignRulesPanel.java
+++ b/com/sun/electric/tool/user/dialogs/DesignRulesPanel.java
@@ -4,7 +4,7 @@
*
* File: DesignRulesTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/EDialog.java b/com/sun/electric/tool/user/dialogs/EDialog.java
index 99f6282..6430e56 100644
--- a/com/sun/electric/tool/user/dialogs/EDialog.java
+++ b/com/sun/electric/tool/user/dialogs/EDialog.java
@@ -4,7 +4,7 @@
*
* File: EDialog.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/EModelessDialog.java b/com/sun/electric/tool/user/dialogs/EModelessDialog.java
index eca40ec..997725b 100644
--- a/com/sun/electric/tool/user/dialogs/EModelessDialog.java
+++ b/com/sun/electric/tool/user/dialogs/EModelessDialog.java
@@ -4,7 +4,7 @@
*
* File: EModelessDialog.java
*
- * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/EditKeyBinding.java b/com/sun/electric/tool/user/dialogs/EditKeyBinding.java
index 4b4ce97..953b228 100644
--- a/com/sun/electric/tool/user/dialogs/EditKeyBinding.java
+++ b/com/sun/electric/tool/user/dialogs/EditKeyBinding.java
@@ -4,7 +4,7 @@
*
* File: EditKeyBinding.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/EditKeyBindingConflict.java b/com/sun/electric/tool/user/dialogs/EditKeyBindingConflict.java
index f49e171..1e9ca16 100644
--- a/com/sun/electric/tool/user/dialogs/EditKeyBindingConflict.java
+++ b/com/sun/electric/tool/user/dialogs/EditKeyBindingConflict.java
@@ -4,7 +4,7 @@
*
* File: EditKeyBindingConflict.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/EditKeyBindings.java b/com/sun/electric/tool/user/dialogs/EditKeyBindings.java
index fde8006..36db289 100644
--- a/com/sun/electric/tool/user/dialogs/EditKeyBindings.java
+++ b/com/sun/electric/tool/user/dialogs/EditKeyBindings.java
@@ -4,7 +4,7 @@
*
* File: EditKeyBindings.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/ExecDialog.java b/com/sun/electric/tool/user/dialogs/ExecDialog.java
index 6bc62cf..3e4777e 100644
--- a/com/sun/electric/tool/user/dialogs/ExecDialog.java
+++ b/com/sun/electric/tool/user/dialogs/ExecDialog.java
@@ -4,7 +4,7 @@
*
* File: ExecDialog.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/FastHenryArc.java b/com/sun/electric/tool/user/dialogs/FastHenryArc.java
index af7bdcd..2db00c3 100644
--- a/com/sun/electric/tool/user/dialogs/FastHenryArc.java
+++ b/com/sun/electric/tool/user/dialogs/FastHenryArc.java
@@ -4,7 +4,7 @@
*
* File: FastHenryArc.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/FillGenDialog.java b/com/sun/electric/tool/user/dialogs/FillGenDialog.java
index 5853a50..124aa58 100644
--- a/com/sun/electric/tool/user/dialogs/FillGenDialog.java
+++ b/com/sun/electric/tool/user/dialogs/FillGenDialog.java
@@ -4,7 +4,7 @@
*
* File: FillGenDialog.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/FindText.java b/com/sun/electric/tool/user/dialogs/FindText.java
index d26088b..0834f8f 100644
--- a/com/sun/electric/tool/user/dialogs/FindText.java
+++ b/com/sun/electric/tool/user/dialogs/FindText.java
@@ -4,7 +4,7 @@
*
* File: FindText.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/GetInfoArc.java b/com/sun/electric/tool/user/dialogs/GetInfoArc.java
index 6aa8fd9..7c60713 100644
--- a/com/sun/electric/tool/user/dialogs/GetInfoArc.java
+++ b/com/sun/electric/tool/user/dialogs/GetInfoArc.java
@@ -4,7 +4,7 @@
*
* File: GetInfoArc.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/GetInfoExport.java b/com/sun/electric/tool/user/dialogs/GetInfoExport.java
index 4d76d0f..c652cf5 100644
--- a/com/sun/electric/tool/user/dialogs/GetInfoExport.java
+++ b/com/sun/electric/tool/user/dialogs/GetInfoExport.java
@@ -4,7 +4,7 @@
*
* File: GetInfoExport.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/GetInfoMulti.java b/com/sun/electric/tool/user/dialogs/GetInfoMulti.java
index 6238a95..7781ef8 100644
--- a/com/sun/electric/tool/user/dialogs/GetInfoMulti.java
+++ b/com/sun/electric/tool/user/dialogs/GetInfoMulti.java
@@ -4,7 +4,7 @@
*
* File: GetInfoMulti.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/GetInfoNode.java b/com/sun/electric/tool/user/dialogs/GetInfoNode.java
index 1fc1fe6..5bf6f06 100644
--- a/com/sun/electric/tool/user/dialogs/GetInfoNode.java
+++ b/com/sun/electric/tool/user/dialogs/GetInfoNode.java
@@ -4,7 +4,7 @@
*
* File: GetInfoNode.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/GetInfoOutline.java b/com/sun/electric/tool/user/dialogs/GetInfoOutline.java
index 70c66e7..fc7a4ac 100644
--- a/com/sun/electric/tool/user/dialogs/GetInfoOutline.java
+++ b/com/sun/electric/tool/user/dialogs/GetInfoOutline.java
@@ -4,7 +4,7 @@
*
* File: GetInfoOutline.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/GetInfoText.java b/com/sun/electric/tool/user/dialogs/GetInfoText.java
index d7f6dd5..025f92d 100644
--- a/com/sun/electric/tool/user/dialogs/GetInfoText.java
+++ b/com/sun/electric/tool/user/dialogs/GetInfoText.java
@@ -4,7 +4,7 @@
*
* File: GetInfoText.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -621,8 +621,7 @@ public class GetInfoText extends EModelessDialog implements HighlightListener, D
textList.add(str);
} else
{
- str = str.trim();
- if (str.equals("")) continue;
+ if (str.trim().length() == 0) continue;
textList.add(str);
}
}
@@ -935,8 +934,7 @@ public class GetInfoText extends EModelessDialog implements HighlightListener, D
textList.add(str);
} else
{
- str = str.trim();
- if (str.equals("")) continue;
+ if (str.trim().length() == 0) continue;
textList.add(str);
}
}
diff --git a/com/sun/electric/tool/user/dialogs/LanguageScripts.java b/com/sun/electric/tool/user/dialogs/LanguageScripts.java
index 6399bd4..735ed81 100644
--- a/com/sun/electric/tool/user/dialogs/LanguageScripts.java
+++ b/com/sun/electric/tool/user/dialogs/LanguageScripts.java
@@ -5,7 +5,7 @@
* File: LanguageScripts.java
* Manage the list of Bean Shell scripts attached to the menu.
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/LayoutImage.java b/com/sun/electric/tool/user/dialogs/LayoutImage.java
index 914cc91..99282bf 100644
--- a/com/sun/electric/tool/user/dialogs/LayoutImage.java
+++ b/com/sun/electric/tool/user/dialogs/LayoutImage.java
@@ -4,7 +4,7 @@
*
* File: LayoutImage.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/LayoutText.java b/com/sun/electric/tool/user/dialogs/LayoutText.java
index 9abccd9..067bd39 100644
--- a/com/sun/electric/tool/user/dialogs/LayoutText.java
+++ b/com/sun/electric/tool/user/dialogs/LayoutText.java
@@ -4,7 +4,7 @@
*
* File: LayoutText.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/ManipulateExports.java b/com/sun/electric/tool/user/dialogs/ManipulateExports.java
index fb44e46..4c98386 100644
--- a/com/sun/electric/tool/user/dialogs/ManipulateExports.java
+++ b/com/sun/electric/tool/user/dialogs/ManipulateExports.java
@@ -4,7 +4,7 @@
*
* File: ManipulateExports.java
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/ManipulatePorts.java b/com/sun/electric/tool/user/dialogs/ManipulatePorts.java
index dd86b99..727eba1 100644
--- a/com/sun/electric/tool/user/dialogs/ManipulatePorts.java
+++ b/com/sun/electric/tool/user/dialogs/ManipulatePorts.java
@@ -4,7 +4,7 @@
*
* File: ManipulatePorts.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/ModalCommandDialog.java b/com/sun/electric/tool/user/dialogs/ModalCommandDialog.java
index a7a964c..cc13757 100644
--- a/com/sun/electric/tool/user/dialogs/ModalCommandDialog.java
+++ b/com/sun/electric/tool/user/dialogs/ModalCommandDialog.java
@@ -4,7 +4,7 @@
*
* File: ModalCommandDialog.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/MoveBy.java b/com/sun/electric/tool/user/dialogs/MoveBy.java
index b519d92..2c38ab5 100644
--- a/com/sun/electric/tool/user/dialogs/MoveBy.java
+++ b/com/sun/electric/tool/user/dialogs/MoveBy.java
@@ -4,7 +4,7 @@
*
* File: MoveBy.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/MultiFingerTransistor.java b/com/sun/electric/tool/user/dialogs/MultiFingerTransistor.java
index 364d9ec..97e3d51 100644
--- a/com/sun/electric/tool/user/dialogs/MultiFingerTransistor.java
+++ b/com/sun/electric/tool/user/dialogs/MultiFingerTransistor.java
@@ -4,7 +4,7 @@
*
* File: MultiFingerTransistor.java
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -215,7 +215,7 @@ public class MultiFingerTransistor extends EDialog
/**
* Function to look for the corresponding M1 ArcProto in the technology
* @param tech
- * @return
+ * @return the ArcProto for Metal 1.
*/
private static ArcProto getMetal1(Technology tech)
{
diff --git a/com/sun/electric/tool/user/dialogs/NewCell.java b/com/sun/electric/tool/user/dialogs/NewCell.java
index 54c1e13..7969dce 100644
--- a/com/sun/electric/tool/user/dialogs/NewCell.java
+++ b/com/sun/electric/tool/user/dialogs/NewCell.java
@@ -4,7 +4,7 @@
*
* File: NewCell.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/NewExport.java b/com/sun/electric/tool/user/dialogs/NewExport.java
index d485d55..f1d2c8d 100644
--- a/com/sun/electric/tool/user/dialogs/NewExport.java
+++ b/com/sun/electric/tool/user/dialogs/NewExport.java
@@ -4,7 +4,7 @@
*
* File: NewExport.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/OpenFile.java b/com/sun/electric/tool/user/dialogs/OpenFile.java
index 6865090..7bede40 100644
--- a/com/sun/electric/tool/user/dialogs/OpenFile.java
+++ b/com/sun/electric/tool/user/dialogs/OpenFile.java
@@ -4,7 +4,7 @@
*
* File: OpenFile.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/OptionReconcile.java b/com/sun/electric/tool/user/dialogs/OptionReconcile.java
index f5f6c30..c3e860d 100644
--- a/com/sun/electric/tool/user/dialogs/OptionReconcile.java
+++ b/com/sun/electric/tool/user/dialogs/OptionReconcile.java
@@ -4,7 +4,7 @@
*
* File: OptionReconcile.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/PreferencesFrame.java b/com/sun/electric/tool/user/dialogs/PreferencesFrame.java
index 39075d5..61d6f23 100644
--- a/com/sun/electric/tool/user/dialogs/PreferencesFrame.java
+++ b/com/sun/electric/tool/user/dialogs/PreferencesFrame.java
@@ -4,7 +4,7 @@
*
* File: PreferencesFrame.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -95,6 +95,7 @@ import com.sun.electric.tool.user.dialogs.options.WellCheckTab;
import com.sun.electric.tool.user.help.ManualViewer;
import com.sun.electric.tool.user.menus.FileMenu;
import com.sun.electric.tool.user.projectSettings.ProjSettings;
+import com.sun.electric.tool.user.tests.TestTab;
import com.sun.electric.tool.user.ui.TopLevel;
import com.sun.electric.tool.user.ui.WindowFrame;
@@ -234,17 +235,8 @@ public class PreferencesFrame extends EModelessDialog
addTreeNode(new ProjectManagementTab(this, true), generalSet);
addTreeNode(new CVSTab(this, true), generalSet);
addTreeNode(new PrintingTab(this, true), generalSet);
- if (Job.getDebug())
- {
- // Open test tab only if plugin is available and in debug mode
- try
- {
- Class<?> testTab = Class.forName("com.sun.electric.plugins.tests.TestTab");
- Constructor<?> tab = testTab.getDeclaredConstructor(new Class[]{PreferencesFrame.class, Boolean.class});
- addTreeNode((PreferencePanel)tab.newInstance(new Object[] {this, Boolean.TRUE}), generalSet);
- }
- catch (Exception ex) { /* do nothing */ };
- }
+ if (Job.getDebug())
+ addTreeNode(new TestTab(this, Boolean.TRUE), generalSet);
// the "Display" section of the Preferences
DefaultMutableTreeNode displaySet = new DefaultMutableTreeNode("Display ");
diff --git a/com/sun/electric/tool/user/dialogs/Progress.java b/com/sun/electric/tool/user/dialogs/Progress.java
index 4b6cad6..2fabd01 100644
--- a/com/sun/electric/tool/user/dialogs/Progress.java
+++ b/com/sun/electric/tool/user/dialogs/Progress.java
@@ -4,7 +4,7 @@
*
* File: Progress.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/PromptAt.java b/com/sun/electric/tool/user/dialogs/PromptAt.java
index f2394ed..a9d16bf 100644
--- a/com/sun/electric/tool/user/dialogs/PromptAt.java
+++ b/com/sun/electric/tool/user/dialogs/PromptAt.java
@@ -4,9 +4,9 @@
*
* File: PromptAt.java
* Display a prompt dialog over a specific piece of circuitry.
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/SavedViews.java b/com/sun/electric/tool/user/dialogs/SavedViews.java
index b21cfd9..1ea063a 100644
--- a/com/sun/electric/tool/user/dialogs/SavedViews.java
+++ b/com/sun/electric/tool/user/dialogs/SavedViews.java
@@ -4,7 +4,7 @@
*
* File: SavedViews.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/SeaOfGatesCell.java b/com/sun/electric/tool/user/dialogs/SeaOfGatesCell.java
index 173f417..53a403f 100644
--- a/com/sun/electric/tool/user/dialogs/SeaOfGatesCell.java
+++ b/com/sun/electric/tool/user/dialogs/SeaOfGatesCell.java
@@ -4,7 +4,7 @@
*
* File: SeaOfGatesCell.java
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -116,6 +116,12 @@ public class SeaOfGatesCell extends EDialog
theDialog = new SeaOfGatesCell(jf);
}
+ if (cell != null)
+ {
+ theDialog.jLabel1.setText("Sea-of-Gates Properties for Cell " + cell.describe(false));
+ theDialog.sogp = new SeaOfGatesCellParameters(cell);
+ }
+
// Rebuild technology list
theDialog.initializing = true;
theDialog.sogTechList.removeAllItems();
@@ -124,16 +130,9 @@ public class SeaOfGatesCell extends EDialog
Technology tech = tIt.next();
theDialog.sogTechList.addItem(tech.getTechName());
}
-
- if (cell != null)
- {
- theDialog.jLabel1.setText("Sea-of-Gates Properties for Cell " + cell.describe(false));
- theDialog.sogp = new SeaOfGatesCellParameters(cell);
- theDialog.curTech = Technology.getCurrent();
- theDialog.loadDialog();
- theDialog.pack();
- }
+ theDialog.loadDialog(cell.getTechnology());
theDialog.setVisible(true);
+ theDialog.pack();
theDialog.initializing = false;
}
@@ -359,7 +358,7 @@ public class SeaOfGatesCell extends EDialog
public void removeUpdate(DocumentEvent e) { layerOverridesChanged(); }
}
- private void loadDialog()
+ private void loadDialog(Technology tech)
{
initializing = true;
@@ -371,6 +370,7 @@ public class SeaOfGatesCell extends EDialog
sogContactUpToAvoidedLayers.setSelected(sogp.isContactAllowedUpToAvoidedLayer());
// set current technology
+ curTech = tech;
sogTechList.setSelectedItem(curTech.getTechName());
// set the routing bounds layer name
@@ -1908,7 +1908,7 @@ public class SeaOfGatesCell extends EDialog
Job.getUserInterface().showErrorMessage("These network names were not found in the current cell: " + error,
"Unknown network names");
}
- loadDialog();
+ loadDialog(curTech);
if (sogBlockageShow.isSelected()) showBlockages();
updateSOGCellData();
}
@@ -2977,12 +2977,10 @@ public class SeaOfGatesCell extends EDialog
private void sogContactDownToAvoidedLayersActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_sogContactDownToAvoidedLayersActionPerformed
{//GEN-HEADEREND:event_sogContactDownToAvoidedLayersActionPerformed
- // TODO add your handling code here:
}//GEN-LAST:event_sogContactDownToAvoidedLayersActionPerformed
private void sogContactUpToAvoidedLayersActionPerformed(java.awt.event.ActionEvent evt)//GEN-FIRST:event_sogContactUpToAvoidedLayersActionPerformed
{//GEN-HEADEREND:event_sogContactUpToAvoidedLayersActionPerformed
- // TODO add your handling code here:
}//GEN-LAST:event_sogContactUpToAvoidedLayersActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
diff --git a/com/sun/electric/tool/user/dialogs/SelectObject.java b/com/sun/electric/tool/user/dialogs/SelectObject.java
index 4259a28..338f9d0 100644
--- a/com/sun/electric/tool/user/dialogs/SelectObject.java
+++ b/com/sun/electric/tool/user/dialogs/SelectObject.java
@@ -4,7 +4,7 @@
*
* File: SelectObject.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/SetFocus.java b/com/sun/electric/tool/user/dialogs/SetFocus.java
index 3fb719c..0b64ab4 100644
--- a/com/sun/electric/tool/user/dialogs/SetFocus.java
+++ b/com/sun/electric/tool/user/dialogs/SetFocus.java
@@ -4,7 +4,7 @@
*
* File: SetFocus.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/SpecialProperties.java b/com/sun/electric/tool/user/dialogs/SpecialProperties.java
index 5bee31c..e9d1e8b 100644
--- a/com/sun/electric/tool/user/dialogs/SpecialProperties.java
+++ b/com/sun/electric/tool/user/dialogs/SpecialProperties.java
@@ -4,7 +4,7 @@
*
* File: SpecialProperties.java
* 2572968, exp 6/5/5
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/Spread.java b/com/sun/electric/tool/user/dialogs/Spread.java
index 01396e0..cbadec5 100644
--- a/com/sun/electric/tool/user/dialogs/Spread.java
+++ b/com/sun/electric/tool/user/dialogs/Spread.java
@@ -4,7 +4,7 @@
*
* File: Spread.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/TextAttributesPanel.java b/com/sun/electric/tool/user/dialogs/TextAttributesPanel.java
index 7ce5e91..23cac12 100644
--- a/com/sun/electric/tool/user/dialogs/TextAttributesPanel.java
+++ b/com/sun/electric/tool/user/dialogs/TextAttributesPanel.java
@@ -4,7 +4,7 @@
*
* File: TextAttributesPanel.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/TextInfoPanel.java b/com/sun/electric/tool/user/dialogs/TextInfoPanel.java
index 46eba4e..3ff3b1a 100644
--- a/com/sun/electric/tool/user/dialogs/TextInfoPanel.java
+++ b/com/sun/electric/tool/user/dialogs/TextInfoPanel.java
@@ -4,7 +4,7 @@
*
* File: TextInfoPanel.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/ViewControl.java b/com/sun/electric/tool/user/dialogs/ViewControl.java
index bdd50e6..a75f311 100644
--- a/com/sun/electric/tool/user/dialogs/ViewControl.java
+++ b/com/sun/electric/tool/user/dialogs/ViewControl.java
@@ -4,7 +4,7 @@
*
* File: ViewControl.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/WaveformZoom.java b/com/sun/electric/tool/user/dialogs/WaveformZoom.java
index d869007..7453b49 100644
--- a/com/sun/electric/tool/user/dialogs/WaveformZoom.java
+++ b/com/sun/electric/tool/user/dialogs/WaveformZoom.java
@@ -4,7 +4,7 @@
*
* File: WaveformZoom.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/AddedTechnologiesTab.java b/com/sun/electric/tool/user/dialogs/options/AddedTechnologiesTab.java
index ec71258..0678704 100644
--- a/com/sun/electric/tool/user/dialogs/options/AddedTechnologiesTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/AddedTechnologiesTab.java
@@ -4,7 +4,7 @@
*
* File: AddedTechnologiesTab.java
*
- * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/AntennaRulesTab.java b/com/sun/electric/tool/user/dialogs/options/AntennaRulesTab.java
index 587efbb..7cb6921 100644
--- a/com/sun/electric/tool/user/dialogs/options/AntennaRulesTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/AntennaRulesTab.java
@@ -4,7 +4,7 @@
*
* File: AntennaRulesTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/CDLTab.java b/com/sun/electric/tool/user/dialogs/options/CDLTab.java
index afb7220..8fb1034 100644
--- a/com/sun/electric/tool/user/dialogs/options/CDLTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/CDLTab.java
@@ -4,7 +4,7 @@
*
* File: CDLTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/CIFTab.java b/com/sun/electric/tool/user/dialogs/options/CIFTab.java
index c8efb55..5d4ae07 100644
--- a/com/sun/electric/tool/user/dialogs/options/CIFTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/CIFTab.java
@@ -4,7 +4,7 @@
*
* File: CIFTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/CVSTab.java b/com/sun/electric/tool/user/dialogs/options/CVSTab.java
index 4bf537a..9c3ab89 100644
--- a/com/sun/electric/tool/user/dialogs/options/CVSTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/CVSTab.java
@@ -4,7 +4,7 @@
*
* File: CVSTab.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/CellModelTab.java b/com/sun/electric/tool/user/dialogs/options/CellModelTab.java
index 75c0fa9..5eae873 100644
--- a/com/sun/electric/tool/user/dialogs/options/CellModelTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/CellModelTab.java
@@ -4,7 +4,7 @@
*
* File: CellModelFile.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/CompactionTab.java b/com/sun/electric/tool/user/dialogs/options/CompactionTab.java
index 87b06b4..2d97162 100644
--- a/com/sun/electric/tool/user/dialogs/options/CompactionTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/CompactionTab.java
@@ -4,7 +4,7 @@
*
* File: CompactionTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/ComponentMenuTab.java b/com/sun/electric/tool/user/dialogs/options/ComponentMenuTab.java
index 0fe30a6..e4ba164 100644
--- a/com/sun/electric/tool/user/dialogs/options/ComponentMenuTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/ComponentMenuTab.java
@@ -4,7 +4,7 @@
*
* File: ComponentMenuTab.java
*
- * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/CopyrightTab.java b/com/sun/electric/tool/user/dialogs/options/CopyrightTab.java
index 7237155..2f1b56c 100644
--- a/com/sun/electric/tool/user/dialogs/options/CopyrightTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/CopyrightTab.java
@@ -4,7 +4,7 @@
*
* File: CopyrightTab.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/CoverageTab.java b/com/sun/electric/tool/user/dialogs/options/CoverageTab.java
index e537ac3..0ae7028 100644
--- a/com/sun/electric/tool/user/dialogs/options/CoverageTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/CoverageTab.java
@@ -4,7 +4,7 @@
*
* File: NewArcsTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/DEFTab.form b/com/sun/electric/tool/user/dialogs/options/DEFTab.form
index 2b354c7..a038294 100644
--- a/com/sun/electric/tool/user/dialogs/options/DEFTab.form
+++ b/com/sun/electric/tool/user/dialogs/options/DEFTab.form
@@ -127,14 +127,24 @@
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
- <GridBagConstraints gridX="0" gridY="8" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="4" insetsLeft="4" insetsBottom="4" insetsRight="4" anchor="17" weightX="0.0" weightY="0.0"/>
+ <GridBagConstraints gridX="0" gridY="9" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="4" insetsLeft="4" insetsBottom="4" insetsRight="4" anchor="17" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
<Component class="javax.swing.JComboBox" name="defUnknownLayers">
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
- <GridBagConstraints gridX="1" gridY="8" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="4" insetsLeft="4" insetsBottom="4" insetsRight="4" anchor="10" weightX="0.0" weightY="0.0"/>
+ <GridBagConstraints gridX="1" gridY="9" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="4" insetsLeft="4" insetsBottom="4" insetsRight="4" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Component class="javax.swing.JCheckBox" name="defConnectAllPins">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Place and connect all pin geometry"/>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="8" gridWidth="2" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="4" insetsLeft="4" insetsBottom="4" insetsRight="4" anchor="17" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
diff --git a/com/sun/electric/tool/user/dialogs/options/DEFTab.java b/com/sun/electric/tool/user/dialogs/options/DEFTab.java
index e8d0007..53d53f5 100644
--- a/com/sun/electric/tool/user/dialogs/options/DEFTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/DEFTab.java
@@ -4,7 +4,7 @@
*
* File: DEFTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -58,6 +58,7 @@ public class DEFTab extends PreferencePanel
defMakeDummyCells.setSelected(IOTool.isDEFMakeDummyCells());
defIgnoreUngeneratedPins.setSelected(IOTool.isDEFIgnoreUngeneratedPins());
defIgnoreViasBlock.setSelected(IOTool.isDEFIgnoreViasBlock());
+ defConnectAllPins.setSelected(IOTool.isDEFPlaceAndConnectAllPins());
defUnknownLayers.addItem("Ignore");
defUnknownLayers.addItem("Convert to DRC Exclusion layer");
@@ -105,6 +106,10 @@ public class DEFTab extends PreferencePanel
int currentI = defUnknownLayers.getSelectedIndex();
if (currentI != IOTool.getDEFInUnknownLayerHandling())
IOTool.setDEFInUnknownLayerHandling(currentI);
+
+ currentValue = defConnectAllPins.isSelected();
+ if (currentValue != IOTool.isDEFPlaceAndConnectAllPins())
+ IOTool.setDEFPlaceAndConnectAllPins(currentValue);
}
/**
@@ -128,6 +133,8 @@ public class DEFTab extends PreferencePanel
IOTool.setDEFIgnoreUngeneratedPins(IOTool.isFactoryDEFIgnoreUngeneratedPins());
if (IOTool.getFactoryDEFInUnknownLayerHandling() != IOTool.getDEFInUnknownLayerHandling())
IOTool.setDEFInUnknownLayerHandling(IOTool.getFactoryDEFInUnknownLayerHandling());
+ if (IOTool.isFactoryDEFPlaceAndConnectAllPins() != IOTool.isDEFPlaceAndConnectAllPins())
+ IOTool.setDEFPlaceAndConnectAllPins(IOTool.isFactoryDEFPlaceAndConnectAllPins());
}
/** This method is called from within the constructor to
@@ -151,6 +158,7 @@ public class DEFTab extends PreferencePanel
defIgnoreViasBlock = new javax.swing.JCheckBox();
jLabel3 = new javax.swing.JLabel();
defUnknownLayers = new javax.swing.JComboBox();
+ defConnectAllPins = new javax.swing.JCheckBox();
setTitle("IO Options");
setName(""); // NOI18N
@@ -242,18 +250,28 @@ public class DEFTab extends PreferencePanel
jLabel3.setText("Unknown layers:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
- gridBagConstraints.gridy = 8;
+ gridBagConstraints.gridy = 9;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
def.add(jLabel3, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
- gridBagConstraints.gridy = 8;
+ gridBagConstraints.gridy = 9;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
def.add(defUnknownLayers, gridBagConstraints);
+ defConnectAllPins.setText("Place and connect all pin geometry");
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 8;
+ gridBagConstraints.gridwidth = 2;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
+ gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
+ gridBagConstraints.insets = new java.awt.Insets(4, 4, 4, 4);
+ def.add(defConnectAllPins, gridBagConstraints);
+
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridwidth = 2;
getContentPane().add(def, gridBagConstraints);
@@ -270,6 +288,7 @@ public class DEFTab extends PreferencePanel
// Variables declaration - do not modify//GEN-BEGIN:variables
private javax.swing.JPanel def;
+ private javax.swing.JCheckBox defConnectAllPins;
private javax.swing.JCheckBox defIgnoreLogInSpecialNets;
private javax.swing.JCheckBox defIgnorePhysInNets;
private javax.swing.JCheckBox defIgnoreUngeneratedPins;
diff --git a/com/sun/electric/tool/user/dialogs/options/DRCTab.java b/com/sun/electric/tool/user/dialogs/options/DRCTab.java
index eb42558..64384d4 100644
--- a/com/sun/electric/tool/user/dialogs/options/DRCTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/DRCTab.java
@@ -4,7 +4,7 @@
*
* File: DRCTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/DXFTab.java b/com/sun/electric/tool/user/dialogs/options/DXFTab.java
index 0b2ba13..847f794 100644
--- a/com/sun/electric/tool/user/dialogs/options/DXFTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/DXFTab.java
@@ -4,7 +4,7 @@
*
* File: DXFTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/DaisTab.java b/com/sun/electric/tool/user/dialogs/options/DaisTab.java
index 468161c..a4b3d9c 100644
--- a/com/sun/electric/tool/user/dialogs/options/DaisTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/DaisTab.java
@@ -4,7 +4,7 @@
*
* File: SkillTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/DesignRulesTab.java b/com/sun/electric/tool/user/dialogs/options/DesignRulesTab.java
index e11a625..002c6b6 100644
--- a/com/sun/electric/tool/user/dialogs/options/DesignRulesTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/DesignRulesTab.java
@@ -4,7 +4,7 @@
*
* File: DesignRulesTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/DisplayControlTab.java b/com/sun/electric/tool/user/dialogs/options/DisplayControlTab.java
index 28f2425..b0bd220 100644
--- a/com/sun/electric/tool/user/dialogs/options/DisplayControlTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/DisplayControlTab.java
@@ -4,7 +4,7 @@
*
* File: DisplayControl.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/EDIFTab.java b/com/sun/electric/tool/user/dialogs/options/EDIFTab.java
index 419862c..7d46165 100644
--- a/com/sun/electric/tool/user/dialogs/options/EDIFTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/EDIFTab.java
@@ -4,7 +4,7 @@
*
* File: EDIFTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/FastHenryTab.java b/com/sun/electric/tool/user/dialogs/options/FastHenryTab.java
index 2ffd92d..90bdd15 100644
--- a/com/sun/electric/tool/user/dialogs/options/FastHenryTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/FastHenryTab.java
@@ -4,7 +4,7 @@
*
* File: FastHenryTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/FrameTab.java b/com/sun/electric/tool/user/dialogs/options/FrameTab.java
index fd84d06..35179f2 100644
--- a/com/sun/electric/tool/user/dialogs/options/FrameTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/FrameTab.java
@@ -4,7 +4,7 @@
*
* File: FrameTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/GDSTab.form b/com/sun/electric/tool/user/dialogs/options/GDSTab.form
index 0027220..158bc6a 100644
--- a/com/sun/electric/tool/user/dialogs/options/GDSTab.form
+++ b/com/sun/electric/tool/user/dialogs/options/GDSTab.form
@@ -150,6 +150,16 @@
</Constraint>
</Constraints>
</Component>
+ <Component class="javax.swing.JCheckBox" name="gdsDumpText">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Dump readable data while reading"/>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="7" gridWidth="2" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="2" insetsLeft="4" insetsBottom="2" insetsRight="4" anchor="17" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
</SubComponents>
</Container>
<Container class="javax.swing.JPanel" name="Export">
@@ -174,7 +184,7 @@
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
- <GridBagConstraints gridX="0" gridY="0" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="2" insetsLeft="4" insetsBottom="2" insetsRight="4" anchor="17" weightX="0.0" weightY="0.0"/>
+ <GridBagConstraints gridX="0" gridY="0" gridWidth="2" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="2" insetsLeft="4" insetsBottom="2" insetsRight="4" anchor="17" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
@@ -184,7 +194,7 @@
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
- <GridBagConstraints gridX="0" gridY="1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="2" insetsLeft="4" insetsBottom="2" insetsRight="4" anchor="17" weightX="0.0" weightY="0.0"/>
+ <GridBagConstraints gridX="0" gridY="1" gridWidth="2" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="2" insetsLeft="4" insetsBottom="2" insetsRight="4" anchor="17" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
@@ -194,7 +204,7 @@
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
- <GridBagConstraints gridX="0" gridY="2" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="2" insetsLeft="4" insetsBottom="2" insetsRight="4" anchor="17" weightX="0.0" weightY="0.0"/>
+ <GridBagConstraints gridX="0" gridY="2" gridWidth="2" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="2" insetsLeft="4" insetsBottom="2" insetsRight="4" anchor="17" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
@@ -341,7 +351,7 @@
</Component>
<Component class="javax.swing.JLabel" name="jLabel5">
<Properties>
- <Property name="text" type="java.lang.String" value="Max chars in output cell name:"/>
+ <Property name="text" type="java.lang.String" value="Max chars in cell name:"/>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
@@ -356,9 +366,29 @@
</Constraint>
</Constraints>
</Component>
- <Component class="javax.swing.JLabel" name="jLabel12">
+ <Component class="javax.swing.JCheckBox" name="gdsOutputColapseNames">
<Properties>
- <Property name="text" type="java.lang.String" value="Scale by:"/>
+ <Property name="text" type="java.lang.String" value="Output collapses VDD/GND pin names"/>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="4" gridWidth="2" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="2" insetsLeft="4" insetsBottom="2" insetsRight="4" anchor="17" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Component class="javax.swing.JCheckBox" name="gdsOutputWritesCharacteristics">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Output writes export chacteristics"/>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="0" gridY="5" gridWidth="2" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="2" insetsLeft="4" insetsBottom="2" insetsRight="4" anchor="17" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Component class="javax.swing.JLabel" name="jLabel15">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Precision:"/>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
@@ -366,7 +396,7 @@
</Constraint>
</Constraints>
</Component>
- <Component class="javax.swing.JTextField" name="gdsOutputScale">
+ <Component class="javax.swing.JTextField" name="gdsOutputPrecision">
<Properties>
<Property name="columns" type="int" value="8"/>
</Properties>
@@ -376,23 +406,23 @@
</Constraint>
</Constraints>
</Component>
- <Component class="javax.swing.JCheckBox" name="gdsOutputColapseNames">
+ <Component class="javax.swing.JLabel" name="jLabel16">
<Properties>
- <Property name="text" type="java.lang.String" value="Output collapses VDD/GND pin names"/>
+ <Property name="text" type="java.lang.String" value="Units/meter:"/>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
- <GridBagConstraints gridX="0" gridY="4" gridWidth="2" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="2" insetsLeft="4" insetsBottom="2" insetsRight="4" anchor="17" weightX="0.0" weightY="0.0"/>
+ <GridBagConstraints gridX="0" gridY="8" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="2" insetsLeft="4" insetsBottom="2" insetsRight="4" anchor="17" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
- <Component class="javax.swing.JCheckBox" name="gdsOutputWritesCharacteristics">
+ <Component class="javax.swing.JTextField" name="gdsOutputUnitsPerMeter">
<Properties>
- <Property name="text" type="java.lang.String" value="Output writes export chacteristics"/>
+ <Property name="columns" type="int" value="8"/>
</Properties>
<Constraints>
<Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
- <GridBagConstraints gridX="0" gridY="5" gridWidth="2" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="2" insetsLeft="4" insetsBottom="2" insetsRight="4" anchor="17" weightX="0.0" weightY="0.0"/>
+ <GridBagConstraints gridX="1" gridY="8" gridWidth="1" gridHeight="1" fill="2" ipadX="0" ipadY="0" insetsTop="2" insetsLeft="4" insetsBottom="2" insetsRight="4" anchor="17" weightX="0.0" weightY="0.0"/>
</Constraint>
</Constraints>
</Component>
diff --git a/com/sun/electric/tool/user/dialogs/options/GDSTab.java b/com/sun/electric/tool/user/dialogs/options/GDSTab.java
index 649585d..bd7f9c7 100644
--- a/com/sun/electric/tool/user/dialogs/options/GDSTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/GDSTab.java
@@ -4,7 +4,7 @@
*
* File: GDSTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -34,6 +34,7 @@ import com.sun.electric.util.TextUtils;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
+import java.text.DecimalFormat;
import java.util.Iterator;
import javax.swing.DefaultListModel;
@@ -62,7 +63,8 @@ public class GDSTab extends PreferencePanel
private Setting gdsOutWriteExportCharacteristicsSetting = IOTool.getGDSOutWriteExportCharacteristicsSetting();
private Setting gdsCellNameLenMaxSetting = IOTool.getGDSCellNameLenMaxSetting();
private Setting gdsInputScaleSetting = IOTool.getGDSInputScaleSetting();
- private Setting gdsOutputScaleSetting = IOTool.getGDSOutputScaleSetting();
+ private Setting gdsOutputPrecisionSetting = IOTool.getGDSOutputPrecisionSetting();
+ private Setting gdsOutputUnitsPerMeterSetting = IOTool.getGDSOutputUnitsPerMeterSetting();
/** Creates new form GDSTab */
public GDSTab(PreferencesFrame parent, boolean modal)
@@ -82,6 +84,8 @@ public class GDSTab extends PreferencePanel
EDialog.makeTextFieldSelectAllOnTab(gdsCellNameLenMax);
EDialog.makeTextFieldSelectAllOnTab(gdsDefaultTextLayer);
EDialog.makeTextFieldSelectAllOnTab(gdsInputScale);
+ EDialog.makeTextFieldSelectAllOnTab(gdsOutputPrecision);
+ EDialog.makeTextFieldSelectAllOnTab(gdsOutputUnitsPerMeter);
}
/** return the JPanel to use for the user preferences. */
@@ -101,7 +105,6 @@ public class GDSTab extends PreferencePanel
{
// user preferences
gdsInputMergesBoxes.setSelected(IOTool.isGDSInMergesBoxes());
- gdsIncludesText.setSelected(IOTool.isGDSIncludesText());
gdsInputExpandsCells.setSelected(IOTool.isGDSInExpandsCells());
gdsSimplifyCells.setSelected(IOTool.isGDSInSimplifyCells());
gdsInputInstantiatesArrays.setSelected(IOTool.isGDSInInstantiatesArrays());
@@ -114,10 +117,12 @@ public class GDSTab extends PreferencePanel
gdsUnknownLayers.addItem("Convert to random layer");
gdsUnknownLayers.setSelectedIndex(IOTool.getGDSInUnknownLayerHandling());
gdsCadenceCompatibility.setSelected(IOTool.isGDSCadenceCompatibility());
+ gdsDumpText.setSelected(IOTool.isGDSDumpReadable());
gdsExportAllCells.setSelected(IOTool.isGDSWritesEntireLibrary());
gdsExportFlatDesign.setSelected(IOTool.isGDSFlatDesign());
gdsConvertNCCExportsConnectedByParentPins.setSelected(IOTool.getGDSConvertNCCExportsConnectedByParentPins());
gdsVisibility.setSelected(IOTool.isGDSOnlyInvisibleLayers());
+ gdsIncludesText.setSelected(IOTool.isGDSIncludesText());
// project preferences
gdsOutputMergesBoxes.setSelected(getBoolean(gdsOutMergesBoxesSetting));
@@ -129,7 +134,10 @@ public class GDSTab extends PreferencePanel
gdsOutputConvertsBracketsInExports.setSelected(getBoolean(gdsOutputConvertsBracketsInExportsSetting));
gdsCellNameLenMax.setText(Integer.toString(getInt(gdsCellNameLenMaxSetting)));
gdsInputScale.setText(TextUtils.formatDouble(getDouble(gdsInputScaleSetting), 0));
- gdsOutputScale.setText(TextUtils.formatDouble(getDouble(gdsOutputScaleSetting), 0));
+ gdsOutputPrecision.setText(TextUtils.formatDouble(IOTool.getGDSOutputPrecision()));
+ DecimalFormat myFormatter = new DecimalFormat("#,###");
+ String output = myFormatter.format(IOTool.getGDSOutputUnitsPerMeter());
+ gdsOutputUnitsPerMeter.setText(output);
// build the layers list
gdsLayersModel = new DefaultListModel();
@@ -211,6 +219,9 @@ public class GDSTab extends PreferencePanel
currentValue = gdsCadenceCompatibility.isSelected();
if (currentValue != IOTool.isGDSCadenceCompatibility())
IOTool.setGDSCadenceCompatibility(currentValue);
+ currentValue = gdsDumpText.isSelected();
+ if (currentValue != IOTool.isGDSDumpReadable())
+ IOTool.setGDSDumpReadable(currentValue);
currentValue = gdsExportAllCells.isSelected();
if (currentValue != IOTool.isGDSWritesEntireLibrary())
IOTool.setGDSWritesEntireLibrary(currentValue);
@@ -234,7 +245,8 @@ public class GDSTab extends PreferencePanel
setBoolean(gdsOutWriteExportCharacteristicsSetting, gdsOutputWritesCharacteristics.isSelected());
setInt(gdsCellNameLenMaxSetting, TextUtils.atoi(gdsCellNameLenMax.getText()));
setDouble(gdsInputScaleSetting, TextUtils.atof(gdsInputScale.getText()));
- setDouble(gdsOutputScaleSetting, TextUtils.atof(gdsOutputScale.getText()));
+ setDouble(gdsOutputPrecisionSetting, TextUtils.atof(gdsOutputPrecision.getText()));
+ setDouble(gdsOutputUnitsPerMeterSetting, TextUtils.atof(gdsOutputUnitsPerMeter.getText()));
}
/**
@@ -254,8 +266,6 @@ public class GDSTab extends PreferencePanel
// user preferences
if (IOTool.isFactoryGDSInMergesBoxes() != IOTool.isGDSInMergesBoxes())
IOTool.setGDSInMergesBoxes(IOTool.isFactoryGDSInMergesBoxes());
- if (IOTool.isFactoryGDSIncludesText() != IOTool.isGDSIncludesText())
- IOTool.setGDSIncludesText(IOTool.isFactoryGDSIncludesText());
if (IOTool.isFactoryGDSInExpandsCells() != IOTool.isGDSInExpandsCells())
IOTool.setGDSInExpandsCells(IOTool.isFactoryGDSInExpandsCells());
if (IOTool.isFactoryGDSInSimplifyCells() != IOTool.isGDSInSimplifyCells())
@@ -268,12 +278,18 @@ public class GDSTab extends PreferencePanel
IOTool.setGDSInUnknownLayerHandling(IOTool.getFactoryGDSInUnknownLayerHandling());
if (IOTool.isFactoryGDSCadenceCompatibility() != IOTool.isGDSCadenceCompatibility())
IOTool.setGDSCadenceCompatibility(IOTool.isFactoryGDSCadenceCompatibility());
+ if (IOTool.isFactoryGDSDumpReadable() != IOTool.isGDSDumpReadable())
+ IOTool.setGDSDumpReadable(IOTool.isFactoryGDSDumpReadable());
if (IOTool.isFactoryGDSWritesEntireLibrary() != IOTool.isGDSWritesEntireLibrary())
IOTool.setGDSWritesEntireLibrary(IOTool.isFactoryGDSWritesEntireLibrary());
if (IOTool.isFactoryGDSFlatDesign() != IOTool.isGDSFlatDesign())
IOTool.setGDSFlatDesign(IOTool.isFactoryGDSFlatDesign());
if (IOTool.getFactoryGDSConvertNCCExportsConnectedByParentPins() != IOTool.getGDSConvertNCCExportsConnectedByParentPins())
IOTool.setGDSConvertNCCExportsConnectedByParentPins(IOTool.getFactoryGDSConvertNCCExportsConnectedByParentPins());
+ if (IOTool.isFactoryGDSOnlyInvisibleLayers() != IOTool.isGDSOnlyInvisibleLayers())
+ IOTool.setGDSOnlyInvisibleLayers(IOTool.isFactoryGDSOnlyInvisibleLayers());
+ if (IOTool.isFactoryGDSIncludesText() != IOTool.isGDSIncludesText())
+ IOTool.setGDSIncludesText(IOTool.isFactoryGDSIncludesText());
// project preferences
Foundry foundry = (Foundry)foundrySelection.getSelectedItem();
@@ -297,7 +313,8 @@ public class GDSTab extends PreferencePanel
setBoolean(gdsOutWriteExportCharacteristicsSetting, ((Boolean)gdsOutWriteExportCharacteristicsSetting.getFactoryValue()).booleanValue());
setInt(gdsCellNameLenMaxSetting, ((Integer)gdsCellNameLenMaxSetting.getFactoryValue()).intValue());
setInt(gdsOutDefaultTextLayerSetting, ((Integer)gdsOutDefaultTextLayerSetting.getFactoryValue()).intValue());
- setDouble(gdsOutputScaleSetting, ((Double)gdsOutputScaleSetting.getFactoryValue()).doubleValue());
+ setDouble(gdsOutputPrecisionSetting, ((Double)gdsOutputPrecisionSetting.getFactoryValue()).doubleValue());
+ setDouble(gdsOutputUnitsPerMeterSetting, ((Double)gdsOutputUnitsPerMeterSetting.getFactoryValue()).doubleValue());
}
private void foundryChanged()
@@ -563,6 +580,7 @@ public class GDSTab extends PreferencePanel
jLabel1 = new javax.swing.JLabel();
gdsUnknownLayers = new javax.swing.JComboBox();
gdsCadenceCompatibility = new javax.swing.JCheckBox();
+ gdsDumpText = new javax.swing.JCheckBox();
Export = new javax.swing.JPanel();
gdsExportAllCells = new javax.swing.JCheckBox();
gdsExportFlatDesign = new javax.swing.JCheckBox();
@@ -582,10 +600,12 @@ public class GDSTab extends PreferencePanel
gdsOutputConvertsBracketsInExports = new javax.swing.JCheckBox();
jLabel5 = new javax.swing.JLabel();
gdsCellNameLenMax = new javax.swing.JTextField();
- jLabel12 = new javax.swing.JLabel();
- gdsOutputScale = new javax.swing.JTextField();
gdsOutputColapseNames = new javax.swing.JCheckBox();
gdsOutputWritesCharacteristics = new javax.swing.JCheckBox();
+ jLabel15 = new javax.swing.JLabel();
+ gdsOutputPrecision = new javax.swing.JTextField();
+ jLabel16 = new javax.swing.JLabel();
+ gdsOutputUnitsPerMeter = new javax.swing.JTextField();
inputPanel = new javax.swing.JPanel();
jLabel11 = new javax.swing.JLabel();
gdsInputScale = new javax.swing.JTextField();
@@ -700,6 +720,15 @@ public class GDSTab extends PreferencePanel
gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 4);
Import.add(gdsCadenceCompatibility, gridBagConstraints);
+ gdsDumpText.setText("Dump readable data while reading");
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 7;
+ gridBagConstraints.gridwidth = 2;
+ gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
+ gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 4);
+ Import.add(gdsDumpText, gridBagConstraints);
+
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
@@ -714,6 +743,7 @@ public class GDSTab extends PreferencePanel
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
+ gridBagConstraints.gridwidth = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 4);
Export.add(gdsExportAllCells, gridBagConstraints);
@@ -722,6 +752,7 @@ public class GDSTab extends PreferencePanel
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
+ gridBagConstraints.gridwidth = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 4);
Export.add(gdsExportFlatDesign, gridBagConstraints);
@@ -730,6 +761,7 @@ public class GDSTab extends PreferencePanel
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
+ gridBagConstraints.gridwidth = 2;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 4);
Export.add(gdsConvertNCCExportsConnectedByParentPins, gridBagConstraints);
@@ -849,7 +881,7 @@ public class GDSTab extends PreferencePanel
gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 4);
outputPanel.add(gdsOutputConvertsBracketsInExports, gridBagConstraints);
- jLabel5.setText("Max chars in output cell name:");
+ jLabel5.setText("Max chars in cell name:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 6;
@@ -864,40 +896,57 @@ public class GDSTab extends PreferencePanel
gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 4);
outputPanel.add(gdsCellNameLenMax, gridBagConstraints);
- jLabel12.setText("Scale by:");
+ gdsOutputColapseNames.setText("Output collapses VDD/GND pin names");
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 4;
+ gridBagConstraints.gridwidth = 2;
+ gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
+ gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 4);
+ outputPanel.add(gdsOutputColapseNames, gridBagConstraints);
+
+ gdsOutputWritesCharacteristics.setText("Output writes export chacteristics");
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 0;
+ gridBagConstraints.gridy = 5;
+ gridBagConstraints.gridwidth = 2;
+ gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
+ gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 4);
+ outputPanel.add(gdsOutputWritesCharacteristics, gridBagConstraints);
+
+ jLabel15.setText("Precision:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 7;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 4);
- outputPanel.add(jLabel12, gridBagConstraints);
+ outputPanel.add(jLabel15, gridBagConstraints);
- gdsOutputScale.setColumns(8);
+ gdsOutputPrecision.setColumns(8);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 7;
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 4);
- outputPanel.add(gdsOutputScale, gridBagConstraints);
+ outputPanel.add(gdsOutputPrecision, gridBagConstraints);
- gdsOutputColapseNames.setText("Output collapses VDD/GND pin names");
+ jLabel16.setText("Units/meter:");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
- gridBagConstraints.gridy = 4;
- gridBagConstraints.gridwidth = 2;
+ gridBagConstraints.gridy = 8;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 4);
- outputPanel.add(gdsOutputColapseNames, gridBagConstraints);
+ outputPanel.add(jLabel16, gridBagConstraints);
- gdsOutputWritesCharacteristics.setText("Output writes export chacteristics");
+ gdsOutputUnitsPerMeter.setColumns(8);
gridBagConstraints = new java.awt.GridBagConstraints();
- gridBagConstraints.gridx = 0;
- gridBagConstraints.gridy = 5;
- gridBagConstraints.gridwidth = 2;
+ gridBagConstraints.gridx = 1;
+ gridBagConstraints.gridy = 8;
+ gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
gridBagConstraints.insets = new java.awt.Insets(2, 4, 2, 4);
- outputPanel.add(gdsOutputWritesCharacteristics, gridBagConstraints);
+ outputPanel.add(gdsOutputUnitsPerMeter, gridBagConstraints);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 2;
@@ -1113,6 +1162,7 @@ public class GDSTab extends PreferencePanel
private javax.swing.JTextField gdsCellNameLenMax;
private javax.swing.JCheckBox gdsConvertNCCExportsConnectedByParentPins;
private javax.swing.JTextField gdsDefaultTextLayer;
+ private javax.swing.JCheckBox gdsDumpText;
private javax.swing.JCheckBox gdsExportAllCells;
private javax.swing.JCheckBox gdsExportFlatDesign;
private javax.swing.JLabel gdsFoundryName;
@@ -1129,7 +1179,8 @@ public class GDSTab extends PreferencePanel
private javax.swing.JCheckBox gdsOutputColapseNames;
private javax.swing.JCheckBox gdsOutputConvertsBracketsInExports;
private javax.swing.JCheckBox gdsOutputMergesBoxes;
- private javax.swing.JTextField gdsOutputScale;
+ private javax.swing.JTextField gdsOutputPrecision;
+ private javax.swing.JTextField gdsOutputUnitsPerMeter;
private javax.swing.JCheckBox gdsOutputUpperCase;
private javax.swing.JCheckBox gdsOutputWritesCharacteristics;
private javax.swing.JCheckBox gdsOutputWritesExportPins;
@@ -1144,9 +1195,10 @@ public class GDSTab extends PreferencePanel
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel10;
private javax.swing.JLabel jLabel11;
- private javax.swing.JLabel jLabel12;
private javax.swing.JLabel jLabel13;
private javax.swing.JLabel jLabel14;
+ private javax.swing.JLabel jLabel15;
+ private javax.swing.JLabel jLabel16;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
diff --git a/com/sun/electric/tool/user/dialogs/options/GateLayGenTab.java b/com/sun/electric/tool/user/dialogs/options/GateLayGenTab.java
index 45d7ef7..37559fa 100644
--- a/com/sun/electric/tool/user/dialogs/options/GateLayGenTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/GateLayGenTab.java
@@ -4,7 +4,7 @@
*
* File: GateLayGenTab.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/GeneralTab.java b/com/sun/electric/tool/user/dialogs/options/GeneralTab.java
index b51aa2c..45a8bca 100644
--- a/com/sun/electric/tool/user/dialogs/options/GeneralTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/GeneralTab.java
@@ -4,7 +4,7 @@
*
* File: GeneralTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/GerberTab.java b/com/sun/electric/tool/user/dialogs/options/GerberTab.java
index 5ab9c86..850488b 100644
--- a/com/sun/electric/tool/user/dialogs/options/GerberTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/GerberTab.java
@@ -4,7 +4,7 @@
*
* File: GerberTab.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/GridAndAlignmentTab.java b/com/sun/electric/tool/user/dialogs/options/GridAndAlignmentTab.java
index 6ea5d1f..5c6680a 100644
--- a/com/sun/electric/tool/user/dialogs/options/GridAndAlignmentTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/GridAndAlignmentTab.java
@@ -4,7 +4,7 @@
*
* File: GridAndAlignmentTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/IconTab.java b/com/sun/electric/tool/user/dialogs/options/IconTab.java
index b87dd31..a46d1f4 100644
--- a/com/sun/electric/tool/user/dialogs/options/IconTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/IconTab.java
@@ -4,7 +4,7 @@
*
* File: IconTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/LEFTab.java b/com/sun/electric/tool/user/dialogs/options/LEFTab.java
index 23127c7..48eda69 100644
--- a/com/sun/electric/tool/user/dialogs/options/LEFTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/LEFTab.java
@@ -4,7 +4,7 @@
*
* File: LEFTab.java
*
- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/LayersTab.java b/com/sun/electric/tool/user/dialogs/options/LayersTab.java
index 27b4d94..0a898d3 100644
--- a/com/sun/electric/tool/user/dialogs/options/LayersTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/LayersTab.java
@@ -4,7 +4,7 @@
*
* File: LayersTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/LibraryTab.java b/com/sun/electric/tool/user/dialogs/options/LibraryTab.java
index 8b7f0b0..2e40032 100644
--- a/com/sun/electric/tool/user/dialogs/options/LibraryTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/LibraryTab.java
@@ -4,7 +4,7 @@
*
* File: LibraryTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/LogicalEffortTab.java b/com/sun/electric/tool/user/dialogs/options/LogicalEffortTab.java
index 4d9ecc1..6a359de 100644
--- a/com/sun/electric/tool/user/dialogs/options/LogicalEffortTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/LogicalEffortTab.java
@@ -4,7 +4,7 @@
*
* File: LogicalEffortTab.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/NCCTab.java b/com/sun/electric/tool/user/dialogs/options/NCCTab.java
index 186367b..e1fcc88 100644
--- a/com/sun/electric/tool/user/dialogs/options/NCCTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/NCCTab.java
@@ -4,7 +4,7 @@
*
* File: NCCTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/NetworkTab.java b/com/sun/electric/tool/user/dialogs/options/NetworkTab.java
index 5288a8d..6f0031b 100644
--- a/com/sun/electric/tool/user/dialogs/options/NetworkTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/NetworkTab.java
@@ -4,7 +4,7 @@
*
* File: NetworkTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/NewArcsTab.java b/com/sun/electric/tool/user/dialogs/options/NewArcsTab.java
index 49e1aa4..c6ea218 100644
--- a/com/sun/electric/tool/user/dialogs/options/NewArcsTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/NewArcsTab.java
@@ -4,7 +4,7 @@
*
* File: NewArcsTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/NewNodesTab.java b/com/sun/electric/tool/user/dialogs/options/NewNodesTab.java
index 8cd0ff8..db6922d 100644
--- a/com/sun/electric/tool/user/dialogs/options/NewNodesTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/NewNodesTab.java
@@ -4,7 +4,7 @@
*
* File: NewNodesTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/ParasiticTab.java b/com/sun/electric/tool/user/dialogs/options/ParasiticTab.java
index e7fc6c3..593dc17 100644
--- a/com/sun/electric/tool/user/dialogs/options/ParasiticTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/ParasiticTab.java
@@ -4,7 +4,7 @@
*
* File: ParasiticTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/PlacementTab.java b/com/sun/electric/tool/user/dialogs/options/PlacementTab.java
index e59235d..b1a5c22 100644
--- a/com/sun/electric/tool/user/dialogs/options/PlacementTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/PlacementTab.java
@@ -4,7 +4,7 @@
*
* File: PlacementTab.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/PortsAndExportsTab.java b/com/sun/electric/tool/user/dialogs/options/PortsAndExportsTab.java
index 75b1243..92b4ba3 100644
--- a/com/sun/electric/tool/user/dialogs/options/PortsAndExportsTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/PortsAndExportsTab.java
@@ -4,7 +4,7 @@
*
* File: PortsAndExportsTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/PreferencePanel.java b/com/sun/electric/tool/user/dialogs/options/PreferencePanel.java
index a2949f6..e8c1aed 100644
--- a/com/sun/electric/tool/user/dialogs/options/PreferencePanel.java
+++ b/com/sun/electric/tool/user/dialogs/options/PreferencePanel.java
@@ -4,7 +4,7 @@
*
* File: PreferencePanel.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/PrintingTab.java b/com/sun/electric/tool/user/dialogs/options/PrintingTab.java
index 1efa901..72abe63 100644
--- a/com/sun/electric/tool/user/dialogs/options/PrintingTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/PrintingTab.java
@@ -4,7 +4,7 @@
*
* File: PrintingTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/ProjectManagementTab.java b/com/sun/electric/tool/user/dialogs/options/ProjectManagementTab.java
index 50c7a56..9b68552 100644
--- a/com/sun/electric/tool/user/dialogs/options/ProjectManagementTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/ProjectManagementTab.java
@@ -4,7 +4,7 @@
*
* File: ProjectManagementTab.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/RoutingTab.java b/com/sun/electric/tool/user/dialogs/options/RoutingTab.java
index bd9e219..f81381e 100644
--- a/com/sun/electric/tool/user/dialogs/options/RoutingTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/RoutingTab.java
@@ -4,7 +4,7 @@
*
* File: RoutingTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/SUETab.java b/com/sun/electric/tool/user/dialogs/options/SUETab.java
index de0bfdd..5ebc23c 100644
--- a/com/sun/electric/tool/user/dialogs/options/SUETab.java
+++ b/com/sun/electric/tool/user/dialogs/options/SUETab.java
@@ -4,7 +4,7 @@
*
* File: SUETab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/SVGTab.java b/com/sun/electric/tool/user/dialogs/options/SVGTab.java
index cb71ac7..a7c4183 100644
--- a/com/sun/electric/tool/user/dialogs/options/SVGTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/SVGTab.java
@@ -4,7 +4,7 @@
*
* File: SVGTab.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/ScaleTab.java b/com/sun/electric/tool/user/dialogs/options/ScaleTab.java
index 154a066..fa588d8 100644
--- a/com/sun/electric/tool/user/dialogs/options/ScaleTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/ScaleTab.java
@@ -4,7 +4,7 @@
*
* File: ScaleTab.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/SelectionTab.java b/com/sun/electric/tool/user/dialogs/options/SelectionTab.java
index f5ddcb5..496be27 100644
--- a/com/sun/electric/tool/user/dialogs/options/SelectionTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/SelectionTab.java
@@ -4,7 +4,7 @@
*
* File: SelectionTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -98,6 +98,7 @@ public class SelectionTab extends PreferencePanel
currBoolean = routingMode.isSelected();
if (currBoolean != User.isRoutingMode())
{
+ User.setRoutingMode(currBoolean);
if (currBoolean)
{
// enter routing mode
@@ -108,7 +109,6 @@ public class SelectionTab extends PreferencePanel
if (ToolBar.getCursorMode() == CursorMode.ROUTING)
ToolBar.setCursorMode(CursorMode.CLICKZOOMWIRE);
}
- User.setRoutingMode(currBoolean);
}
long delay;
diff --git a/com/sun/electric/tool/user/dialogs/options/SiliconCompilerTab.java b/com/sun/electric/tool/user/dialogs/options/SiliconCompilerTab.java
index 88671b5..6d69fb1 100644
--- a/com/sun/electric/tool/user/dialogs/options/SiliconCompilerTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/SiliconCompilerTab.java
@@ -4,7 +4,7 @@
*
* File: SiliconCompilerTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/SimulatorsTab.java b/com/sun/electric/tool/user/dialogs/options/SimulatorsTab.java
index f5a691d..bed5df1 100644
--- a/com/sun/electric/tool/user/dialogs/options/SimulatorsTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/SimulatorsTab.java
@@ -4,7 +4,7 @@
*
* File: SimulatorsTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/SkillTab.java b/com/sun/electric/tool/user/dialogs/options/SkillTab.java
index 7edce84..8f4e2ad 100644
--- a/com/sun/electric/tool/user/dialogs/options/SkillTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/SkillTab.java
@@ -4,7 +4,7 @@
*
* File: SkillTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/SmartTextTab.java b/com/sun/electric/tool/user/dialogs/options/SmartTextTab.java
index bf0697e..0ede08e 100644
--- a/com/sun/electric/tool/user/dialogs/options/SmartTextTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/SmartTextTab.java
@@ -4,7 +4,7 @@
*
* File: SmartTextTab.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/SpiceTab.java b/com/sun/electric/tool/user/dialogs/options/SpiceTab.java
index 29176e1..28ef6a7 100644
--- a/com/sun/electric/tool/user/dialogs/options/SpiceTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/SpiceTab.java
@@ -4,7 +4,7 @@
*
* File: SpiceTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/SunRouterTab.java b/com/sun/electric/tool/user/dialogs/options/SunRouterTab.java
index 8add686..560afd6 100644
--- a/com/sun/electric/tool/user/dialogs/options/SunRouterTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/SunRouterTab.java
@@ -4,7 +4,7 @@
*
* File: SunRouterTab.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/TechnologyTab.java b/com/sun/electric/tool/user/dialogs/options/TechnologyTab.java
index 187bc3c..980caff 100644
--- a/com/sun/electric/tool/user/dialogs/options/TechnologyTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/TechnologyTab.java
@@ -4,7 +4,7 @@
*
* File: TechnologyTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/TextTab.java b/com/sun/electric/tool/user/dialogs/options/TextTab.java
index 28f41f3..62791f1 100644
--- a/com/sun/electric/tool/user/dialogs/options/TextTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/TextTab.java
@@ -4,7 +4,7 @@
*
* File: TextTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/ThreeDTab.java b/com/sun/electric/tool/user/dialogs/options/ThreeDTab.java
index cdd253b..2f0adc5 100644
--- a/com/sun/electric/tool/user/dialogs/options/ThreeDTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/ThreeDTab.java
@@ -4,7 +4,7 @@
*
* File: ThreeDTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/ToolbarTab.java b/com/sun/electric/tool/user/dialogs/options/ToolbarTab.java
index f739910..1b26d55 100644
--- a/com/sun/electric/tool/user/dialogs/options/ToolbarTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/ToolbarTab.java
@@ -4,7 +4,7 @@
*
* File: ToolbarTab.java
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -24,13 +24,16 @@ package com.sun.electric.tool.user.dialogs.options;
import com.sun.electric.tool.Job;
import com.sun.electric.tool.io.FileType;
import com.sun.electric.tool.user.Resources;
+import com.sun.electric.tool.user.dialogs.LanguageScripts;
import com.sun.electric.tool.user.dialogs.OpenFile;
import com.sun.electric.tool.user.dialogs.PreferencesFrame;
import com.sun.electric.tool.user.menus.EMenu;
+import com.sun.electric.tool.user.menus.EMenuBar;
import com.sun.electric.tool.user.menus.EMenuItem;
+import com.sun.electric.tool.user.menus.ToolMenu.DynamicLanguageMenuItem;
import com.sun.electric.tool.user.ui.ToolBar;
-import com.sun.electric.tool.user.ui.TopLevel;
import com.sun.electric.tool.user.ui.ToolBar.EToolBarButton;
+import com.sun.electric.tool.user.ui.TopLevel;
import com.sun.electric.util.TextUtils;
import java.awt.Color;
@@ -342,16 +345,18 @@ public class ToolbarTab extends PreferencePanel implements TreeSelectionListener
menuEntries = new HashMap<String,EMenuItem>();
TopLevel top = TopLevel.getCurrentJFrame();
- if (top == null || top.getEMenuBar() == null) return;
+ if (top == null) return;
+ EMenuBar mb = top.getEMenuBar();
+ if (mb == null) return;
// convert menuBar to tree
- for (EMenuItem menu: top.getEMenuBar().getItems())
+ for (EMenuItem menu: mb.getItems())
{
DefaultMutableTreeNode menuNode = new DefaultMutableTreeNode(new MenuTreeNode(menu, menu.getText()));
rootNode.add(menuNode);
addMenu(menuNode, (EMenu)menu, menu.getText());
}
- EMenu hiddenMenu = top.getEMenuBar().getHiddenMenu();
+ EMenu hiddenMenu = mb.getHiddenMenu();
if (hiddenMenu != null)
{
DefaultMutableTreeNode menuNode = new DefaultMutableTreeNode(new MenuTreeNode(hiddenMenu, hiddenMenu.getText()));
@@ -382,6 +387,33 @@ public class ToolbarTab extends PreferencePanel implements TreeSelectionListener
menuEntries.put(menuItemName, menuItem);
}
}
+
+ if (parentNode.toString().equals("Tools | Languages"))
+ {
+ // add in the macros that are linked to this menu
+ for (LanguageScripts.ScriptBinding script : LanguageScripts.getScripts())
+ {
+ String scriptName = script.fileName;
+ int lastColon = scriptName.lastIndexOf(':');
+ int lastSlash = scriptName.lastIndexOf('/');
+ int lastBS = scriptName.lastIndexOf('\\');
+ int finalPos = Math.max(lastColon, Math.max(lastSlash, lastBS));
+ scriptName = scriptName.substring(finalPos + 1);
+ FileType type = FileType.JAVA;
+ if (scriptName.toLowerCase().endsWith(".bsh")) {
+ scriptName = scriptName.substring(0, scriptName.length() - 4);
+ } else if (scriptName.toLowerCase().endsWith(".py") || scriptName.toLowerCase().endsWith(".jy"))
+ {
+ scriptName = scriptName.substring(0, scriptName.length() - 3);
+ type = FileType.JYTHON;
+ }
+
+ EMenuItem menuItem = new DynamicLanguageMenuItem(scriptName, script.fileName, type);
+ DefaultMutableTreeNode menuItemNode = new DefaultMutableTreeNode(new MenuTreeNode(menuItem, scriptName));
+ parentNode.add(menuItemNode);
+ menuEntries.put(scriptName, menuItem);
+ }
+ }
}
/**
diff --git a/com/sun/electric/tool/user/dialogs/options/UnitsTab.java b/com/sun/electric/tool/user/dialogs/options/UnitsTab.java
index 3441dea..f655b68 100644
--- a/com/sun/electric/tool/user/dialogs/options/UnitsTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/UnitsTab.java
@@ -4,7 +4,7 @@
*
* File: UnitsTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/VerilogTab.java b/com/sun/electric/tool/user/dialogs/options/VerilogTab.java
index f111b4b..2cf265a 100644
--- a/com/sun/electric/tool/user/dialogs/options/VerilogTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/VerilogTab.java
@@ -4,7 +4,7 @@
*
* File: VerilogTab.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/dialogs/options/WellCheckTab.java b/com/sun/electric/tool/user/dialogs/options/WellCheckTab.java
index d056708..ec44992 100644
--- a/com/sun/electric/tool/user/dialogs/options/WellCheckTab.java
+++ b/com/sun/electric/tool/user/dialogs/options/WellCheckTab.java
@@ -4,7 +4,7 @@
*
* File: WellCheckTab.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/help/ManualViewer.java b/com/sun/electric/tool/user/help/ManualViewer.java
index bd5120b..45b2241 100644
--- a/com/sun/electric/tool/user/help/ManualViewer.java
+++ b/com/sun/electric/tool/user/help/ManualViewer.java
@@ -4,7 +4,7 @@
*
* File: ManualViewer.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/help/helphtml/chap01-03.html b/com/sun/electric/tool/user/help/helphtml/chap01-03.html
index 26d7526..54ee0e9 100644
--- a/com/sun/electric/tool/user/help/helphtml/chap01-03.html
+++ b/com/sun/electric/tool/user/help/helphtml/chap01-03.html
@@ -1,14 +1,7 @@
<!-- HEADER 1-3: Running Electric -->
-There are three ways to run Electric:
+There are two ways to run Electric:
<ul>
-<li><b>Run from the web.</b> This is the easiest way to go.
-To do this, download the Java Web Start file:<br>
- <code><font size="-1">http://java.net/projects/electric/downloads/download/electric.jnlp</font></code><br>
-This is a small file with links to the Electric.
-When run for the first time, it will download the additional files needed to run Electric.
-After that, it will start quickly because Electric is now on your machine.
-When new releases of Electric are made available, there will again be a delay as they are downloaded.</li>
<li><b>Download the JAR file from GNU.</b> This is discussed further below.</li>
<li><b>Build Electric from source code.</b> This is discussed in <A HREF="chap01-04-01.html#chap01-04-01">Section 1-4-1</A>.</li>
</ul>
@@ -28,9 +21,9 @@ other versions, try installing Java 1.6 or later from Oracle.
Running Electric varies with the different platforms.
Most systems also allow you to double-click on the JAR file.
If double-clicking doesn't work, try running it from the command-line by typing either:<BR>
- <FONT SIZE="-1"><CODE>java -jar electric-<i>version</i>.jar</CODE></FONT><BR>
+ <FONT SIZE="-1"><CODE>java -jar electric-<i>version</i>.jar [libraries]</CODE></FONT><BR>
or:<BR>
- <FONT SIZE="-1"><CODE>java -classpath electric-<i>version</i>.jar com.sun.electric.Launcher</CODE></FONT>
+ <FONT SIZE="-1"><CODE>java -classpath electric-<i>version</i>.jar com.sun.electric.Launcher [libraries]</CODE></FONT>
<P>
There are a number of options that can be given at the end of the command line:
@@ -57,6 +50,12 @@ If the <I>script</I> is "-" then the script is read from the standard input.</LI
<LI><B>-NOMINMEM</B> ignores minimum memory requirements when starting the JVM.</LI>
<LI><B>-help</B> prints a list of available command options.</LI>
+
+<LI><B>-debug</B> adds developer menus and other debugging state.
+One of the debug menus is "Test" which lets Electric test itself.
+The test data is available for download at
+<a href="http://www.staticfreesoft.com/ElectricRegressionData.zip">www.staticfreesoft.com/ElectricRegressionData.zip</a>.
+After extracting the data, you must set its location in the "Tests" Preferences.</LI>
</UL>
<P>
<!-- NEED 3in -->
diff --git a/com/sun/electric/tool/user/help/helphtml/chap01-04-01.html b/com/sun/electric/tool/user/help/helphtml/chap01-04-01.html
index d4a4f75..6a12e90 100644
--- a/com/sun/electric/tool/user/help/helphtml/chap01-04-01.html
+++ b/com/sun/electric/tool/user/help/helphtml/chap01-04-01.html
@@ -12,11 +12,10 @@ Note that this method is <i>not</i> the preferred way to access the Electric sou
because it does not handle dependencies.<br><br>
</li>
-<li><b>At java.net.</b>
-The Electric source code is in a repository at <A HREF="http://java.net">java.net</A>,
-specifically at <A HREF="http://java.net/projects/electric">java.net/projects/electric</A>.
-Before accessing the source code, you must create a java.net account.
-There are a number of ways to build Electric from the source code at java.net:
+<li><b>At savannah.gnu.org.</b>
+The Electric source code is in a repository at <a href="http://savannah.gnu.org">savannah.gnu.org</a>,
+specifically <A HREF="http://savannah.gnu.org/svn/?group=electric">here</A>.
+There are a number of ways to build Electric from the source code:
<ul>
<li>Using the command-line (see <A HREF="chap01-04-03.html#chap01-04-03">Section 1-4-3</A>).</li>
<li>Using the Netbeans development environment (see <A HREF="chap01-04-04.html#chap01-04-04">Section 1-4-4</A>).</li>
diff --git a/com/sun/electric/tool/user/help/helphtml/chap01-04-02.html b/com/sun/electric/tool/user/help/helphtml/chap01-04-02.html
index 59eac2e..3e70b0e 100644
--- a/com/sun/electric/tool/user/help/helphtml/chap01-04-02.html
+++ b/com/sun/electric/tool/user/help/helphtml/chap01-04-02.html
@@ -4,7 +4,7 @@ Two Electric downloads are available from the Free Software Foundation (GNU): wi
Therefore it is possible to build Electric from the source code in the download.
Note, however, that this is not the preferred way to access the source code because it does not
include the various dependencies.
-The preferred way to access the source code is to use Subversions and to access the code on java.net
+The preferred way to access the source code is to use Subversions and to access the code on savannah.gnu.org
(see the next three sections for more).
<P>
To extract the source code from the ".jar" file, place it in its own directory,
diff --git a/com/sun/electric/tool/user/help/helphtml/chap01-04-03.html b/com/sun/electric/tool/user/help/helphtml/chap01-04-03.html
index f766c88..b8433d6 100644
--- a/com/sun/electric/tool/user/help/helphtml/chap01-04-03.html
+++ b/com/sun/electric/tool/user/help/helphtml/chap01-04-03.html
@@ -1,6 +1,6 @@
-<!-- HEADER 1-4-3: Command-line Access to the java.net Repository -->
+<!-- HEADER 1-4-3: Command-line Access to the savannah.gnu.org Repository -->
-Before attempting to build Electric from the java.net,
+Before attempting to build Electric from the savannah.gnu.org,
you must have these tools installed on your computer:
<ol>
<li>JDK 1.6 or later (a JRE is sufficient for running Electric, but a JDK is necessary to build it).</li>
@@ -8,30 +8,30 @@ you must have these tools installed on your computer:
<li>Apache Ant 1.8.0 or later.</li>
</ol>
<P>
-The following variable should be defined:<br>
+The following variable should be defined:<br />
<b>JAVA_PATH</b> path to JDK root directory
<P>
Next, download the latest sources using Subversion.
-The first time you do this, issue these commands:<br/>
- <code><font size="-1">cd WORK-DIR</font></code><br/>
- <code><font size="-1">svn --username USERNAME checkout https://svn.java.net/svn/electric~svn/trunk/electric</font></code><br/>
- <code><font size="-1">cd electric</font></code><br/>
-Once the code has been downloaded, it can be updated with these commands:<br/>
- <code><font size="-1">cd WORK-DIR/electric</font></code><br/>
+The first time you do this, issue these commands:<br />
+ <code><font size="-1">cd WORK-DIR</font></code><br />
+ <code><font size="-1">svn checkout svn://svn.savannah.gnu.org/electric</font></code><br />
+ <code><font size="-1">cd electric</font></code><br />
+Once the code has been downloaded, it can be updated with these commands:<br />
+ <code><font size="-1">cd WORK-DIR/electric</font></code><br />
<code><font size="-1">svn update</font></code>
<P>
-Next, compile the sources (it takes longer the first time, but works incrementally after that):<br/>
- <code><font size="-1">cd WORK-DIR/electric/packaging</font></code><br/>
+Next, compile the sources (it takes longer the first time, but works incrementally after that):<br />
+ <code><font size="-1">cd WORK-DIR/electric/packaging</font></code><br />
<code><font size="-1">ant</font></code>
<P>
-Next run Electric (note that the "X.XX" should be replaced with the current version, for example "9.01"):<br>
- <code><font size="-1">WORK-DIR/electric/packaging/electricPublic-X.XX.jar</font></code><br/>
-or:<br/>
- <code><font size="-1">java -jar WORK-DIR/electric/packaging/electricPublic-X.XX.jar</font></code><br/>
-or:<br/>
- <code><font size="-1">java -classpath WORK-DIR/electric/packaging/electricPublic-X.XX.jar com.sun.electric.Launcher</font></code><br/>
+Next run Electric (note that the "X.XX" should be replaced with the current version, for example "9.01"):<br />
+ <code><font size="-1">WORK-DIR/electric/packaging/electricPublic-X.XX.jar</font></code><br />
+or:<br />
+ <code><font size="-1">java -jar WORK-DIR/electric/packaging/electricPublic-X.XX.jar</font></code><br />
+or:<br />
+ <code><font size="-1">java -classpath WORK-DIR/electric/packaging/electricPublic-X.XX.jar com.sun.electric.Launcher</font></code><br />
<P>
-If your design is large and you need more memory, you can request a larger heap size with this command:<br/>
+If your design is large and you need more memory, you can request a larger heap size with this command:<br />
<code><font size="-1">java -classpath WORK-DIR/electric/packaging/electricPublic-X.XX.jar com.sun.electric.Launcher -Xmx1024m -XX:MaxPermSize=128m</font></code>
<!-- TRAILER -->
diff --git a/com/sun/electric/tool/user/help/helphtml/chap01-04-04.html b/com/sun/electric/tool/user/help/helphtml/chap01-04-04.html
index d4232d8..3248781 100644
--- a/com/sun/electric/tool/user/help/helphtml/chap01-04-04.html
+++ b/com/sun/electric/tool/user/help/helphtml/chap01-04-04.html
@@ -1,6 +1,6 @@
<!-- NEED 5in -->
-<!-- HEADER 1-4-4: Netbeans Access to the java.net Repository -->
+<!-- HEADER 1-4-4: Netbeans Access to the savannah.gnu.org Repository -->
<ol>
<li>Start NetBeans 7.0 or later (these instructions do not work with earlier versions).</li>
@@ -10,11 +10,11 @@
<li>In the left pane, check the "Team Server" plugin and click "Install".
If it is not listed, then it may already be installed.</li>
<li>Use <b>Window / Services</b> to open the "Services" tab</li>
- <li>Expand the "Team Server" node and check that the "java.net" Team Server is listed.</li>
+ <li>Expand the "Team Server" node and check that the "savannah.gnu.org" Team Server is listed.</li>
</ul></li>
-<li>Download Electric Sources from java.net .
+<li>Download Electric Sources from savannah.gnu.org .
<ul>
- <li>Use <b>Team / Team Server / java.net</b> and click <b>Open Project</b></li>
+ <li>Use <b>Team / Team Server / savannah.gnu.org</b> and click <b>Open Project</b></li>
<li>Search for "electric", select "Electric: VLSI Design System", and click "Open From Team Server"</li>
<li>Expand the "Electric: VLSI Design System" node in the "Team" tab and the "Sources" subnode</li>
<li>Click "Source Code Repository (get)"</li>
diff --git a/com/sun/electric/tool/user/help/helphtml/chap01-04-05.html b/com/sun/electric/tool/user/help/helphtml/chap01-04-05.html
index 01c0191..69ed058 100644
--- a/com/sun/electric/tool/user/help/helphtml/chap01-04-05.html
+++ b/com/sun/electric/tool/user/help/helphtml/chap01-04-05.html
@@ -1,6 +1,6 @@
<!-- NEED 5in -->
-<!-- HEADER 1-4-5: Eclipse Access to the java.net Repository -->
+<!-- HEADER 1-4-5: Eclipse Access to the savannah.gnu.org Repository -->
<ol>
<li>Install Eclipse:
@@ -27,7 +27,7 @@
<ul>
<li>Do: <b>File / Import</b></li>
<li>Choose: <b>SVN / Checkout Projects from SVN</b></li>
- <li>Repository is: <b>https://svn.java.net/svn/electric~svn/trunk/electric</b><br/>
+ <li>Repository is: <b>svn+ssh://strubin@svn.savannah.gnu.org/electric/trunk</b><br/>
Select the top-level<br/>
When asked, choose "Check out as a project in the workspace" and name it "Electric"</li>
</ul>
diff --git a/com/sun/electric/tool/user/help/helphtml/chap01-05.html b/com/sun/electric/tool/user/help/helphtml/chap01-05.html
index 7786572..0a14603 100644
--- a/com/sun/electric/tool/user/help/helphtml/chap01-05.html
+++ b/com/sun/electric/tool/user/help/helphtml/chap01-05.html
@@ -2,7 +2,7 @@
Electric plug-ins are additional pieces of code that can be downloaded separately
to enhance the system's functionality.
-If you are building from the java.net repository or are using Java Web Start to run Electric,
+If you are building from the savannah.gnu.org repository,
then all of these plug-ins are already available.
If, however, you are running from the GNU download,
then these plugins are not present and must be downloaded separately.
@@ -16,7 +16,7 @@ It includes the IRSIM simulator and interfaces to the 3D Animation options.
The IRSIM simulator is a gate-level simulator from Stanford University.
Although originally written in C, it was translated to Java so that it could plug into Electric.
The Static Free Software extras are available from <A HREF="http://www.staticfreesoft.com">Static Free Software</A> at
-<A HREF="http://www.staticfreesoft.com/electricSFS-9.05.jar">www.staticfreesoft.com/electricSFS-9.05.jar</A>.
+<A HREF="http://www.staticfreesoft.com/electricSFS-9.07.jar">www.staticfreesoft.com/electricSFS-9.07.jar</A>.
</LI>
<LI><B>Bean Shell</B>
@@ -43,8 +43,8 @@ Also note that your video card driver must support OpenGL 1.2 or later in order
<LI><B>Animation</B>
Another extra that can be added to the 3D facility is 3D animation.
This requires the Java Media Framework (JMF).
-The Java Media Framework is available from <A HREF="http://www.oracle.com">Oracle</A> at
-<A HREF="http://java.sun.com/products/java-media/jmf/">java.sun.com/products/java-media/jmf</A>
+The Java Media Framework is available from <a href="http://www.oracle.com">Oracle</a> at
+<a href="http://java.sun.com/products/java-media/jmf/">java.sun.com/products/java-media/jmf</a>
(this is not a plugin: it is an enhancement to your Java installation).
</LI>
diff --git a/com/sun/electric/tool/user/help/helphtml/chap01-09.html b/com/sun/electric/tool/user/help/helphtml/chap01-09.html
index c723d39..89b89ed 100644
--- a/com/sun/electric/tool/user/help/helphtml/chap01-09.html
+++ b/com/sun/electric/tool/user/help/helphtml/chap01-09.html
@@ -146,7 +146,7 @@ For alternate key binding sets that mimic Cadence, see
</TR>
<TR><TD ALIGN=CENTER>U</TD>
<TD>Up Hierarchy (<A HREF="chap03-05.html#chap03-05">3-5</A>)</TD>
- <TD> </TD>
+ <TD>Select Object Under Cursor (<A HREF="chap02-01-01.html#chap02-01-01">2-1</A>)</TD>
<TD> </TD>
</TR>
<TR><TD ALIGN=CENTER>V</TD>
diff --git a/com/sun/electric/tool/user/help/helphtml/chap01-10-07.html b/com/sun/electric/tool/user/help/helphtml/chap01-10-07.html
index 630c4ba..fd6fa57 100644
--- a/com/sun/electric/tool/user/help/helphtml/chap01-10-07.html
+++ b/com/sun/electric/tool/user/help/helphtml/chap01-10-07.html
@@ -32,7 +32,7 @@ you can see its contents by selecting it and using the
<B>One Level Down</B> command (in menu <B>Cell / Expand Cell Instances</B>,
or click on the opened-eye button in the tool bar).
Note that if the objects in a cell no longer fit in the display window,
-use the <B>Fill Display</B> command (in menu <B>Window</B>).
+use the <B>Fill Display</B> command (in menu <B>Window</B>).<br /><br />
</TD><TD><CENTER><IMG SRC="fig01-11.png" ALT="Figure 1.11"></CENTER></TD></TR></TABLE>
<!-- TRAILER -->
diff --git a/com/sun/electric/tool/user/help/helphtml/chap01-12-03.html b/com/sun/electric/tool/user/help/helphtml/chap01-12-03.html
index 17570a6..6eed425 100644
--- a/com/sun/electric/tool/user/help/helphtml/chap01-12-03.html
+++ b/com/sun/electric/tool/user/help/helphtml/chap01-12-03.html
@@ -1,3 +1,4 @@
+<!-- NEED 2in -->
<!-- HEADER 1-12-3: Layout -->
Now that you have a schematic, it is time to draw the layout.
diff --git a/com/sun/electric/tool/user/help/helphtml/chap01-12-04.html b/com/sun/electric/tool/user/help/helphtml/chap01-12-04.html
index f6c25b5..a4dbee4 100644
--- a/com/sun/electric/tool/user/help/helphtml/chap01-12-04.html
+++ b/com/sun/electric/tool/user/help/helphtml/chap01-12-04.html
@@ -1,3 +1,4 @@
+<!-- NEED 3in -->
<!-- HEADER 1-12-4: Hierarchical Design -->
Now that you have a 2-input NAND gate, you can use it, and an inverter, to construct a 2-input AND gate.
diff --git a/com/sun/electric/tool/user/help/helphtml/chap02-01-01.html b/com/sun/electric/tool/user/help/helphtml/chap02-01-01.html
index c10da56..cf57006 100644
--- a/com/sun/electric/tool/user/help/helphtml/chap02-01-01.html
+++ b/com/sun/electric/tool/user/help/helphtml/chap02-01-01.html
@@ -1,6 +1,7 @@
<!-- HEADER 2-1-1: Selecting Nodes and Arcs -->
<!-- COMMAND Edit/Selection/Select Object... -->
+<!-- COMMAND Edit/Selection/Select Object Under Cursor... -->
<!-- COMMAND Edit/Selection/Deselect All Arcs -->
<!-- COMMAND Edit/Selection/Select All Like This -->
<!-- COMMAND Edit/Selection/Select Next Like This -->
@@ -33,6 +34,8 @@ and arcs are added to the selection, but objects that are already highlighted be
There are often multiple objects under the cursor (for example, in the area where an arc overlaps a node).
To get the object you want, hold the control key while clicking.
The <I><A HREF="chap01-08.html#chap01-08">control-left</A></I> button cycles through all objects under the cursor.
+You can also use the <b>Select Object Under Cursor...</b> command (in menu <b>Edit / Selection</b>)
+which pops-up a list of objects under the cursor and lets you choose which one to select.
<P>
The notion of toggling selection (shift-left) and cycling through what is under the cursor (control-left)
can be combined.
diff --git a/com/sun/electric/tool/user/help/helphtml/chap03-05.html b/com/sun/electric/tool/user/help/helphtml/chap03-05.html
index cdfbf5b..de966f7 100644
--- a/com/sun/electric/tool/user/help/helphtml/chap03-05.html
+++ b/com/sun/electric/tool/user/help/helphtml/chap03-05.html
@@ -67,13 +67,12 @@ and uncheck "Dim upper levels of hierarchy when editing Down-In-Place".
<P>
The <B>Down Hierarchy In Place To Object</B> command finds the object under the cursor
(at any level of the hierarchy) and descends to that level.
-This may go down the hierarchy many times.
+This may go down the hierarchy many levels.
It descends "in place" so that the original geometry is visible, but higher-levels are grayed-out.
It is useful when trying to quickly find the hierarchy that exists at that point, and see which instances
were used to construct it.
Note that there may be many different levels of hierarchy under the cursor,
which will cause a popup to appear listing the possible subcells to edit.
-This popup will list only one object at a given level of hierarchy, even though there may be many more.
<P>
<H4>Schematic Considerations</H4>
<P>
diff --git a/com/sun/electric/tool/user/help/helphtml/chap03-08.html b/com/sun/electric/tool/user/help/helphtml/chap03-08.html
index 891d1f5..af440ed 100644
--- a/com/sun/electric/tool/user/help/helphtml/chap03-08.html
+++ b/com/sun/electric/tool/user/help/helphtml/chap03-08.html
@@ -27,5 +27,6 @@ The <B>All the Way</B> subcommand continues to extract instances inside of insta
no more instances, just primitives.
The <B>Specified Amount...</B> prompts for a number of levels of hierarchy and extracts that many levels deep.
All arcs that were connected to the cell instances are reconnected to the correct parts of the instantiated circuitry.
+Note that extraction works only with layout cells; it cannot be used with schematics.
<!-- TRAILER -->
diff --git a/com/sun/electric/tool/user/help/helphtml/chap03-09-03.html b/com/sun/electric/tool/user/help/helphtml/chap03-09-03.html
index 085cc61..917a3ab 100644
--- a/com/sun/electric/tool/user/help/helphtml/chap03-09-03.html
+++ b/com/sun/electric/tool/user/help/helphtml/chap03-09-03.html
@@ -20,6 +20,7 @@
<!-- COMMAND File/Export/Pads... -->
<!-- COMMAND File/Export/PNG (Portable Network Graphics)... -->
<!-- COMMAND File/Export/PostScript... -->
+<!-- COMMAND File/Export/Flattened Rectangles... -->
<!-- COMMAND File/Export/STL (Stereolithography)... -->
<!-- COMMAND File/Export/Telesis... -->
@@ -120,6 +121,13 @@ The output file contains only a visual representation of the current cell
PostScript options can be controlled with the
Printing Preferences (in menu <B>File / Preferences...</B>, "General" section, "Printing" tab).</LI>
+<LI><B>Flattened Rectangles</B> is a general format for writing flattened geometry as rectangles.
+Users are prompted for the format to use, with %l replaced by the rectangle layer,
+%x replaced by the X coordinate of the center of the rectangle,
+%y replaced by the Y coordinate of the center of the rectangle,
+%w replaced by the width of the rectangle,
+and %h replaced by the height of the rectangle.</LI>
+
<LI><B>STL (Stereolithography)</B> is a format for interfacing with "3D printing" machines.</LI>
<LI><B>SVG</B> is a web format (Scalable Vector Graphics) that captures the current window.
diff --git a/com/sun/electric/tool/user/help/helphtml/chap04-07-04.html b/com/sun/electric/tool/user/help/helphtml/chap04-07-04.html
index c909e3d..544bd6f 100644
--- a/com/sun/electric/tool/user/help/helphtml/chap04-07-04.html
+++ b/com/sun/electric/tool/user/help/helphtml/chap04-07-04.html
@@ -24,6 +24,7 @@ command (in menu <B>Window / Measurements</B>)
<P>
In measure mode, each click places a new point on the display, and shows the distance to the previous point.
Clicking the right button lets you start a new measure point without connecting it to the previous one.
+If you hold the shift key down, the cursor snaps to points and edges.
Double-clicking the right button removes the measurements.
The measurement text is scaled by the global text scale
(see <A HREF="chap06-08-04.html#chap06-08-04">Section 6-8-4</A>).
diff --git a/com/sun/electric/tool/user/help/helphtml/chap06-08-01.html b/com/sun/electric/tool/user/help/helphtml/chap06-08-01.html
index ffb5e21..4e61afa 100644
--- a/com/sun/electric/tool/user/help/helphtml/chap06-08-01.html
+++ b/com/sun/electric/tool/user/help/helphtml/chap06-08-01.html
@@ -8,8 +8,11 @@ Each unexpanded instance of a cell has text that describes it, and its ports.
<LI>Each export has a text label.
</LI>
<LI>Nodes and arcs can be named (with <B>Object Properties...</B>) so that they have text on them.
-They can also have additional <I>attributes</I> that appear as text (for example, NCC annotations,
-Spice multipliers, Verilog transistor strength, etc.)
+They can also have additional <I>attributes</I> that appear as text.
+For NCC annotations, see <A HREF="chap09-07-04.html#chap09-07-04">Section 9-7-4</A>.
+For Spice multipliers, see <A HREF="chap09-04-03.html#chap09-04-03">Section 9-4-3</A>.
+For Verilog transistor strength, see <A HREF="chap09-04-02.html#chap09-04-02">Section 9-4-2</A>.
+For GDS text, see <A HREF="chap07-03-03.html#chap07-03-03">Section 7-3-3</A>.
</LI>
<LI>Certain primitive nodes (such as the Flip-Flop component of the Schematic technology)
have text as an integral part of their image.
diff --git a/com/sun/electric/tool/user/help/helphtml/chap06-09-01.html b/com/sun/electric/tool/user/help/helphtml/chap06-09-01.html
index e0d2c4a..bebba08 100644
--- a/com/sun/electric/tool/user/help/helphtml/chap06-09-01.html
+++ b/com/sun/electric/tool/user/help/helphtml/chap06-09-01.html
@@ -11,7 +11,7 @@
A collection of electrically connected components defines a <I>network</I>.
Networks may span many arcs,
-or they may reside on only a single export on a single node.
+or they may reside on only a single export of a single node.
Because networks are stored in the Electric database,
they can be immediately accessed when needed.
<P>
@@ -19,11 +19,18 @@ Whenever a port on a node is selected,
the highlighting indicates the entire network that is connected to that port.
Another way to see an entire network is to use the <B>Show Network</B>
command (in menu <B>Tools / Network</B>).
-This will highlight all arcs on the currently selected networks, and it will also
-"cross-probe" by highlighting networks that have the same name in other views of this cell.
-If a cell instance is selected but no individual port is selected (such that there is no single network selected)
-then all wired ports will be highlighted.
-Repeated use of this command causes the network to be highlighted at successively lower levels of the hierarchy.
+This will highlight all arcs on the currently selected networks.
+Repeated use of the command causes the network to be highlighted at successively lower levels of the hierarchy,
+useful when cell instances are part of the network.
+The command will also "cross-probe" by highlighting networks that have the same name in other views of this cell.
+<P>
+Cells that are imported from other EDA systems often have no connectivity information
+and are built with pure layer nodes
+(see <A HREF="chap06-10-01.html#chap06-10-01">Section 6-10-1</A> for more).
+When the <b>Show Network</b> command is run on such cells, it quickly extracts the information,
+then displays it.
+Also, if a cell instance is selected but no individual port is selected (such that there is no single network selected)
+then the command highlights all wired ports.
<P>
If the design is very dense,
you can select one or more networks by name with the <B>Select Object...</B>
diff --git a/com/sun/electric/tool/user/help/helphtml/chap06-11.html b/com/sun/electric/tool/user/help/helphtml/chap06-11.html
index 722be8e..09e38f9 100644
--- a/com/sun/electric/tool/user/help/helphtml/chap06-11.html
+++ b/com/sun/electric/tool/user/help/helphtml/chap06-11.html
@@ -48,9 +48,8 @@ for(Iterator it = c.getNodes(); it.hasNext(); ) {<BR>
}<BR>
<BR>
// find all exports that start with "A"<BR>
-for(Iterator it = c(); it.hasNext(); ) {<BR>
- com.sun.electric.database.hierarchy.Export e =
- (com.sun.electric.database.hierarchy.Export)it.next();<BR>
+for(Iterator it = c.getPorts(); it.hasNext(); ) {<BR>
+ com.sun.electric.database.hierarchy.Export e = (com.sun.electric.database.hierarchy.Export)it.next();<BR>
if (e.getName().toLowerCase().startsWith("a"))<BR>
System.out.println("Found export: " + e.getName());<BR>
}
@@ -71,9 +70,9 @@ This also applies to Electric's "EPoint" class.
<CODE><FONT SIZE="-2">
import com.sun.electric.database.hierarchy.Cell;<BR>
import com.sun.electric.database.topology.NodeInst;<BR>
-import com.sun.electric.database.variable.EvalJavaBsh;<BR>
import com.sun.electric.technology.PrimitiveNode;<BR>
import com.sun.electric.technology.Technology;<BR>
+import com.sun.electric.tool.lang.EvalJavaBsh;<BR>
import java.awt.geom.Point2D;<BR>
<BR>
Cell newCell = Cell.makeInstance(Library.getCurrent(), "samp1{lay}");<BR>
@@ -175,8 +174,8 @@ This example searches the current cell, printing all transistors and all exports
from com.sun.electric.database.hierarchy import Cell<BR>
from com.sun.electric.database.hierarchy import Library<BR>
from com.sun.electric.database.topology import NodeInst<BR>
-from com.sun.electric.database.variable import EvalJython<BR>
from com.sun.electric.technology import Technology<BR>
+from com.sun.electric.tool.lang import EvalJython<BR>
from java.awt.geom import Point2D<BR>
newCell = Cell.makeInstance(Library.getCurrent(), "sample1{lay}")<BR>
diff --git a/com/sun/electric/tool/user/help/helphtml/chap07-01-01.html b/com/sun/electric/tool/user/help/helphtml/chap07-01-01.html
index aab9409..23ce736 100644
--- a/com/sun/electric/tool/user/help/helphtml/chap07-01-01.html
+++ b/com/sun/electric/tool/user/help/helphtml/chap07-01-01.html
@@ -67,11 +67,14 @@ The technology should not be used for any new designs.</LI>
<LI><B>mocmossub</B> an older version of the "mocmos" technology that focuses on submicron facilities.
The technology should not be used for any new designs because the "mocmos" technology incorporates
these submicron features.</LI>
+<LI><B>mocmos-cn</B> a modified version of the "mocmos" technology that has carbon-nanotube transistors.</LI>
<LI><B>nmos</B> an old nMOS technology, based on the book:
Mead, C. and Conway, L., <I>Introduction to VLSI Systems</I>, Addison-Wesley, Reading, Massachusetts, 1980.
The cell <CODE>tech-nMOS{lay}</CODE> in the sample library illustrates this technology.</LI>
<LI><B>pcb</B> a printed-circuit board technology with 8 layers.
The cell <CODE>tech-PCB{sch}</CODE> in the sample library illustrates this technology.</LI>
+<LI><B>photonics</B> a simple photonics technology with a few basic light-guide elements.
+The cells named <CODE>tech-photonics*{lay}</CODE> in the sample library illustrate this technology.</LI>
<LI><B>rcmos</B> a round CMOS technology, based on work at CalTech.
The cell <CODE>tech-RoundCMOS{lay}</CODE> in the sample library illustrates this technology.</LI>
<LI><B>schematic</B> a schematic capture facility.
diff --git a/com/sun/electric/tool/user/help/helphtml/chap07-03-03.html b/com/sun/electric/tool/user/help/helphtml/chap07-03-03.html
index 0e53b70..b305f11 100644
--- a/com/sun/electric/tool/user/help/helphtml/chap07-03-03.html
+++ b/com/sun/electric/tool/user/help/helphtml/chap07-03-03.html
@@ -2,6 +2,8 @@
<!-- HEADER 7-3-3: GDS Control -->
+<!-- COMMAND Edit/Text/Add GDS Text -->
+<!-- COMMAND Edit/Text/Add HV GDS Text -->
<!-- COMMAND File/Import/GDS II (Stream)... -->
<!-- COMMAND File/Import/GDS II (Stream) Skeleton... -->
<!-- COMMAND File/Import/GDS Map File... -->
@@ -40,8 +42,12 @@ GDS numbers come in a few different variations:
<UL>
<LI><B>Normal</B> for regular geometry.</LI>
<LI><B>Pin</B> for exports.</LI>
-<LI><B>Text</B> for export names.</LI>
-<LI><B>High V</B> for high voltage layers.</LI>
+<LI><B>Text</B> for export names and special GDS text.
+You can use the <b>Add GDS Text</b> command (in menu <b>Edit / Text</b) to add text to the selected object.
+That text will be emitted using this "Text" layer number.</LI>
+<LI><B>High V</B> for high voltage layers.
+You can use the <b>Add HV GDS Text</b> command (in menu <b>Edit / Text</b) to add high-voltage text to the selected object.
+That text will be emitted using this "High V" layer number.</LI>
</UL>
To ignore a layer, clear the layer field (it is not sufficient to set it to zero...it must be blank).
<P>
@@ -89,12 +95,15 @@ Requests all GDS "pins" (Electric exports) contain characteristics (input, outpu
This may be incompatible with some versions of GDS so it can be disabled.
</LI>
<LI>
-"Max chars in output cell name".
+"Max chars in cell name".
This limits the number of characters in a cell name.
Names longer than this are truncated, and adjusted to ensure uniqueness.
</LI>
-<LI>"Scale by".
-This scales the GDS by the given factor when written to disk.</LI>
+<LI>"Precision" and "Units/meter" define the scaling information written to a GDS file.
+The Precision is the number of units available and the Units/meter defines the size of a unit.
+The default Units/meter is a billion, meaning that the unit size is 1 nanometer.
+Note that some small feature-size technologies may require a larger Units/meter field.
+If GDS Export encounters precision errors, you will be asked to increase this value.</LI>
</UL>
<p>
At the bottom is a setting for both export and import:
@@ -151,6 +160,10 @@ Export locations are expanded to cover the geometry on which they reside,
because Cadence allows connections to be elsewhere on the layer..
Also, Cadence style bus delimeters (<>) are converted to Electric style ([]).
</LI>
+<LI>"Dump readable data while reading" is a way to debug GDS files.
+When this is checked, the GDS data is written to a text file during import,
+allowing you to see what is in the file.
+</LI>
</UL>
<P>
These dialog elements are available on the right side (the GDS User Preferences) for export control:
@@ -172,6 +185,7 @@ It enables external circuit analysis programs (such as Assura) to properly under
Specifically, when this is checked, all of a layout cell's
exports which are linked by the NCC <i>exportsConnectedByParent</i> annotation will be given the same GDS pin text
(see <A HREF="chap09-07-04.html#chap09-07-04">Section 9-7-4</A> for more on NCC annotations).</li>
+
</UL>
<P>
These dialog elements are available on the right side (the GDS User Preferences) for export and import control:
diff --git a/com/sun/electric/tool/user/help/helphtml/chap07-03-05.html b/com/sun/electric/tool/user/help/helphtml/chap07-03-05.html
index d688f2b..4038bae 100644
--- a/com/sun/electric/tool/user/help/helphtml/chap07-03-05.html
+++ b/com/sun/electric/tool/user/help/helphtml/chap07-03-05.html
@@ -53,5 +53,10 @@ If they are not ignored (the box is unchecked) they are placed at the origin.
<p>
The "Ignore vias block" option causes vias to be dropped from import.
<p>
+The "Place and connect all pin geometry" option connects like-named exports (called "pins" by Cadence)
+with unrouted arcs. Because Cadence systems give electrically-connected pins the same name,
+those like-named pins should all be connected. This option connects them in such a way that routers
+can wire them together.
+<p>
Finally, you can control what happens to unrecognized layers (either ignore them or convert them to the DRC-exclusion layer).
<!-- TRAILER -->
diff --git a/com/sun/electric/tool/user/help/helphtml/chap08-04.html b/com/sun/electric/tool/user/help/helphtml/chap08-04.html
index e635b90..34a393f 100644
--- a/com/sun/electric/tool/user/help/helphtml/chap08-04.html
+++ b/com/sun/electric/tool/user/help/helphtml/chap08-04.html
@@ -81,6 +81,7 @@ The last option on the right side of the layer cell specifies the minimum covera
<H4>Layer Function</H4>
<P>
The "Function" entry allows a general-purpose description to be attached to the layer.
+Metal layers can have "-C1", "-C2", or "-C3" appended to them to describe multiple patterns (colors 1, 2, or 3).
<P>
<TABLE><TR><TD>
A function consists of a single base description plus optional additional modifiers.
diff --git a/com/sun/electric/tool/user/help/helphtml/chap08-10.html b/com/sun/electric/tool/user/help/helphtml/chap08-10.html
index 4ae392f..7c445ae 100644
--- a/com/sun/electric/tool/user/help/helphtml/chap08-10.html
+++ b/com/sun/electric/tool/user/help/helphtml/chap08-10.html
@@ -201,6 +201,9 @@ The <layer> elements define layers in the technology. They contains these
<B>"fun"</B> the function of this layer, taken from this list:
<BR> UNKNOWN
<BR> METAL1 ... METAL12 <I>(metal)</I>
+ <BR> METAL1C1 ... METAL12C1 <I>(metal)</I>
+ <BR> METAL1C2 ... METAL12C2 <I>(metal)</I>
+ <BR> METAL1C3 ... METAL12C3 <I>(metal)</I>
<BR> POLY1 ... POLY3 <I>(polysilicon)</I>
<BR> GATE <I>(gate polysilicon)</I>
<BR> DIFF DIFFP DIFFN <I>(active)</I>
@@ -857,8 +860,11 @@ Here are the possible rules:
In addition to the standard attributes, this rule has one or more layer names to which it applies.
The type of information can be
MINWID (minimum width of the layer),
-MINAREA (the minimum area of the layer), or
-MINENCLOSEDAREA (the minimum area of any hold in a polygon).
+MINAREA (the minimum area of the layer),
+MINENCLOSEDAREA (the minimum area of any hold in a polygon),
+SURROUND (minimum extension of a layer beyond another),
+DIAGONALVIA (diagonal via rules), or
+G0CPL (G0 rules).
Example:<BR>
<CODE><FONT SIZE="-1"> <LayerRule ruleName="1.1 Mosis" layerName="{P-Well, N-Well}" when="ALL"<BR>
type="MINWID" value="12.0"/></FONT></CODE><BR>
@@ -872,8 +878,9 @@ SPACING (minimum spacing in both connected and unconnected situations),
UCONSPA2D (minimum spacing of a two-dimensional array of contact cuts),
FORBIDDEN (disallowed combination of layers anywhere in the design),
EXTENSION (minimum overlap of a layer extended from another),
-or
-SURROUND (minimum extension of a layer beyond another).
+SURROUND (minimum extension of a layer beyond another),
+DIAGONALVIA (diagonal via rules), or
+G0CPL (G0 rules).
Example:<BR>
<CODE><FONT SIZE="-1"> <LayersRule ruleName="15.4 Mosis" layerNames="{Metal-3,Metal-3}"<BR>
diff --git a/com/sun/electric/tool/user/help/helphtml/fig01-27.png b/com/sun/electric/tool/user/help/helphtml/fig01-27.png
index dba7123..9a6ca7d 100644
Binary files a/com/sun/electric/tool/user/help/helphtml/fig01-27.png and b/com/sun/electric/tool/user/help/helphtml/fig01-27.png differ
diff --git a/com/sun/electric/tool/user/help/helphtml/fig01-34.png b/com/sun/electric/tool/user/help/helphtml/fig01-34.png
index ca84eb0..9070269 100644
Binary files a/com/sun/electric/tool/user/help/helphtml/fig01-34.png and b/com/sun/electric/tool/user/help/helphtml/fig01-34.png differ
diff --git a/com/sun/electric/tool/user/help/helphtml/fig02-14.png b/com/sun/electric/tool/user/help/helphtml/fig02-14.png
index 95864c6..561ebe9 100644
Binary files a/com/sun/electric/tool/user/help/helphtml/fig02-14.png and b/com/sun/electric/tool/user/help/helphtml/fig02-14.png differ
diff --git a/com/sun/electric/tool/user/help/helphtml/fig07-07.png b/com/sun/electric/tool/user/help/helphtml/fig07-07.png
index 8085529..a5257ca 100644
Binary files a/com/sun/electric/tool/user/help/helphtml/fig07-07.png and b/com/sun/electric/tool/user/help/helphtml/fig07-07.png differ
diff --git a/com/sun/electric/tool/user/help/helphtml/fig07-27.png b/com/sun/electric/tool/user/help/helphtml/fig07-27.png
index 5cd0d1a..0058a65 100644
Binary files a/com/sun/electric/tool/user/help/helphtml/fig07-27.png and b/com/sun/electric/tool/user/help/helphtml/fig07-27.png differ
diff --git a/com/sun/electric/tool/user/help/helphtml/fig09-49.png b/com/sun/electric/tool/user/help/helphtml/fig09-49.png
index 1b0ece1..c3ec114 100644
Binary files a/com/sun/electric/tool/user/help/helphtml/fig09-49.png and b/com/sun/electric/tool/user/help/helphtml/fig09-49.png differ
diff --git a/com/sun/electric/tool/user/help/helphtml/floatingGates.jelib b/com/sun/electric/tool/user/help/helphtml/floatingGates.jelib
index f21dda7..2387c9e 100644
--- a/com/sun/electric/tool/user/help/helphtml/floatingGates.jelib
+++ b/com/sun/electric/tool/user/help/helphtml/floatingGates.jelib
@@ -3,10 +3,10 @@
# * Electric(tm) VLSI Design System
# *
# * File: floatingGates.jelib
-# * Designed by Robert Drost, Sun Microsystems.
+# * Designed by Robert Drost.
# * Memo publised: A Metal Cage Layout Designed with Electric (SML2006-0339)
# *
-# * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+# * Copyright (c) 2003, Static Free Software. All rights reserved.
# *
# * Electric(tm) is free software; you can redistribute it and/or modify
# * it under the terms of the GNU General Public License as published by
@@ -29,7 +29,7 @@ HfloatingGates|8.04u
Vlayout|lay
# Cell topCell;1{lay}
-CtopCell;1{lay}||mocmos|1100125938029|1153350940188||FACET_schematic_page_size()Sh|USER_drawing_designer_name()SRobert Drost, Sun Microsystems (SML2006-0339)
+CtopCell;1{lay}||mocmos|1100125938029|1153350940188||FACET_schematic_page_size()Sh|USER_drawing_designer_name()SRobert Drost (SML2006-0339)
Ngeneric:Facet-Center|art at 0||0|0|0|0||AV
NMetal-1-N-Active-Con|contact at 0||43|4|22|17||
NMetal-1-N-Active-Con|contact at 1||43|-4|22|17||
diff --git a/com/sun/electric/tool/user/help/helphtml/samples.jelib b/com/sun/electric/tool/user/help/helphtml/samples.jelib
index 2de04dc..b48b709 100644
--- a/com/sun/electric/tool/user/help/helphtml/samples.jelib
+++ b/com/sun/electric/tool/user/help/helphtml/samples.jelib
@@ -1,5 +1,5 @@
# header information:
-Hsamples|9.00q|USER_electrical_units()I70464
+Hsamples|9.07h|USER_electrical_units()I70464
# Views:
Vunknown|""
@@ -1646,6 +1646,72 @@ Eout||D5G1;|dmos at 0|imp-trans-diff-bottom|U
Epoly||D5G1;|pin at 0||U
X
+# Cell tech-photonicsBusBend;2{lay}
+Ctech-photonicsBusBend;2{lay}||photonics|1383154249884|1383762254209|E
+Ngeneric:Facet-Center|art at 0||0|0||||AV
+NOptical-Corner-90|node at 0||5|5||||
+NOptical-Corner-90|node at 1||10|10|10|10||
+NOptical-Corner-90|node at 2||15|15|20|20||
+NOptical-Corner-90|node at 3||20|20|30|30||
+NOptical-Corner-90|node at 4||25|25|40|40||
+Ei5|i1|D5G2;X-1;|node at 0|c2|U
+Ei4|i2|D5G2;X-1;|node at 1|c2|U
+Ei3 at 66639242|i3|D5G2;X-1;|node at 2|c2|U
+Ei4 at 435278300|i4|D5G2;X-1;|node at 3|c2|U
+Ei5 at 964124020|i5|D5G2;X-1;|node at 4|c2|U
+E05|o1|D5G2;Y-1;|node at 0|c1|U
+Eo2||D5G2;Y-1;|node at 1|c1|U
+Eo3||D5G2;Y-1;|node at 2|c1|U
+Eo4||D5G2;Y-1;|node at 3|c1|U
+Eo5||D5G2;Y-1;|node at 4|c1|U
+X
+
+# Cell tech-photonicsExample;1{lay}
+Ctech-photonicsExample;1{lay}||photonics|1383154034831|1443979056659|
+Ngeneric:Facet-Center|art at 0||0|0||||AV
+Itech-photonicsBusBend;2{lay}|busBend at 0||25|56|||D5G4;
+Itech-photonicsBusBend;2{lay}|busBend at 1||-66|56|R||D5G4;
+Itech-photonicsBusBend;2{lay}|busBend at 2||-66|1|RR||D5G4;
+NRing|node at 0||13|18||||
+NOptical-Corner-90|node at 2||-41|36|||X|
+NOptical-Corner-90|node at 3||25|31|10|10|XR|
+NPhoto-Detector|node at 5||62|24||||
+NGrating-Coupler|node at 9||-9|-49|||R|
+NOptical-Corner-90|node at 11||-51|-4|||RRR|
+NOptical-Corner-90|node at 13||30|-4|||RRR|
+NOptical-Corner-90|node at 15||57|-24|||RRR|
+NSplitter|node at 16||-34.3|-19||||
+AOptical|net at 3|||IJS1800|node at 2|c2|-36|41|node at 3|c1|15|41
+AOptical|net at 17|||IJS1800|busBend at 1|05|-66|66|busBend at 0|i5|25|66
+AOptical|net at 18|||IJS1800|busBend at 1|o2|-66|76|busBend at 0|i4|25|76
+AOptical|net at 19|||IJS1800|busBend at 1|o3|-66|86|busBend at 0|i3 at 66639242|25|86
+AOptical|net at 20|||IJS1800|busBend at 1|o4|-66|96|busBend at 0|i4 at 435278300|25|96
+AOptical|net at 21|||IJS1800|busBend at 1|o5|-66|106|busBend at 0|i5 at 964124020|25|106
+AOptical|net at 35|||IJS2700|busBend at 2|05|-76|1|busBend at 1|i5|-76|56
+AOptical|net at 36|||IJS2700|busBend at 2|o2|-86|1|busBend at 1|i4|-86|56
+AOptical|net at 37|||IJS2700|busBend at 2|o3|-96|1|busBend at 1|i3 at 66639242|-96|56
+AOptical|net at 38|||IJS2700|busBend at 2|o4|-106|1|busBend at 1|i4 at 435278300|-106|56
+AOptical|net at 39|||IJS2700|busBend at 2|o5|-116|1|busBend at 1|i5 at 964124020|-116|56
+AOptical|net at 40|||IJS900|node at 2|c1|-46|31|node at 11|c2|-46|1
+AOptical|net at 41|||IJS1800|busBend at 2|i5|-66|-9|node at 11|c1|-56|-9
+AOptical|net at 44|||IJS900|node at 3|c2|35|21|node at 13|c2|35|1
+AOptical|net at 48|||IJS0|node at 9||-9|-49|busBend at 2|i5 at 964124020|-66|-49
+AOptical|net at 49|||IJS900|node at 5|pd-bot|62|-1|node at 15|c2|62|-19
+AOptical|net at 55|||IJS1800|busBend at 2|i3 at 66639242|-66|-29|node at 16|splitter-ll|-54.3|-29
+AOptical|net at 56|||IJS0|node at 15|c1|52|-29|node at 16|splitter-lr|-14.3|-29
+AOptical|net at 57|||IJS1800|node at 16|splitter-ur|-14.3|-9|node at 13|c1|25|-9
+X
+
+# Cell tech-photonicsSamples;1{lay}
+Ctech-photonicsSamples;1{lay}||photonics|1383679043503|1383764125027|
+NSplitter|node at 0||-200|-51||||
+NGrating-Coupler|node at 1||-200|-7||||
+NPhoto-Detector|node at 4||-137|-18|||RR|
+Ngeneric:Invisible-Pin|pin at 4||-200|-35|||||ART_message(D5G3;)S[Splitter,spie.org/x90296.xml]
+Ngeneric:Invisible-Pin|pin at 5||-200|-3|||||ART_message(D5G3;)S[Grating Coupler:,www.opticsinfobase.org/oe/fulltext.cfm?uri=oe-21-19-21961]
+Ngeneric:Invisible-Pin|pin at 6||-137|-47|||||ART_message(D5G3;)S[Photo Detector,www.opticsinfobase.org/oe/fulltext.cfm?uri=oe-18-5-4986]
+X
+
# Cell tool-Compaction;1{lay}
Ctool-Compaction;1{lay}||mocmos|902439421000|1158097516687|
NMetal-1-Polysilicon-1-Con|contact at 0||-698.5|-282.5||||
@@ -1675,6 +1741,311 @@ AN-Active|net at 11|||S900|nmos at 1|diff-bottom|-675.5|-314|contact at 3||-675.5|-350
APolysilicon-1|net at 12|||S0|pmos at 1|poly-left|-651|-310|nmos at 1|poly-right|-672|-310
X
+# Cell tool-NCC;1{lay}
+Ctool-NCC;1{lay}||mocmos|986396021000|987906611000||prototype_center()I[0,0]
+Ngeneric:Facet-Center|art at 0||0|0||||AV
+NMetal-1-N-Active-Con|contact at 0||8|8.5||10|YRR|
+NMetal-1-Polysilicon-1-Con|contact at 1||16|24.5||||
+NMetal-1-N-Active-Con|contact at 2||-24|6.5||10|YRR|
+NMetal-1-N-Active-Con|contact at 3||-16|6.5||10|YRR|
+NMetal-1-N-Active-Con|contact at 4||16|6.5||10|YRR|
+NMetal-1-N-Active-Con|contact at 5||0|6.5||10|YRR|
+NMetal-1-Polysilicon-1-Con|contact at 6||-17|24.5||||
+NMetal-1-Metal-2-Con|contact at 7||0|42||||
+NMetal-1-Metal-2-Con|contact at 8||0|0||||
+NMetal-1-Polysilicon-1-Con|contact at 9||1|29||||
+NMetal-1-Polysilicon-1-Con|contact at 10||-2.5|21||||
+NMetal-1-P-Active-Con|contact at 11||-12|42|||R|
+NMetal-1-P-Active-Con|contact at 12||8|42.5||10||
+NMetal-1-P-Active-Con|contact at 13||0|42.5||10||
+NN-Transistor|nmos at 0||-7|15||5|R|
+NN-Transistor|nmos at 1||-20|6.5|17||YRRR|
+NN-Transistor|nmos at 2||12|6.5|17||YRRR|
+NN-Transistor|nmos at 3||4|6.5|17||YRRR|
+NN-Active-Pin|pin at 0||-16|15||||
+NMetal-1-Pin|pin at 1||-16|14||||
+NMetal-1-Pin|pin at 2||0|0||||
+NMetal-1-Pin|pin at 3||0|51||||
+NMetal-1-Pin|pin at 4||-9|14||||
+NMetal-1-Pin|pin at 5||-9|10.5||||
+NPolysilicon-1-Pin|pin at 6||-5.5|21||||
+NMetal-1-Pin|pin at 7||16|24.5||||
+NMetal-1-Pin|pin at 8||-17|24.5||||
+NPolysilicon-1-Pin|pin at 9||15.5|23||||
+NPolysilicon-1-Pin|pin at 10||12|23||||
+NMetal-1-Pin|pin at 11||-9.5|14||||
+NN-Active-Pin|pin at 12||-16|15||||
+NPolysilicon-1-Pin|pin at 13||-17|23||||
+NPolysilicon-1-Pin|pin at 14||-20|23||||
+NMetal-1-Pin|pin at 15||-9.5|29||||
+NMetal-1-Pin|pin at 16||-9.5|41.5||||
+NMetal-1-Pin|pin at 17||16|-3.5||||
+NMetal-1-Pin|pin at 18||-24|14||||
+NMetal-2-Pin|pin at 19||0|42||||
+NMetal-2-Pin|pin at 20||0|0||||
+NMetal-1-Pin|pin at 21||8|21.5||||
+NPolysilicon-1-Pin|pin at 22||4|28.5||||
+NP-Well-Node|plnode at 0||0|7|72|35||A
+NN-Well-Node|plnode at 1||0|42|72|35||A
+NP-Transistor|pmos at 0||-6|42||3|R|
+NP-Transistor|pmos at 1||4|42.5|17||R|
+NMetal-1-N-Well-Con|substr at 0||-8|51||||
+NMetal-1-P-Well-Con|well at 0||-8|0||||
+AP-Active|net at 0|||S0|pmos at 0|diff-top|-11.5|42|contact at 11||-11.5|42
+AP-Active|net at 1|||S0|pmos at 0|diff-bottom|-0.5|42|contact at 13||-0.5|42
+APolysilicon-1|net at 2|||S900|pmos at 0|poly-left|-5.5|38.5|pin at 6||-5.5|21
+APolysilicon-1|net at 3|||S2700|nmos at 0|poly-right|-5.5|18.5|pin at 6||-5.5|21
+AN-Active|net at 4|||S900|pin at 0||-16|15|contact at 3||-16|6.5
+AN-Active|net at 5|||S0|nmos at 0|diff-top|-13.25|15|pin at 0||-16|15
+AN-Active|net at 6|||S900|nmos at 0|diff-bottom|-0.5|15|contact at 5||-0.5|12
+AMetal-1|net at 7|||S2700|contact at 8||0|0.5|contact at 5||0|1
+AMetal-1|net at 8|||S900|pin at 1||-16|14|contact at 3||-16|6.5
+AMetal-1|net at 9|||S0|pin at 11||-9.5|14|pin at 1||-16|14
+AMetal-1|net at 10|||S2700|pin at 2||0|0|contact at 5||0|6.5
+AMetal-1|net at 11|||S1800|well at 0||-8|0|pin at 2||0|0
+AMetal-1|net at 12|||S900|pin at 3||0|51|contact at 13||0|43.5
+AMetal-1|net at 13|||S1800|substr at 0||-8|51|pin at 3||0|51
+AMetal-1|net at 14|||S900|pin at 21||8|21.5|contact at 0||8|14
+AN-Active|net at 15|||RS0|contact at 0||8|8.5|nmos at 3|diff-top|8|8.5
+AN-Active|net at 16|||RS0|contact at 0||8|8.5|nmos at 2|diff-bottom|8|8.5
+AMetal-1|net at 17|||S0|pin at 4||-9|14|pin at 11||-9.5|14
+AMetal-1|net at 18|||S2700|pin at 5||-9|10.5|pin at 4||-9|14
+APolysilicon-1|net at 19|||S900|pin at 22||4|28.5|nmos at 3|poly-right|4|18.5
+APolysilicon-1|net at 20|||S0|contact at 10||-3|21|pin at 6||-5.5|21
+AMetal-1|net at 21|||S1800|pin at 7||16|24.5|contact at 1||16|24.5
+AMetal-1|net at 22|||S0|pin at 8||-17|24.5|contact at 6||-17|24.5
+APolysilicon-1|net at 23|||S2700|pin at 9||15.5|23|contact at 1||15.5|24
+APolysilicon-1|net at 24|||S1800|pin at 10||12|23|pin at 9||15.5|23
+APolysilicon-1|net at 25|||S2700|nmos at 2|poly-right|12|18.5|pin at 10||12|23
+AMetal-1|net at 26|||S900|pin at 15||-9.5|29|pin at 11||-9.5|14
+AMetal-1|net at 27|||S2700|pin at 17||16|-3.5|contact at 4||16|1
+AN-Active|net at 28|||S900|pin at 12||-16|15|contact at 3||-16|7
+AMetal-1|net at 29|||S900|pin at 18||-24|14|contact at 2||-24|12
+APolysilicon-1|net at 30|||S2700|pin at 13||-17|23|contact at 6||-17|25
+APolysilicon-1|net at 31|||S1800|pin at 14||-20|23|pin at 13||-17|23
+APolysilicon-1|net at 32|||S2700|nmos at 1|poly-right|-20|18.5|pin at 14||-20|23
+AN-Active|net at 33|||RS0|contact at 3||-16|6.5|nmos at 1|diff-top|-16|6.5
+AN-Active|net at 34|||RS0|contact at 2||-24|6.5|nmos at 1|diff-bottom|-24|6.5
+AN-Active|net at 35|||RS0|contact at 5||0|6.5|nmos at 3|diff-bottom|0|6.5
+AN-Active|net at 36|||RS0|contact at 4||16|6.5|nmos at 2|diff-top|16|6.5
+AMetal-1|net at 37|||S1800|pin at 15||-9.5|29|contact at 9||1|29
+AMetal-1|net at 38|||S900|pin at 16||-9.5|41.5|pin at 15||-9.5|29
+AMetal-1|net at 39|||S1800|contact at 11||-12|41.5|pin at 16||-9.5|41.5
+AMetal-1|net at 40|||S0|contact at 7||0|42|contact at 13||0|42
+AMetal-2|net at 41||1|S1800|pin at 19||0|42|contact at 7||0|42
+AMetal-2|net at 42||1|S1800|pin at 20||0|0|contact at 8||0|0
+AP-Active|net at 43|||RS0|contact at 13||0|42.5|pmos at 1|diff-top|0|42.5
+AP-Active|net at 44|||RS0|contact at 12||8|42.5|pmos at 1|diff-bottom|8|42.5
+AMetal-1|net at 45|||S1800|contact at 10||-2.5|21.5|pin at 21||8|21.5
+AMetal-1|net at 46|||S2700|pin at 21||8|21.5|contact at 12||8|38
+APolysilicon-1|net at 47|||S1800|contact at 9||1.5|28.5|pin at 22||4|28.5
+APolysilicon-1|net at 48|||S900|pmos at 1|poly-left|4|30.5|pin at 22||4|28.5
+Ec[4]||D5G2;Y3;|pin at 7||I
+Ec[5]||D5G2;Y3;|pin at 8||I
+Egnd||D5G2;Y-3;|pin at 20||G
+Ein||D5G2;Y1;|pin at 18||I
+Eout||D5G2;|pin at 17||O
+Ev[1]||D5G2;|pin at 5||I
+Evdd||D5G2;Y3;|pin at 19||P
+X
+
+# Cell tool-NCC;1{sch}
+Ctool-NCC;1{sch}||schematic|985703749000|1012003077000||prototype_center()I[8000,0]
+Ngeneric:Facet-Center|art at 0||0|0||||AV
+NGround|gnd at 0||15.5|-14||||
+NTransistor|nmos at 0||1.5|-2|||Y||ATTR_length(D5G1;Y-1.5;)I2|ATTR_width(D5G1;Y-0.5;)I20
+NTransistor|nmos at 1||28.5|-2|||Y||ATTR_length(D5G1;Y-1.5;)I2|ATTR_width(D5G1;Y-0.5;)I20
+NTransistor|nmos at 2||10|-5|||RRR||ATTR_length(D5G1;X-0.5;Y-1.5;)I7|ATTR_width(D5G1;X0.5;Y-1.5;)I3
+NTransistor|nmos at 3||21|-5|||R||ATTR_length(D5G1;X0.5;Y-1.5;)I2|ATTR_width(D5G1;X-0.5;Y-1.5;)I20
+NWire_Pin|pin at 0||8|0||||
+NWire_Pin|pin at 1||8|-12||||
+NWire_Pin|pin at 2||8|18||||
+NWire_Pin|pin at 3||-5.5|0||||
+NWire_Pin|pin at 4||15.5|18||||
+NWire_Pin|pin at 5||23|-12||||
+NWire_Pin|pin at 6||23|18||||
+NWire_Pin|pin at 7||38|0||||
+NWire_Pin|pin at 8||28.5|-7||||
+NWire_Pin|pin at 9||1|7||||
+NWire_Pin|pin at 10||1.5|-7||||
+NWire_Pin|pin at 11||19|11||||
+NWire_Pin|pin at 12||19|-5||||
+NWire_Pin|pin at 13||23|2||||
+NWire_Pin|pin at 14||12|2||||
+NWire_Pin|pin at 15||23|0||||
+NWire_Pin|pin at 16||12|11||||
+NWire_Pin|pin at 17||12|-5||||
+NWire_Pin|pin at 18||8|4||||
+NWire_Pin|pin at 19||19|4||||
+NWire_Pin|pin at 20||1|6||||
+NWire_Pin|pin at 21||8|6||||
+NTransistor|pmos at 0||21|11|||R|2|ATTR_length(D5G1;X0.5;Y-1.5;)I2|ATTR_width(D5G1;X-0.5;Y-1.5;)I20
+NTransistor|pmos at 1||10|11|||RRR|2|ATTR_length(D5G1;X-0.5;Y-1.5;)I5|ATTR_width(D5G1;X0.5;Y-1.5;)I3
+NPower|pwr at 0||15.5|24||||
+Awire|net at 0|||900|pin at 0||8|0|nmos at 2|s|8|-3
+Awire|net at 1|||0|pin at 5||23|-12|gnd at 0||15.5|-12
+Awire|net at 2|||0|nmos at 0|s|-0.5|0|pin at 3||-5.5|0
+Awire|net at 3|||1800|pin at 2||8|18|pin at 4||15.5|18
+Awire|net at 4|||1800|pin at 1||8|-12|gnd at 0||15.5|-12
+Awire|net at 5|||900|nmos at 2|d|8|-7|pin at 1||8|-12
+Awire|net at 6|||2700|pmos at 1|s|8|13|pin at 2||8|18
+Awire|net at 7|||900|pin at 6||23|18|pmos at 0|d|23|13
+Awire|net at 8|||1800|pin at 4||15.5|18|pin at 6||23|18
+Awire|net at 9|||900|pwr at 0||15.5|24|pin at 4||15.5|18
+Awire|net at 10|||0|pin at 0||8|0|nmos at 0|d|3.5|0
+Awire|net at 11|||900|nmos at 0|g|1.5|-3|pin at 10||1.5|-7
+Awire|net at 12|||900|nmos at 3|s|23|-7|pin at 5||23|-12
+Awire|net at 13|||1800|pin at 12||19|-5|nmos at 3|g|20|-5
+Awire|net at 14|||1800|pin at 11||19|11|pmos at 0|g|20|11
+Awire|net at 15|||900|pmos at 0|s|23|9|pin at 13||23|2
+Awire|net at 16|||0|pin at 13||23|2|pin at 14||12|2
+Awire|net at 17|||900|pin at 13||23|2|pin at 15||23|0
+Awire|net at 18|||0|nmos at 1|s|26.5|0|pin at 15||23|0
+Awire|net at 19|||2700|pin at 14||12|2|pin at 16||12|11
+Awire|net at 20|||0|pin at 16||12|11|pmos at 1|g|11|11
+Awire|net at 21|||900|pin at 14||12|2|pin at 17||12|-5
+Awire|net at 22|||0|pin at 17||12|-5|nmos at 2|g|11|-5
+Awire|net at 23|||900|pin at 11||19|11|pin at 19||19|4
+Awire|net at 24|||900|pin at 19||19|4|pin at 12||19|-5
+Awire|net at 25|||900|pin at 18||8|4|pin at 0||8|0
+Awire|net at 26|||0|pin at 19||19|4|pin at 18||8|4
+Awire|net at 27|||2700|nmos at 3|d|23|-3|pin at 15||23|0
+Awire|net at 28|||900|nmos at 1|g|28.5|-3|pin at 8||28.5|-7
+Awire|net at 29|||1800|nmos at 1|d|30.5|0|pin at 7||38|0
+Awire|net at 30|||2700|pin at 20||1|6|pin at 9||1|7
+Awire|net at 31|||900|pmos at 1|d|8|9|pin at 21||8|6
+Awire|net at 32|||900|pin at 21||8|6|pin at 18||8|4
+Awire|net at 33|||1800|pin at 20||1|6|pin at 21||8|6
+Ec[4]||D5G2;Y-1;|pin at 8||I
+Ec[5]||D5G2;Y-1;|pin at 10||I
+Ein||D5G2;X-1;|pin at 3||I
+Eout||D5G2;X1;|pin at 7||O
+Ev[1]||D5G2;Y1;|pin at 9||I
+X
+
+# Cell tool-NCCphotonics;1{lay}
+Ctool-NCCphotonics;1{lay}||photonics|1383759236944|1383848853174|
+Ngeneric:Facet-Center|art at 0||0|0||||AV
+Nm1-n-active-Con|contact at 3||-20.2|1||||
+Nm1-n-active-Con|contact at 4||-34.5|1||||
+Itool-NCCphotonicsLightGate;1{lay}|lightGat at 0||16|1|||D5G4;
+NN-Transistor|nmos at 0||-27|1||||
+NOptical-Corner-90|node at 0||41|35|||X|
+NOptical-Corner-90|node at 1||41|-35|||RR|
+Nm1-Pin|pin at 0||16|-30||||
+Nm1-Pin|pin at 1||-50|-30||||
+Nm1-Pin|pin at 2||50|-30||||
+Nm1-Pin|pin at 4||-34.5|30||||
+Nm1-Pin|pin at 5||50|30||||
+Nm1-Pin|pin at 6||-50|30||||
+Npoly-Pin|pin at 7||-27|-15||||
+Npoly-Pin|pin at 8||-50|-15||||
+NOptical-Pin|pin at 10||60|40||||
+NOptical-Pin|pin at 12||60|-40||||
+Ametal-1|net at 0|||S900|lightGat at 0|g2|16|-24|pin at 0||16|-30
+Ametal-1|net at 1||2.6|S0|pin at 0||16|-30|pin at 1||-50|-30
+Ametal-1|net at 2||2.6|S1800|pin at 0||16|-30|pin at 2||50|-30
+Ametal-1|net at 8||-0.2|S0|lightGat at 0|g1|-5.75|1|contact at 3||-20.2|1
+AN-Active|net at 9|||S1800|nmos at 0|diff-right|-24.2|1|contact at 3||-20.2|1
+AN-Active|net at 10|||S0|nmos at 0|diff-left|-29.8|1|contact at 4||-34.5|1
+Ametal-1|net at 11||1|S2700|contact at 4||-34.5|1|pin at 4||-34.5|30
+Ametal-1|net at 12||2.6|S1800|pin at 4||-34.5|30|pin at 5||50|30
+Ametal-1|net at 13||2.6|S0|pin at 4||-34.5|30|pin at 6||-50|30
+Apoly|net at 14|||S900|nmos at 0|poly-bottom|-27|-4|pin at 7||-27|-15
+Apoly|net at 15|||S0|pin at 7||-27|-15|pin at 8||-50|-15
+AOptical|net at 17|||IJS2700|lightGat at 0|out|36|26|node at 0|c1|36|30
+AOptical|net at 18|||IJS0|pin at 10||60|40|node at 0|c2|46|40
+AOptical|net at 20|||IJS900|lightGat at 0|in|36|-24|node at 1|c1|36|-30
+AOptical|net at 21|||IJS0|pin at 12||60|-40|node at 1|c2|46|-40
+Egnd||D5G4;|pin at 1||G
+ElightIn||D5G4;|pin at 12||I
+ElightOut||D5G4;|pin at 10||O
+Eswitch||D5G4;|pin at 8||I
+Evdd||D5G4;|pin at 6||P
+X
+
+# Cell tool-NCCphotonics;1{sch}
+Ctool-NCCphotonics;1{sch}||schematic|1383758981346|1383761446150|
+NGround|gnd at 0||-13|-6||||
+Itool-NCCphotonicsLightGate;1{ic}|lightGat at 0||0|2|||D5G4;
+NTransistor|nmos at 0||-15|10|||R||ATTR_length(D5G0.5;X-0.5;Y-1;)S2|ATTR_width(D5G1;X0.5;Y-1;)S2
+NWire_Pin|pin at 1||-13|-1||||
+NWire_Pin|pin at 2||-13|5||||
+NWire_Pin|pin at 3||-23|10||||
+NWire_Pin|pin at 4||4|15||||
+NWire_Pin|pin at 5||4|-7||||
+NPower|pwr at 0||-13|17||||
+Awire|net at 1|||2700|gnd at 0||-13|-4|pin at 1||-13|-1
+Awire|net at 2|||0|lightGat at 0|g2|-5|-1|pin at 1||-13|-1
+Awire|net at 3|||900|nmos at 0|s|-13|8|pin at 2||-13|5
+Awire|net at 4|||0|lightGat at 0|g1|-5|5|pin at 2||-13|5
+Awire|net at 5|||900|pwr at 0||-13|17|nmos at 0|d|-13|12
+Awire|net at 6|||0|nmos at 0|g|-16|10|pin at 3||-23|10
+Awire|net at 7|||2700|lightGat at 0|out|4|6|pin at 4||4|15
+Awire|net at 8|||900|lightGat at 0|in|4|-2|pin at 5||4|-7
+ElightIn||D5G2;|pin at 5||I
+ElightOut||D5G2;|pin at 4||O
+Eswitch||D5G2;|pin at 3||I
+X
+
+# Cell tool-NCCphotonicsLightGate;1{ic}
+Ctool-NCCphotonicsLightGate;1{ic}||artwork|1383758861098|1383851204646|E
+NCircle|art at 1||0|0|6|6|||ART_color()I-16777215
+Nschematic:Wire_Pin|pin at 1||-5|3|1|1||
+Nschematic:Wire_Pin|pin at 3||-5|-3|1|1||
+Nschematic:Wire_Pin|pin at 4||4|-4|1|1||
+Nschematic:Wire_Pin|pin at 5||4|4|1|1||
+Nschematic:Wire_Pin|pin at 6||0|3||||
+Nschematic:Wire_Pin|pin at 7||0|-3||||
+Ngeneric:Invisible-Pin|pin at 8||0|0|||||ART_message(D5G1;)SLight Gate
+Nschematic:Wire_Pin|pin at 9||4|0||||
+Nschematic:Wire_Pin|pin at 10||4|0||||
+Aschematic:wire|net at 0|||1800|pin at 1||-5|3|pin at 6||0|3
+Aschematic:wire|net at 1|||1800|pin at 3||-5|-3|pin at 7||0|-3
+Aschematic:wire|net at 3|||900|pin at 5||4|4|pin at 9||4|0
+Aschematic:wire|net at 4|||2700|pin at 4||4|-4|pin at 10||4|0
+Eg1||D5G2;|pin at 1||U
+Eg2||D5G2;|pin at 3||U
+Ein||D5G2;|pin at 4||I
+Eout||D5G2;|pin at 5||O
+X
+
+# Cell tool-NCCphotonicsLightGate;1{lay}
+Ctool-NCCphotonicsLightGate;1{lay}||photonics|1383758403397|1383851335558||ATTR_NCC(D5G3;NTX-17;Y-26;)SblackBox
+Ngeneric:Facet-Center|art at 0||0|0||||AV
+Nm1-p-active-Con|contact at 1||-21.75|0||||
+NRing|node at 0||0|0||||
+NOptical-Pin|pin at 0||20|-25||||
+NOptical-Pin|pin at 1||20|25||||
+Nm1-Pin|pin at 3||0|-25||||
+Ngeneric:Invisible-Pin|pin at 4||-7|26||||V|ART_message(D5G3;)Shttp://phys.org/news4165.html
+NOptical-Pin|pin at 7||20|0||||
+NOptical-Pin|pin at 8||20|0||||
+Nactive-Node|plnode at 1||-4.13|-0.055|39.42|47.99|||trace()V[17.14/15.345,14.865/16.9925,12.335/18.3325,9.7/19.2375,6.95/19.8475,4.095/20.025,1.2775/19.7775,-1.44/19.185,-4.1175/18.17,-6.62/16.745,-8.8925/15.125,-10.91/13.0325,-12.555/10.76,-13.9725/8.2925,-14.8775/5.6575,-15.49/2.9075,-15.73/-0.0225,-15.56/-2.7775,-14.89/-5.5575,-13.9525/-8.1725,-12.59/-10.75,-10.9075/-12.945,-8.955/-14.975,-6.67/-16.7625,-4.14/-18.1025,-1.57/-19.085,1.2575/-19.76,4.05/-20.0125,6.8675/-19.7675,9.66/-19.23 [...]
+Nm1-Node|plnode at 2||0|0|20|20|||trace()V[10/0,9.8/-2,9.2/-3.8,8.3/-5.6,7.1/-7.1,5.5/-8.3,3.8/-9.2,1.9/-9.8,0/-10,-2/-9.8,-3.8/-9.2,-5.6/-8.3,-7.1/-7.1,-8.3/-5.5,-9.2/-3.8,-9.8/-1.9,-10/0,-9.8/2,-9.2/3.8,-8.3/5.6,-7.1/7.1,-5.5/8.3,-3.8/9.2,-1.9/9.8,0/10,2/9.8,3.8/9.2,5.6/8.3,7.1/7.1,8.3/5.5,9.2/3.8,9.8/1.9,10/0]
+Ametal-1|net at 2|||S900|plnode at 2||0|-10|pin at 3||0|-25
+AP-Active|net at 5|||S0|contact at 1||-21.75|0|plnode at 1||-22|0
+AOptical|net at 10|||IJS900|pin at 1||20|25|pin at 7||20|0
+AOptical|net at 11|||IJS2700|pin at 0||20|-25|pin at 8||20|0
+Eg1||D5G3;X-3;|contact at 1||U
+Eg2||D5G3;|pin at 3||U
+Ein||D5G3;|pin at 0||I
+Eout||D5G3;|pin at 1||O
+X
+
+# Cell tool-NCCphotonicsLightGate;2{sch}
+Ctool-NCCphotonicsLightGate;2{sch}||schematic|1383850735323|1383851327039||ATTR_NCC(D5G1;NTY5;)SblackBox
+Ngeneric:Facet-Center|art at 0||0|0||||AV
+NWire_Pin|pin at 0||-9.75|10||||
+NWire_Pin|pin at 1||10|0||||
+NWire_Pin|pin at 2||10|10||||
+NWire_Pin|pin at 3||-10|0||||
+Eg1||D5G3;|pin at 0||U
+Eg2||D5G3;|pin at 3||U
+Ein||D5G3;|pin at 1||I
+Eout||D5G3;|pin at 2||O
+X
+
# Cell tool-PadFrame;1{lay}
Ctool-PadFrame;1{lay}||mocmos|979330051000|985890961000||prototype_center()I[-24000,8400]
Ngeneric:Facet-Center|art at 0||0|0||||AV
@@ -2202,185 +2573,3 @@ Ein1||D5G2;|pin at 0||I
Ein2||D5G2;|pin at 1||I
Eout||D5G2;|pin at 2||O
X
-
-# Cell tool_NCC;1{lay}
-Ctool_NCC;1{lay}||mocmos|986396021000|987906611000||prototype_center()I[0,0]
-Ngeneric:Facet-Center|art at 0||0|0||||AV
-NMetal-1-N-Active-Con|contact at 0||8|8.5||10|YRR|
-NMetal-1-Polysilicon-1-Con|contact at 1||16|24.5||||
-NMetal-1-N-Active-Con|contact at 2||-24|6.5||10|YRR|
-NMetal-1-N-Active-Con|contact at 3||-16|6.5||10|YRR|
-NMetal-1-N-Active-Con|contact at 4||16|6.5||10|YRR|
-NMetal-1-N-Active-Con|contact at 5||0|6.5||10|YRR|
-NMetal-1-Polysilicon-1-Con|contact at 6||-17|24.5||||
-NMetal-1-Metal-2-Con|contact at 7||0|42||||
-NMetal-1-Metal-2-Con|contact at 8||0|0||||
-NMetal-1-Polysilicon-1-Con|contact at 9||1|29||||
-NMetal-1-Polysilicon-1-Con|contact at 10||-2.5|21||||
-NMetal-1-P-Active-Con|contact at 11||-12|42|||R|
-NMetal-1-P-Active-Con|contact at 12||8|42.5||10||
-NMetal-1-P-Active-Con|contact at 13||0|42.5||10||
-NN-Transistor|nmos at 0||-7|15||5|R|
-NN-Transistor|nmos at 1||-20|6.5|17||YRRR|
-NN-Transistor|nmos at 2||12|6.5|17||YRRR|
-NN-Transistor|nmos at 3||4|6.5|17||YRRR|
-NN-Active-Pin|pin at 0||-16|15||||
-NMetal-1-Pin|pin at 1||-16|14||||
-NMetal-1-Pin|pin at 2||0|0||||
-NMetal-1-Pin|pin at 3||0|51||||
-NMetal-1-Pin|pin at 4||-9|14||||
-NMetal-1-Pin|pin at 5||-9|10.5||||
-NPolysilicon-1-Pin|pin at 6||-5.5|21||||
-NMetal-1-Pin|pin at 7||16|24.5||||
-NMetal-1-Pin|pin at 8||-17|24.5||||
-NPolysilicon-1-Pin|pin at 9||15.5|23||||
-NPolysilicon-1-Pin|pin at 10||12|23||||
-NMetal-1-Pin|pin at 11||-9.5|14||||
-NN-Active-Pin|pin at 12||-16|15||||
-NPolysilicon-1-Pin|pin at 13||-17|23||||
-NPolysilicon-1-Pin|pin at 14||-20|23||||
-NMetal-1-Pin|pin at 15||-9.5|29||||
-NMetal-1-Pin|pin at 16||-9.5|41.5||||
-NMetal-1-Pin|pin at 17||16|-3.5||||
-NMetal-1-Pin|pin at 18||-24|14||||
-NMetal-2-Pin|pin at 19||0|42||||
-NMetal-2-Pin|pin at 20||0|0||||
-NMetal-1-Pin|pin at 21||8|21.5||||
-NPolysilicon-1-Pin|pin at 22||4|28.5||||
-NP-Well-Node|plnode at 0||0|7|72|35||A
-NN-Well-Node|plnode at 1||0|42|72|35||A
-NP-Transistor|pmos at 0||-6|42||3|R|
-NP-Transistor|pmos at 1||4|42.5|17||R|
-NMetal-1-N-Well-Con|substr at 0||-8|51||||
-NMetal-1-P-Well-Con|well at 0||-8|0||||
-AP-Active|net at 0|||S0|pmos at 0|diff-top|-11.5|42|contact at 11||-11.5|42
-AP-Active|net at 1|||S0|pmos at 0|diff-bottom|-0.5|42|contact at 13||-0.5|42
-APolysilicon-1|net at 2|||S900|pmos at 0|poly-left|-5.5|38.5|pin at 6||-5.5|21
-APolysilicon-1|net at 3|||S2700|nmos at 0|poly-right|-5.5|18.5|pin at 6||-5.5|21
-AN-Active|net at 4|||S900|pin at 0||-16|15|contact at 3||-16|6.5
-AN-Active|net at 5|||S0|nmos at 0|diff-top|-13.25|15|pin at 0||-16|15
-AN-Active|net at 6|||S900|nmos at 0|diff-bottom|-0.5|15|contact at 5||-0.5|12
-AMetal-1|net at 7|||S2700|contact at 8||0|0.5|contact at 5||0|1
-AMetal-1|net at 8|||S900|pin at 1||-16|14|contact at 3||-16|6.5
-AMetal-1|net at 9|||S0|pin at 11||-9.5|14|pin at 1||-16|14
-AMetal-1|net at 10|||S2700|pin at 2||0|0|contact at 5||0|6.5
-AMetal-1|net at 11|||S1800|well at 0||-8|0|pin at 2||0|0
-AMetal-1|net at 12|||S900|pin at 3||0|51|contact at 13||0|43.5
-AMetal-1|net at 13|||S1800|substr at 0||-8|51|pin at 3||0|51
-AMetal-1|net at 14|||S900|pin at 21||8|21.5|contact at 0||8|14
-AN-Active|net at 15|||RS0|contact at 0||8|8.5|nmos at 3|diff-top|8|8.5
-AN-Active|net at 16|||RS0|contact at 0||8|8.5|nmos at 2|diff-bottom|8|8.5
-AMetal-1|net at 17|||S0|pin at 4||-9|14|pin at 11||-9.5|14
-AMetal-1|net at 18|||S2700|pin at 5||-9|10.5|pin at 4||-9|14
-APolysilicon-1|net at 19|||S900|pin at 22||4|28.5|nmos at 3|poly-right|4|18.5
-APolysilicon-1|net at 20|||S0|contact at 10||-3|21|pin at 6||-5.5|21
-AMetal-1|net at 21|||S1800|pin at 7||16|24.5|contact at 1||16|24.5
-AMetal-1|net at 22|||S0|pin at 8||-17|24.5|contact at 6||-17|24.5
-APolysilicon-1|net at 23|||S2700|pin at 9||15.5|23|contact at 1||15.5|24
-APolysilicon-1|net at 24|||S1800|pin at 10||12|23|pin at 9||15.5|23
-APolysilicon-1|net at 25|||S2700|nmos at 2|poly-right|12|18.5|pin at 10||12|23
-AMetal-1|net at 26|||S900|pin at 15||-9.5|29|pin at 11||-9.5|14
-AMetal-1|net at 27|||S2700|pin at 17||16|-3.5|contact at 4||16|1
-AN-Active|net at 28|||S900|pin at 12||-16|15|contact at 3||-16|7
-AMetal-1|net at 29|||S900|pin at 18||-24|14|contact at 2||-24|12
-APolysilicon-1|net at 30|||S2700|pin at 13||-17|23|contact at 6||-17|25
-APolysilicon-1|net at 31|||S1800|pin at 14||-20|23|pin at 13||-17|23
-APolysilicon-1|net at 32|||S2700|nmos at 1|poly-right|-20|18.5|pin at 14||-20|23
-AN-Active|net at 33|||RS0|contact at 3||-16|6.5|nmos at 1|diff-top|-16|6.5
-AN-Active|net at 34|||RS0|contact at 2||-24|6.5|nmos at 1|diff-bottom|-24|6.5
-AN-Active|net at 35|||RS0|contact at 5||0|6.5|nmos at 3|diff-bottom|0|6.5
-AN-Active|net at 36|||RS0|contact at 4||16|6.5|nmos at 2|diff-top|16|6.5
-AMetal-1|net at 37|||S1800|pin at 15||-9.5|29|contact at 9||1|29
-AMetal-1|net at 38|||S900|pin at 16||-9.5|41.5|pin at 15||-9.5|29
-AMetal-1|net at 39|||S1800|contact at 11||-12|41.5|pin at 16||-9.5|41.5
-AMetal-1|net at 40|||S0|contact at 7||0|42|contact at 13||0|42
-AMetal-2|net at 41||1|S1800|pin at 19||0|42|contact at 7||0|42
-AMetal-2|net at 42||1|S1800|pin at 20||0|0|contact at 8||0|0
-AP-Active|net at 43|||RS0|contact at 13||0|42.5|pmos at 1|diff-top|0|42.5
-AP-Active|net at 44|||RS0|contact at 12||8|42.5|pmos at 1|diff-bottom|8|42.5
-AMetal-1|net at 45|||S1800|contact at 10||-2.5|21.5|pin at 21||8|21.5
-AMetal-1|net at 46|||S2700|pin at 21||8|21.5|contact at 12||8|38
-APolysilicon-1|net at 47|||S1800|contact at 9||1.5|28.5|pin at 22||4|28.5
-APolysilicon-1|net at 48|||S900|pmos at 1|poly-left|4|30.5|pin at 22||4|28.5
-Ec[4]||D5G2;Y3;|pin at 7||I
-Ec[5]||D5G2;Y3;|pin at 8||I
-Egnd||D5G2;Y-3;|pin at 20||G
-Ein||D5G2;Y1;|pin at 18||I
-Eout||D5G2;|pin at 17||O
-Ev[1]||D5G2;|pin at 5||I
-Evdd||D5G2;Y3;|pin at 19||P
-X
-
-# Cell tool_NCC;1{sch}
-Ctool_NCC;1{sch}||schematic|985703749000|1012003077000||prototype_center()I[8000,0]
-Ngeneric:Facet-Center|art at 0||0|0||||AV
-NGround|gnd at 0||15.5|-14||||
-NTransistor|nmos at 0||1.5|-2|||Y||ATTR_length(D5G1;Y-1.5;)I2|ATTR_width(D5G1;Y-0.5;)I20
-NTransistor|nmos at 1||28.5|-2|||Y||ATTR_length(D5G1;Y-1.5;)I2|ATTR_width(D5G1;Y-0.5;)I20
-NTransistor|nmos at 2||10|-5|||RRR||ATTR_length(D5G1;X-0.5;Y-1.5;)I7|ATTR_width(D5G1;X0.5;Y-1.5;)I3
-NTransistor|nmos at 3||21|-5|||R||ATTR_length(D5G1;X0.5;Y-1.5;)I2|ATTR_width(D5G1;X-0.5;Y-1.5;)I20
-NWire_Pin|pin at 0||8|0||||
-NWire_Pin|pin at 1||8|-12||||
-NWire_Pin|pin at 2||8|18||||
-NWire_Pin|pin at 3||-5.5|0||||
-NWire_Pin|pin at 4||15.5|18||||
-NWire_Pin|pin at 5||23|-12||||
-NWire_Pin|pin at 6||23|18||||
-NWire_Pin|pin at 7||38|0||||
-NWire_Pin|pin at 8||28.5|-7||||
-NWire_Pin|pin at 9||1|7||||
-NWire_Pin|pin at 10||1.5|-7||||
-NWire_Pin|pin at 11||19|11||||
-NWire_Pin|pin at 12||19|-5||||
-NWire_Pin|pin at 13||23|2||||
-NWire_Pin|pin at 14||12|2||||
-NWire_Pin|pin at 15||23|0||||
-NWire_Pin|pin at 16||12|11||||
-NWire_Pin|pin at 17||12|-5||||
-NWire_Pin|pin at 18||8|4||||
-NWire_Pin|pin at 19||19|4||||
-NWire_Pin|pin at 20||1|6||||
-NWire_Pin|pin at 21||8|6||||
-NTransistor|pmos at 0||21|11|||R|2|ATTR_length(D5G1;X0.5;Y-1.5;)I2|ATTR_width(D5G1;X-0.5;Y-1.5;)I20
-NTransistor|pmos at 1||10|11|||RRR|2|ATTR_length(D5G1;X-0.5;Y-1.5;)I5|ATTR_width(D5G1;X0.5;Y-1.5;)I3
-NPower|pwr at 0||15.5|24||||
-Awire|net at 0|||900|pin at 0||8|0|nmos at 2|s|8|-3
-Awire|net at 1|||0|pin at 5||23|-12|gnd at 0||15.5|-12
-Awire|net at 2|||0|nmos at 0|s|-0.5|0|pin at 3||-5.5|0
-Awire|net at 3|||1800|pin at 2||8|18|pin at 4||15.5|18
-Awire|net at 4|||1800|pin at 1||8|-12|gnd at 0||15.5|-12
-Awire|net at 5|||900|nmos at 2|d|8|-7|pin at 1||8|-12
-Awire|net at 6|||2700|pmos at 1|s|8|13|pin at 2||8|18
-Awire|net at 7|||900|pin at 6||23|18|pmos at 0|d|23|13
-Awire|net at 8|||1800|pin at 4||15.5|18|pin at 6||23|18
-Awire|net at 9|||900|pwr at 0||15.5|24|pin at 4||15.5|18
-Awire|net at 10|||0|pin at 0||8|0|nmos at 0|d|3.5|0
-Awire|net at 11|||900|nmos at 0|g|1.5|-3|pin at 10||1.5|-7
-Awire|net at 12|||900|nmos at 3|s|23|-7|pin at 5||23|-12
-Awire|net at 13|||1800|pin at 12||19|-5|nmos at 3|g|20|-5
-Awire|net at 14|||1800|pin at 11||19|11|pmos at 0|g|20|11
-Awire|net at 15|||900|pmos at 0|s|23|9|pin at 13||23|2
-Awire|net at 16|||0|pin at 13||23|2|pin at 14||12|2
-Awire|net at 17|||900|pin at 13||23|2|pin at 15||23|0
-Awire|net at 18|||0|nmos at 1|s|26.5|0|pin at 15||23|0
-Awire|net at 19|||2700|pin at 14||12|2|pin at 16||12|11
-Awire|net at 20|||0|pin at 16||12|11|pmos at 1|g|11|11
-Awire|net at 21|||900|pin at 14||12|2|pin at 17||12|-5
-Awire|net at 22|||0|pin at 17||12|-5|nmos at 2|g|11|-5
-Awire|net at 23|||900|pin at 11||19|11|pin at 19||19|4
-Awire|net at 24|||900|pin at 19||19|4|pin at 12||19|-5
-Awire|net at 25|||900|pin at 18||8|4|pin at 0||8|0
-Awire|net at 26|||0|pin at 19||19|4|pin at 18||8|4
-Awire|net at 27|||2700|nmos at 3|d|23|-3|pin at 15||23|0
-Awire|net at 28|||900|nmos at 1|g|28.5|-3|pin at 8||28.5|-7
-Awire|net at 29|||1800|nmos at 1|d|30.5|0|pin at 7||38|0
-Awire|net at 30|||2700|pin at 20||1|6|pin at 9||1|7
-Awire|net at 31|||900|pmos at 1|d|8|9|pin at 21||8|6
-Awire|net at 32|||900|pin at 21||8|6|pin at 18||8|4
-Awire|net at 33|||1800|pin at 20||1|6|pin at 21||8|6
-Ec[4]||D5G2;Y-1;|pin at 8||I
-Ec[5]||D5G2;Y-1;|pin at 10||I
-Ein||D5G2;X-1;|pin at 3||I
-Eout||D5G2;X1;|pin at 7||O
-Ev[1]||D5G2;Y1;|pin at 9||I
-X
diff --git a/com/sun/electric/tool/user/help/helphtml/title.html b/com/sun/electric/tool/user/help/helphtml/title.html
index 4d8f8a0..208384d 100644
--- a/com/sun/electric/tool/user/help/helphtml/title.html
+++ b/com/sun/electric/tool/user/help/helphtml/title.html
@@ -1,8 +1,8 @@
<HTML><HEAD>
-<TITLE>Using the Electric VLSI Design System, version 9.06</TITLE></HEAD>
+<TITLE>Using the Electric VLSI Design System, version 9.07</TITLE></HEAD>
<BODY BGCOLOR="#FFFFFF">
<FONT SIZE="6"><B>
-<CENTER>Electric User's Manual, version 9.06</CENTER>
+<CENTER>Electric User's Manual, version 9.07</CENTER>
</B></FONT>
<P>
<CENTER>
@@ -13,15 +13,14 @@
<TD ROWSPAN="2"><IMG SRC="iconplug.png" ALT="icon"></TD>
</TR>
<TR>
- <TD><FONT SIZE="4"><B><CENTER>May 18, 2015</CENTER></B></FONT></TD>
+ <TD><FONT SIZE="4"><B><CENTER>November 1, 2016</CENTER></B></FONT></TD>
</TR>
</TABLE>
<P>
<IMG SRC="screenshotbusy.png" ALT="design example">
</CENTER>
<HR>
-Copyright (c) 2015 <A HREF="http://www.oracle.com">Oracle</A> and
-<A HREF="http://www.staticfreesoft.com">Static Free Software</A>.
+Copyright (c) 2016 <A HREF="http://www.staticfreesoft.com">Static Free Software</A>.
<P>
Permission is granted to make and distribute verbatim copies of this manual
provided the copyright notice and this permission notice are preserved on all
diff --git a/com/sun/electric/tool/user/help/helphtml/toc.txt b/com/sun/electric/tool/user/help/helphtml/toc.txt
index d13633b..b42f78a 100644
--- a/com/sun/electric/tool/user/help/helphtml/toc.txt
+++ b/com/sun/electric/tool/user/help/helphtml/toc.txt
@@ -7,9 +7,9 @@ Introduction
Building Electric from Source Code
Introduction to Source Code =chap01-04-01
Source code in the JAR Files =chap01-04-02
- Command-line Access to the java.net Repository =chap01-04-03
- Netbeans Access to the java.net Repository =chap01-04-04
- Eclipse Access to the java.net Repository =chap01-04-05
+ Command-line Access to the savannah.gnu.org Repository =chap01-04-03
+ Netbeans Access to the savannah.gnu.org Repository =chap01-04-04
+ Eclipse Access to the savannah.gnu.org Repository =chap01-04-05
Plug-Ins =chap01-05
Fundamental Concepts =chap01-06
The Display =chap01-07
diff --git a/com/sun/electric/tool/user/menus/CellMenu.java b/com/sun/electric/tool/user/menus/CellMenu.java
index c9bde80..50291f2 100644
--- a/com/sun/electric/tool/user/menus/CellMenu.java
+++ b/com/sun/electric/tool/user/menus/CellMenu.java
@@ -4,7 +4,7 @@
*
* File: CellMenu.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -21,9 +21,9 @@
*/
package com.sun.electric.tool.user.menus;
-import com.sun.electric.database.EditingPreferences;
import static com.sun.electric.tool.user.menus.EMenuItem.SEPARATOR;
+import com.sun.electric.database.EditingPreferences;
import com.sun.electric.database.geometry.EPoint;
import com.sun.electric.database.geometry.ERectangle;
import com.sun.electric.database.hierarchy.Cell;
@@ -73,6 +73,8 @@ import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
import javax.swing.JButton;
import javax.swing.JLabel;
@@ -508,7 +510,7 @@ public class CellMenu {
GeometrySearch search = new GeometrySearch(curEdit.getLayerVisibility(), curEdit.getGraphicsPreferences());
List<GeometrySearch.GeometrySearchResult> possibleTargets = search.searchGeometries(cell, point, true);
- // eliminate results at the top level and duplicate results at any lower level
+ // eliminate results at the top level
for(int i=0; i<possibleTargets.size(); i++)
{
GeometrySearch.GeometrySearchResult res = possibleTargets.get(i);
@@ -521,17 +523,21 @@ public class CellMenu {
}
// also remove duplicate contexts at lower levels
- for(int j=0; j<i; j++)
+final boolean JUSTONEATALEVEL = false;
+ if (JUSTONEATALEVEL)
{
- GeometrySearch.GeometrySearchResult oRes = possibleTargets.get(j);
- if (sameContext(oRes.getContext(), res.getContext()))
+ for(int j=0; j<i; j++)
{
- possibleTargets.remove(i);
- i--;
+ GeometrySearch.GeometrySearchResult oRes = possibleTargets.get(j);
+ if (sameContext(oRes.getContext(), res.getContext()))
+ {
+ possibleTargets.remove(i);
+ i--;
+ }
}
}
}
-
+
// give error if nothing was found
if (possibleTargets.size() == 0)
{
@@ -548,16 +554,32 @@ public class CellMenu {
descendToObject(possibleTargets.get(0));
} else
{
- // let the user choose
- JPopupMenu menu = new JPopupMenu();
+ // let the user choose, sort by the lower level
+ Map<String,List<GeometrySearch.GeometrySearchResult>> levelMap = new TreeMap<String,List<GeometrySearch.GeometrySearchResult>>();
+ for(GeometrySearch.GeometrySearchResult res : possibleTargets)
+ {
+ String resDescript = res.getInstPath(res.getContext());
+ List<GeometrySearch.GeometrySearchResult> itemsAtLevel = levelMap.get(resDescript);
+ if (itemsAtLevel == null) levelMap.put(resDescript, itemsAtLevel = new ArrayList<GeometrySearch.GeometrySearchResult>());
+ itemsAtLevel.add(res);
+ }
+
+ JPopupMenu menu = new JPopupMenu();
JMenuItem menuItem = new JMenuItem("Multiple objects under the cursor...choose one");
menu.add(menuItem);
menu.addSeparator();
- for(GeometrySearch.GeometrySearchResult res : possibleTargets)
+ for(String resDescript : levelMap.keySet())
{
- menuItem = new JMenuItem(res.describe());
- menuItem.addActionListener(new DownHierToObjectActionListener(res));
+ List<GeometrySearch.GeometrySearchResult> itemsAtLevel = levelMap.get(resDescript);
+ menuItem = new JMenuItem("ITEMS IN: " + resDescript);
+ menuItem.setEnabled(false);
menu.add(menuItem);
+ for(GeometrySearch.GeometrySearchResult res : itemsAtLevel)
+ {
+ menuItem = new JMenuItem(" " + res.getGeometric().describe(false));
+ menuItem.addActionListener(new DownHierToObjectActionListener(res));
+ menu.add(menuItem);
+ }
}
menu.show(curEdit, 100, 100);
}
diff --git a/com/sun/electric/tool/user/menus/EMenu.java b/com/sun/electric/tool/user/menus/EMenu.java
index a349f92..107f635 100644
--- a/com/sun/electric/tool/user/menus/EMenu.java
+++ b/com/sun/electric/tool/user/menus/EMenu.java
@@ -4,7 +4,7 @@
*
* File: EMenu.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/menus/EMenuBar.java b/com/sun/electric/tool/user/menus/EMenuBar.java
index 8320ae4..ed73e13 100644
--- a/com/sun/electric/tool/user/menus/EMenuBar.java
+++ b/com/sun/electric/tool/user/menus/EMenuBar.java
@@ -4,7 +4,7 @@
*
* File: EMenuBar.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/menus/EMenuItem.java b/com/sun/electric/tool/user/menus/EMenuItem.java
index 110dbb6..d9d13fa 100644
--- a/com/sun/electric/tool/user/menus/EMenuItem.java
+++ b/com/sun/electric/tool/user/menus/EMenuItem.java
@@ -4,7 +4,7 @@
*
* File: EMenuItem.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/menus/EditMenu.java b/com/sun/electric/tool/user/menus/EditMenu.java
index 8102c2f..16e441a 100644
--- a/com/sun/electric/tool/user/menus/EditMenu.java
+++ b/com/sun/electric/tool/user/menus/EditMenu.java
@@ -4,7 +4,7 @@
*
* File: EditMenu.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -27,6 +27,7 @@ import com.sun.electric.database.EditingPreferences;
import com.sun.electric.database.change.DatabaseChangeEvent;
import com.sun.electric.database.change.Undo;
import com.sun.electric.database.geometry.EPoint;
+import com.sun.electric.database.geometry.ScreenPoint;
import com.sun.electric.database.hierarchy.Cell;
import com.sun.electric.database.hierarchy.Export;
import com.sun.electric.database.hierarchy.Library;
@@ -51,6 +52,7 @@ import com.sun.electric.tool.Job;
import com.sun.electric.tool.JobException;
import com.sun.electric.tool.io.FileType;
import com.sun.electric.tool.io.IOTool;
+import com.sun.electric.tool.io.output.GDS;
import com.sun.electric.tool.sandbox.TechExplorerDriver;
import com.sun.electric.tool.user.ActivityLogger;
import com.sun.electric.tool.user.CircuitChangeJobs;
@@ -99,8 +101,12 @@ import com.sun.electric.tool.user.ui.WindowFrame;
import com.sun.electric.tool.user.waveform.WaveformWindow;
import com.sun.electric.util.math.DBMath;
+import java.awt.Component;
import java.awt.Dimension;
+import java.awt.Point;
import java.awt.Toolkit;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
@@ -114,7 +120,9 @@ import java.util.Iterator;
import java.util.List;
import java.util.Set;
+import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
+import javax.swing.JPopupMenu;
import javax.swing.KeyStroke;
/**
@@ -310,7 +318,7 @@ public class EditMenu {
ToolBar.modesSubMenu, // O
- // mnemonic keys available: AB GH JKLMNOPQRS UVWXYZ
+ // mnemonic keys available: AB JKLMNOPQRS UVWXYZ
new EMenu("Te_xt",
new EMenuItem("_Find Text...", 'L') { public void run() {
FindText.findTextDialog(); }},
@@ -322,6 +330,10 @@ public class EditMenu {
changeGlobalTextSize(0.8); }},
new EMenuItem("Add _Text Annotation", KeyStroke.getKeyStroke('T', 0)) { public void run() {
PaletteFrame.placeInstance("ART_message", null, false); }},
+ new EMenuItem("Add _GDS Text") { public void run() {
+ addGDSText(false); }},
+ new EMenuItem("Add _HV GDS Text") { public void run() {
+ addGDSText(true); }},
new EMenuItem("Edit Text Cell _Externally...") { public void run() {
ExternalEditing.editExternally(); }}),
@@ -430,7 +442,7 @@ public class EditMenu {
new EMenuItem("Technology Creation _Wizard...") { public void run() {
TechEditWizard.techEditWizardCommand(); }}),
- // mnemonic keys available: F K Q Z
+ // mnemonic keys available: Q Z
new EMenu("_Selection",
new EMenuItem("Sele_ct All", 'A') { public void run() {
selectAllCommand(); }},
@@ -450,10 +462,12 @@ public class EditMenu {
SEPARATOR,
new EMenuItem("Select O_bject...") { public void run() {
SelectObject.selectObjectDialog(null, false); }},
+ new EMenuItem("Select Object Unde_r Cursor...", KeyStroke.getKeyStroke('U', 0)) { public void run() {
+ selectObjectUnderCursor(); }},
new EMenuItem("Deselect All _Arcs") { public void run() {
deselectAllArcsCommand(); }},
SEPARATOR,
- new EMenuItem("Make Selected Eas_y") { public void run() {
+ new EMenuItem("Ma_ke Selected Easy") { public void run() {
selectMakeEasyCommand(); }},
new EMenuItem("Make Selected Har_d") { public void run() {
selectMakeHardCommand(); }},
@@ -476,7 +490,7 @@ public class EditMenu {
showNextErrorCommand(false); }},
new EMenuItem("Show Previous Error, sa_me Window", KeyStroke.getKeyStroke('[')) { public void run() {
showPrevErrorCommand(false); }},
- new EMenuItem("Show Single Geometry", KeyStroke.getKeyStroke(KeyEvent.VK_SLASH, 0)) { public void run() {
+ new EMenuItem("Show Single Geometr_y", KeyStroke.getKeyStroke(KeyEvent.VK_SLASH, 0)) { public void run() {
showSingleGeometryCommand(); }},
new EMenuItem("Show Current Co_llection of Errors") { public void run() {
ErrorLoggerTree.showCurrentErrors(); }},
@@ -485,7 +499,7 @@ public class EditMenu {
addToWaveformNewCommand(); }},
new EMenuItem("Add to _Waveform in Current Panel", KeyStroke.getKeyStroke('O', 0)) { public void run() {
addToWaveformCurrentCommand(); }},
- new EMenuItem("_Remove from Waveform", KeyStroke.getKeyStroke('R', 0)) { public void run() {
+ new EMenuItem("Remove _from Waveform", KeyStroke.getKeyStroke('R', 0)) { public void run() {
removeFromWaveformCommand(); }}));
}
@@ -795,6 +809,50 @@ public class EditMenu {
}
/**
+ * Method to add GDS text to the selected object.
+ */
+ public static void addGDSText(boolean highV)
+ {
+ EditWindow wnd = EditWindow.needCurrent();
+ if (wnd == null) return;
+ Highlighter high = wnd.getHighlighter();
+ Highlight h = high.getOneHighlight();
+ if (h == null) return;
+ ElectricObject obj = h.getElectricObject();
+ if (obj == null) return;
+ if (obj instanceof PortInst)
+ obj = ((PortInst)obj).getNodeInst();
+ new AddGDSText(obj, highV);
+ }
+
+ private static class AddGDSText extends Job
+ {
+ private ElectricObject obj;
+ private boolean highV;
+
+ AddGDSText(ElectricObject obj, boolean highV)
+ {
+ super("Add GDS Text", User.getUserTool(), Job.Type.CHANGE, null, null, Job.Priority.USER);
+ this.obj = obj;
+ this.highV = highV;
+ startJob();
+ }
+
+ @Override
+ public boolean doIt() throws JobException
+ {
+ if (highV)
+ {
+ obj.newDisplayVar(GDS.GDS_TEXT_HV_KEY, "GDS HV Text", getEditingPreferences());
+ } else
+ {
+ obj.newDisplayVar(GDS.GDS_TEXT_KEY, "GDS Text", getEditingPreferences());
+ }
+ return true;
+ }
+ }
+
+ /**
* This method implements the command to highlight all objects in the current Cell.
*/
public static void selectAllCommand()
@@ -1216,6 +1274,49 @@ public class EditMenu {
}
/**
+ * Command to popup a list of objects under the cursor and let the user choose one to select.
+ */
+ private static JPopupMenu selectUnderCursorMenu = null;
+ private static Highlighter selectUnderCursorHighlighter = null;
+
+ public static void selectObjectUnderCursor()
+ {
+ EditWindow wnd = EditWindow.needCurrent();
+ if (wnd == null) return;
+ Point pt = wnd.getLastMousePosition();
+ Point2D center = wnd.screenToDatabase(pt.x, pt.y);
+ selectUnderCursorHighlighter = wnd.getHighlighter();
+ Rectangle2D bounds = new Rectangle2D.Double(center.getX(), center.getY(), 0, 0);
+ boolean findSpecial = ToolBar.isSelectSpecial();
+ List<Highlight> underCursor = Highlighter.findAllInArea(selectUnderCursorHighlighter, wnd.getCell(), false, false, false, findSpecial, false, bounds, wnd);
+ boolean empty = underCursor.isEmpty();
+
+ selectUnderCursorMenu = new JPopupMenu("Select Object");
+
+ JMenuItem menuItemGetInfo = new JMenuItem(empty ? "Nothing Under Cursor To Select" : "Object to Select:");
+ selectUnderCursorMenu.add(menuItemGetInfo);
+ if (!empty) selectUnderCursorMenu.addSeparator();
+
+ for(Highlight h : underCursor)
+ {
+ final Geometric geom = h.getGeometric();
+ menuItemGetInfo = new JMenuItem(geom.describe(false));
+ menuItemGetInfo.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { showItem(geom); } });
+ selectUnderCursorMenu.add(menuItemGetInfo);
+ }
+
+ selectUnderCursorMenu.show(wnd.getPanel().getComponentAt((int)pt.x, (int)pt.y), (int)pt.x, (int)pt.y);
+ }
+
+ private static void showItem(Geometric geom)
+ {
+ selectUnderCursorHighlighter.clear();
+ selectUnderCursorHighlighter.addElectricObject(geom, geom.getParent());
+ selectUnderCursorHighlighter.finished();
+ selectUnderCursorMenu = null;
+ }
+
+ /**
* This method implements the command to highlight nothing in the current Cell.
*/
public static void selectNothingCommand()
diff --git a/com/sun/electric/tool/user/menus/ExportMenu.java b/com/sun/electric/tool/user/menus/ExportMenu.java
index 2482a89..01b6859 100644
--- a/com/sun/electric/tool/user/menus/ExportMenu.java
+++ b/com/sun/electric/tool/user/menus/ExportMenu.java
@@ -4,7 +4,7 @@
*
* File: ExportMenu.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/menus/FileMenu.java b/com/sun/electric/tool/user/menus/FileMenu.java
index c56461a..0abf244 100644
--- a/com/sun/electric/tool/user/menus/FileMenu.java
+++ b/com/sun/electric/tool/user/menus/FileMenu.java
@@ -4,7 +4,7 @@
*
* File: FileMenu.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -243,6 +243,8 @@ public class FileMenu {
exportCommand(FileType.TELESIS, false); }},
new EMenuItem("DFTM...") { public void run() {
exportCommand(FileType.DFTM, false); }},
+ new EMenuItem("Flattened Rectangles...") { public void run() {
+ exportCommand(FileType.FLATRECT, false); }},
SEPARATOR,
new EMenuItem("_Text Cell Contents...") { public void run() {
TextWindow.writeTextCell(); }},
@@ -443,6 +445,7 @@ public class FileMenu {
public static void openLibraryCommand(URL file)
{
String fileName = file.getFile();
+ if (fileName.endsWith("/")) fileName = fileName.substring(0, fileName.length()-1);
FileType defType = getLibraryFormat(fileName, null);
if (defType == null) {
// no valid extension, search for file with extension
@@ -479,7 +482,7 @@ public class FileMenu {
if (defType == null) defType = FileType.DEFAULTLIB;
File f = new File(file.getPath());
if (defType != FileType.DELIB && f.isDirectory())
- System.out.println("The filename provided is not a valid Electric's library: '" +
+ System.out.println("The filename provided is not a valid Electric library: '" +
fileName + "'.");
else
new ReadLibrary(file, defType, TextUtils.getFilePath(file), null, null, null);
@@ -581,7 +584,7 @@ public class FileMenu {
}
// read project preferences
if (projsettings != null)
- ProjSettings.readSettings(projsettings, getDatabase(), false);
+ ProjSettings.readSettings(projsettings, getDatabase(), false, false);
HashSet<Library> oldLibs = new HashSet<Library>();
for (Iterator<Library> it = getDatabase().getLibraries(); it.hasNext(); )
oldLibs.add(it.next());
@@ -1191,7 +1194,7 @@ public class FileMenu {
}
public static class RenameAndSaveLibraryTask implements Serializable {
- private LibId libId;
+ private LibId libId;
private String newName;
private FileType type;
private boolean compatibleWith6;
@@ -1215,6 +1218,8 @@ public class FileMenu {
return new RenameAndSaveLibraryTask(lib, newName, type, compatibleWith6, backupScheme);
}
+ public LibId getLidId() { return libId; }
+
public IdMapper renameAndSave() throws JobException {
IdMapper idMapper = null;
boolean success = false;
@@ -1541,7 +1546,7 @@ public class FileMenu {
Rectangle2D cellBounds = ep.getRenderArea();
if (cellBounds == null) cellBounds = cell.getBounds();
LayerVisibility lv = new LayerVisibility(true);
- BufferedImage img = EditWindow.getPrintImageFromData(ep, null, cellBounds, cell, null, lv);
+ BufferedImage img = EditWindow.getPrintImageFromData(ep, null, cellBounds, cell, null, lv, true);
PNG.writeImage(img, filePath);
} else
{
diff --git a/com/sun/electric/tool/user/menus/HelpMenu.java b/com/sun/electric/tool/user/menus/HelpMenu.java
index c650084..b9a94ce 100644
--- a/com/sun/electric/tool/user/menus/HelpMenu.java
+++ b/com/sun/electric/tool/user/menus/HelpMenu.java
@@ -4,7 +4,7 @@
*
* File: HelpMenu.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/menus/MenuCommands.java b/com/sun/electric/tool/user/menus/MenuCommands.java
index 262fdab..f677a28 100644
--- a/com/sun/electric/tool/user/menus/MenuCommands.java
+++ b/com/sun/electric/tool/user/menus/MenuCommands.java
@@ -4,7 +4,7 @@
*
* File: MenuCommands.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -33,6 +33,7 @@ import com.sun.electric.database.topology.Geometric;
import com.sun.electric.database.topology.NodeInst;
import com.sun.electric.tool.Job;
import com.sun.electric.tool.user.Highlighter;
+import com.sun.electric.tool.user.tests.TestMenu;
import com.sun.electric.tool.user.ui.ClickZoomWireListener;
import com.sun.electric.tool.user.ui.WindowFrame;
import com.sun.electric.util.CollectionFactory;
@@ -78,7 +79,7 @@ public final class MenuCommands {
itemsList.add(ViewMenu.makeMenu());
itemsList.add(WindowMenu.makeMenu());
itemsList.add(ToolMenu.makeMenu());
- itemsList.add(makeExtraMenu("menus.SunAsyncMenu"));
+ itemsList.add(makeExtraMenu("menus.SunAsyncMenu", true));
itemsList.add(HelpMenu.makeMenu());
if (Job.getDebug())
itemsList.addAll(makeTestMenus());
@@ -99,7 +100,7 @@ public final class MenuCommands {
private static List<EMenuItem> makeTestMenus() {
List<EMenuItem> list = new ArrayList<EMenuItem>(5);
- list.add(makeExtraMenu("tests.TestMenu"));
+ if (Job.getDebug()) list.add(TestMenu.makeMenu());
list.add(PublicDebugMenu.makeMenu());
// Adding developers menus. They are accessed by DevelopersMenus
@@ -115,7 +116,14 @@ public final class MenuCommands {
return list;
}
- static EMenu makeExtraMenu(String plugin) {
+ /**
+ * Method to create a menu associated with a plugin
+ * @param plugin name of the plugin
+ * @param printException true if ClassNotFoundException should be printed
+ * in debug mode.
+ * @return EMenu for the plugin
+ */
+ static EMenu makeExtraMenu(String plugin, boolean printClassError) {
try {
Class<?> menuClass = Class.forName("com.sun.electric.plugins." + plugin);
java.lang.reflect.Method makeMenu = menuClass.getMethod("makeMenu"); // varargs
@@ -124,7 +132,12 @@ public final class MenuCommands {
if (Job.getDebug())
{
System.out.println("Can't find plugin class '" + plugin + "' for menu option");
- e.printStackTrace();
+ }
+ return null;
+ } catch (ClassNotFoundException e) {
+ if (Job.getDebug() && printClassError)
+ {
+ System.out.println("Can't find plugin class '" + plugin + "' for menu option");
}
return null;
} catch (Exception e) {
diff --git a/com/sun/electric/tool/user/menus/PublicDebugMenu.java b/com/sun/electric/tool/user/menus/PublicDebugMenu.java
index f848299..4c06397 100644
--- a/com/sun/electric/tool/user/menus/PublicDebugMenu.java
+++ b/com/sun/electric/tool/user/menus/PublicDebugMenu.java
@@ -4,7 +4,7 @@
*
* File: PublicDebugMenu.java
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/menus/ToolMenu.java b/com/sun/electric/tool/user/menus/ToolMenu.java
index 814a7c4..ef558b1 100644
--- a/com/sun/electric/tool/user/menus/ToolMenu.java
+++ b/com/sun/electric/tool/user/menus/ToolMenu.java
@@ -4,7 +4,7 @@
*
* File: ToolMenu.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -865,6 +865,9 @@ public class ToolMenu {
}
}),
+
+ MenuCommands.makeExtraMenu("pcell.gui.MainMenu", false),
+
// ------------------- Information and Language Interpreters
SEPARATOR,
@@ -2319,7 +2322,7 @@ public class ToolMenu {
public static void setDynamicLanguageMenu() {
for (EMenuBar.Instance menuBarInstance : TopLevel.getMenuBars()) {
JMenu menu = (JMenu) menuBarInstance.findMenuItem(languageMenu.getPath());
- while (menu.getMenuComponentCount() > 3)
+ while (menu.getMenuComponentCount() > 4)
menu.remove(menu.getMenuComponentCount() - 1);
for (LanguageScripts.ScriptBinding script : LanguageScripts.getScripts()) {
@@ -2345,7 +2348,7 @@ public class ToolMenu {
}
}
- private static class DynamicLanguageMenuItem extends EMenuItem {
+ public static class DynamicLanguageMenuItem extends EMenuItem {
private String fileName;
private FileType type;
diff --git a/com/sun/electric/tool/user/menus/ViewMenu.java b/com/sun/electric/tool/user/menus/ViewMenu.java
index 8606dda..deda57e 100644
--- a/com/sun/electric/tool/user/menus/ViewMenu.java
+++ b/com/sun/electric/tool/user/menus/ViewMenu.java
@@ -4,7 +4,7 @@
*
* File: ViewMenu.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/menus/WindowMenu.java b/com/sun/electric/tool/user/menus/WindowMenu.java
index 11ee2cf..15226b5 100644
--- a/com/sun/electric/tool/user/menus/WindowMenu.java
+++ b/com/sun/electric/tool/user/menus/WindowMenu.java
@@ -4,7 +4,7 @@
*
* File: WindowMenu.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -405,7 +405,7 @@ public class WindowMenu {
new EMenuItem("Set F_ont...") { public void run() {
MessagesWindow.selectFont(); }}),
- MenuCommands.makeExtraMenu("j3d.ui.J3DMenu"),
+ MenuCommands.makeExtraMenu("j3d.ui.J3DMenu", true),
// mnemonic keys available: ABCDEFGHIJK MNOPQ STUVWXYZ
new EMenu("Side _Bar",
diff --git a/com/sun/electric/tool/user/ncc/ComparisonsPane.java b/com/sun/electric/tool/user/ncc/ComparisonsPane.java
index 4d388fb..336a422 100644
--- a/com/sun/electric/tool/user/ncc/ComparisonsPane.java
+++ b/com/sun/electric/tool/user/ncc/ComparisonsPane.java
@@ -4,7 +4,7 @@
*
* File: ComparisonsPane.java
*
-* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+* Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ncc/ComparisonsTree.java b/com/sun/electric/tool/user/ncc/ComparisonsTree.java
index 54f3167..da63b87 100644
--- a/com/sun/electric/tool/user/ncc/ComparisonsTree.java
+++ b/com/sun/electric/tool/user/ncc/ComparisonsTree.java
@@ -4,7 +4,7 @@
*
* File: ComparisonsTree.java
*
-* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+* Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ncc/EquivClassSplitPane.java b/com/sun/electric/tool/user/ncc/EquivClassSplitPane.java
index f25542d..3fe3629 100644
--- a/com/sun/electric/tool/user/ncc/EquivClassSplitPane.java
+++ b/com/sun/electric/tool/user/ncc/EquivClassSplitPane.java
@@ -4,7 +4,7 @@
*
* File: EquivClassSplitPane.java
*
-* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+* Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ncc/ExportAssertionFailures.java b/com/sun/electric/tool/user/ncc/ExportAssertionFailures.java
index 32eb10a..decb3ef 100644
--- a/com/sun/electric/tool/user/ncc/ExportAssertionFailures.java
+++ b/com/sun/electric/tool/user/ncc/ExportAssertionFailures.java
@@ -4,7 +4,7 @@
*
* File: ExportAssertionFailures.java
*
-* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+* Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ncc/ExportAssertionTable.java b/com/sun/electric/tool/user/ncc/ExportAssertionTable.java
index 340b044..5b86763 100644
--- a/com/sun/electric/tool/user/ncc/ExportAssertionTable.java
+++ b/com/sun/electric/tool/user/ncc/ExportAssertionTable.java
@@ -4,7 +4,7 @@
*
* File: ExportAssertionTable.java
*
-* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+* Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ncc/ExportConflict.java b/com/sun/electric/tool/user/ncc/ExportConflict.java
index 1e293c3..ff58a6f 100644
--- a/com/sun/electric/tool/user/ncc/ExportConflict.java
+++ b/com/sun/electric/tool/user/ncc/ExportConflict.java
@@ -4,7 +4,7 @@
*
* File: ExportConflict.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ncc/ExportConflictTable.java b/com/sun/electric/tool/user/ncc/ExportConflictTable.java
index 03f2ce3..6645f23 100644
--- a/com/sun/electric/tool/user/ncc/ExportConflictTable.java
+++ b/com/sun/electric/tool/user/ncc/ExportConflictTable.java
@@ -4,7 +4,7 @@
*
* File: ExportConflictTable.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ncc/ExportMismatch.java b/com/sun/electric/tool/user/ncc/ExportMismatch.java
index 29f0583..d1e067e 100644
--- a/com/sun/electric/tool/user/ncc/ExportMismatch.java
+++ b/com/sun/electric/tool/user/ncc/ExportMismatch.java
@@ -4,7 +4,7 @@
*
* File: ExportMismatch.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ncc/ExportMismatchTable.java b/com/sun/electric/tool/user/ncc/ExportMismatchTable.java
index acda6e7..3fdafd9 100644
--- a/com/sun/electric/tool/user/ncc/ExportMismatchTable.java
+++ b/com/sun/electric/tool/user/ncc/ExportMismatchTable.java
@@ -4,7 +4,7 @@
*
* File: ExportMismatchTable.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ncc/ExportTable.java b/com/sun/electric/tool/user/ncc/ExportTable.java
index 003849e..28b31df 100644
--- a/com/sun/electric/tool/user/ncc/ExportTable.java
+++ b/com/sun/electric/tool/user/ncc/ExportTable.java
@@ -4,7 +4,7 @@
*
* File: ExportTable.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ncc/HighlightEquivalent.java b/com/sun/electric/tool/user/ncc/HighlightEquivalent.java
index b3180f5..255948e 100644
--- a/com/sun/electric/tool/user/ncc/HighlightEquivalent.java
+++ b/com/sun/electric/tool/user/ncc/HighlightEquivalent.java
@@ -4,7 +4,7 @@
*
* File: HighlightEquivalent.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ncc/HighlightTools.java b/com/sun/electric/tool/user/ncc/HighlightTools.java
index 385083d..38e64a6 100644
--- a/com/sun/electric/tool/user/ncc/HighlightTools.java
+++ b/com/sun/electric/tool/user/ncc/HighlightTools.java
@@ -4,7 +4,7 @@
*
* File: HighlightTools.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ncc/NccGuiInfo.java b/com/sun/electric/tool/user/ncc/NccGuiInfo.java
index bc3a3dc..56caee8 100644
--- a/com/sun/electric/tool/user/ncc/NccGuiInfo.java
+++ b/com/sun/electric/tool/user/ncc/NccGuiInfo.java
@@ -4,7 +4,7 @@
*
* File: NccGuiInfo.java
*
-* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+* Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ncc/NccMsgsFrame.java b/com/sun/electric/tool/user/ncc/NccMsgsFrame.java
index c49605f..f5b7adb 100644
--- a/com/sun/electric/tool/user/ncc/NccMsgsFrame.java
+++ b/com/sun/electric/tool/user/ncc/NccMsgsFrame.java
@@ -4,7 +4,7 @@
*
* File: NccMsgsFrame.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ncc/SizeMismatchPane.java b/com/sun/electric/tool/user/ncc/SizeMismatchPane.java
index 79a53ab..eea8c0e 100644
--- a/com/sun/electric/tool/user/ncc/SizeMismatchPane.java
+++ b/com/sun/electric/tool/user/ncc/SizeMismatchPane.java
@@ -4,7 +4,7 @@
*
* File: SizeMismatchPane.java
*
-* Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+* Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ncc/UnrecognizedPart.java b/com/sun/electric/tool/user/ncc/UnrecognizedPart.java
index b5340b3..7435af9 100644
--- a/com/sun/electric/tool/user/ncc/UnrecognizedPart.java
+++ b/com/sun/electric/tool/user/ncc/UnrecognizedPart.java
@@ -4,7 +4,7 @@
*
* File: UnrecognizedPart.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ncc/UnrecognizedPartTable.java b/com/sun/electric/tool/user/ncc/UnrecognizedPartTable.java
index 4422224..c9b360c 100644
--- a/com/sun/electric/tool/user/ncc/UnrecognizedPartTable.java
+++ b/com/sun/electric/tool/user/ncc/UnrecognizedPartTable.java
@@ -4,7 +4,7 @@
*
* File: UnrecognizedPartTable.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/projectSettings/ProjSettings.java b/com/sun/electric/tool/user/projectSettings/ProjSettings.java
index a965819..0578aec 100644
--- a/com/sun/electric/tool/user/projectSettings/ProjSettings.java
+++ b/com/sun/electric/tool/user/projectSettings/ProjSettings.java
@@ -4,7 +4,7 @@
*
* File: ProjSettings.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -121,16 +121,20 @@ public class ProjSettings {
* @param file the file to read
* @param allowOverride true to allow overriding current settings,
* false to disallow and warn if different.
+ * @param disablePopups prevents this method from showing a popup warning window.
*/
- public static void readSettings(File file, EDatabase database, boolean allowOverride) {
+ public static void readSettings(File file, EDatabase database, boolean allowOverride, boolean disablePopups) {
File oldFile = getLastProjectSettingsFile();
ProjSettings newSettings = read(file);
if (newSettings == null) return;
System.out.println("Read Project Preferences from "+file);
if (settings == null) allowOverride = true;
if (newSettings.commit(database, allowOverride)) {
- String message = "Warning: Project Preferences conflicts;" + (allowOverride ? "" : " ignoring new settings.") + " See messages window";
- Job.getUserInterface().showInformationMessage(message, "Project Preferences Conflict");
+ if (!disablePopups)
+ {
+ String message = "Warning: Project Preferences conflicts;" + (allowOverride ? "" : " ignoring new settings.") + " See messages window";
+ Job.getUserInterface().showInformationMessage(message, "Project Preferences Conflict");
+ }
String oldFileName = "Stored Settings";
if (oldFile != null) oldFileName = oldFile.getPath();
if (oldFileName.equals(file.getPath())) {
@@ -210,7 +214,7 @@ public class ProjSettings {
@Override
public boolean doIt() throws JobException {
- readSettings(new File(fileName), getDatabase(), true);
+ readSettings(new File(fileName), getDatabase(), true, false);
return true;
}
diff --git a/com/sun/electric/tool/user/projectSettings/ProjSettingsNode.java b/com/sun/electric/tool/user/projectSettings/ProjSettingsNode.java
index 27a4c90..a3f95f7 100644
--- a/com/sun/electric/tool/user/projectSettings/ProjSettingsNode.java
+++ b/com/sun/electric/tool/user/projectSettings/ProjSettingsNode.java
@@ -4,7 +4,7 @@
*
* File: ProjSettingsNode.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/redisplay/AbstractDrawing.java b/com/sun/electric/tool/user/redisplay/AbstractDrawing.java
index 0c725f2..8ad885d 100644
--- a/com/sun/electric/tool/user/redisplay/AbstractDrawing.java
+++ b/com/sun/electric/tool/user/redisplay/AbstractDrawing.java
@@ -4,7 +4,7 @@
*
* File: AbstractDrawing.java
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/redisplay/AbstractLayerDrawing.java b/com/sun/electric/tool/user/redisplay/AbstractLayerDrawing.java
index 747d8b6..13768fb 100644
--- a/com/sun/electric/tool/user/redisplay/AbstractLayerDrawing.java
+++ b/com/sun/electric/tool/user/redisplay/AbstractLayerDrawing.java
@@ -4,7 +4,7 @@
*
* File: AbstractLayerDrawing.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/redisplay/AlphaBlender.java b/com/sun/electric/tool/user/redisplay/AlphaBlender.java
index d60698c..cf03bad 100644
--- a/com/sun/electric/tool/user/redisplay/AlphaBlender.java
+++ b/com/sun/electric/tool/user/redisplay/AlphaBlender.java
@@ -4,7 +4,7 @@
*
* File: AlphaBlender.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/redisplay/ERaster.java b/com/sun/electric/tool/user/redisplay/ERaster.java
index 3c82a98..fb108b0 100644
--- a/com/sun/electric/tool/user/redisplay/ERaster.java
+++ b/com/sun/electric/tool/user/redisplay/ERaster.java
@@ -4,7 +4,7 @@
*
* File: ERaster.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/redisplay/EmptyPatternedOutlinedTransparentRaster.java b/com/sun/electric/tool/user/redisplay/EmptyPatternedOutlinedTransparentRaster.java
index 7a8a878..a13e402 100644
--- a/com/sun/electric/tool/user/redisplay/EmptyPatternedOutlinedTransparentRaster.java
+++ b/com/sun/electric/tool/user/redisplay/EmptyPatternedOutlinedTransparentRaster.java
@@ -4,7 +4,7 @@
*
* File: EmptyPatternedOutlinedTransparentRaster.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/redisplay/LayerDrawing.java b/com/sun/electric/tool/user/redisplay/LayerDrawing.java
index 4127e22..2ecf5ef 100644
--- a/com/sun/electric/tool/user/redisplay/LayerDrawing.java
+++ b/com/sun/electric/tool/user/redisplay/LayerDrawing.java
@@ -4,7 +4,7 @@
*
* File: LayerDrawing.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/redisplay/OpaqueRaster.java b/com/sun/electric/tool/user/redisplay/OpaqueRaster.java
index 12248d8..7a8be12 100644
--- a/com/sun/electric/tool/user/redisplay/OpaqueRaster.java
+++ b/com/sun/electric/tool/user/redisplay/OpaqueRaster.java
@@ -4,7 +4,7 @@
*
* File: ERaster.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/redisplay/PatternedTransparentRaster.java b/com/sun/electric/tool/user/redisplay/PatternedTransparentRaster.java
index f0f6cb6..8924dc2 100644
--- a/com/sun/electric/tool/user/redisplay/PatternedTransparentRaster.java
+++ b/com/sun/electric/tool/user/redisplay/PatternedTransparentRaster.java
@@ -4,7 +4,7 @@
*
* File: ERaster.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/redisplay/PixelDrawing.java b/com/sun/electric/tool/user/redisplay/PixelDrawing.java
index 46ebc07..31c9806 100644
--- a/com/sun/electric/tool/user/redisplay/PixelDrawing.java
+++ b/com/sun/electric/tool/user/redisplay/PixelDrawing.java
@@ -4,7 +4,7 @@
*
* File: PixelDrawing.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/redisplay/TransparentRaster.java b/com/sun/electric/tool/user/redisplay/TransparentRaster.java
index ad6cd8d..cc047d4 100644
--- a/com/sun/electric/tool/user/redisplay/TransparentRaster.java
+++ b/com/sun/electric/tool/user/redisplay/TransparentRaster.java
@@ -4,7 +4,7 @@
*
* File: TransparentRaster.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/redisplay/VectorCache.java b/com/sun/electric/tool/user/redisplay/VectorCache.java
index 96b7d7b..168f835 100644
--- a/com/sun/electric/tool/user/redisplay/VectorCache.java
+++ b/com/sun/electric/tool/user/redisplay/VectorCache.java
@@ -4,7 +4,7 @@
*
* File: VectorCache.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/redisplay/VectorDrawing.java b/com/sun/electric/tool/user/redisplay/VectorDrawing.java
index 09b06f7..139005f 100644
--- a/com/sun/electric/tool/user/redisplay/VectorDrawing.java
+++ b/com/sun/electric/tool/user/redisplay/VectorDrawing.java
@@ -4,7 +4,7 @@
*
* File: VectorDrawing.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/tecEdit/ArcInfo.java b/com/sun/electric/tool/user/tecEdit/ArcInfo.java
index cc60b7b..641fa36 100644
--- a/com/sun/electric/tool/user/tecEdit/ArcInfo.java
+++ b/com/sun/electric/tool/user/tecEdit/ArcInfo.java
@@ -4,9 +4,9 @@
*
* File: ArcInfo.java
* Technology Editor, arc information
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/tecEdit/Example.java b/com/sun/electric/tool/user/tecEdit/Example.java
index 5ea06bb..c3a39b4 100644
--- a/com/sun/electric/tool/user/tecEdit/Example.java
+++ b/com/sun/electric/tool/user/tecEdit/Example.java
@@ -4,9 +4,9 @@
*
* File: Example.java
* Technology Editor, helper class during conversion of libraries to technologies
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/tecEdit/GeneralInfo.java b/com/sun/electric/tool/user/tecEdit/GeneralInfo.java
index 0da24e3..ea0daed 100644
--- a/com/sun/electric/tool/user/tecEdit/GeneralInfo.java
+++ b/com/sun/electric/tool/user/tecEdit/GeneralInfo.java
@@ -4,9 +4,9 @@
*
* File: GeneralInfo.java
* Technology Editor, general factors information
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/tecEdit/Info.java b/com/sun/electric/tool/user/tecEdit/Info.java
index ceef963..744bacc 100644
--- a/com/sun/electric/tool/user/tecEdit/Info.java
+++ b/com/sun/electric/tool/user/tecEdit/Info.java
@@ -4,9 +4,9 @@
*
* File: Info.java
* Technology Editor, information superclass
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/tecEdit/LayerInfo.java b/com/sun/electric/tool/user/tecEdit/LayerInfo.java
index 30780c1..97dc2c3 100644
--- a/com/sun/electric/tool/user/tecEdit/LayerInfo.java
+++ b/com/sun/electric/tool/user/tecEdit/LayerInfo.java
@@ -4,9 +4,9 @@
*
* File: LayerInfo.java
* Technology Editor, layer information
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/tecEdit/LibToTech.java b/com/sun/electric/tool/user/tecEdit/LibToTech.java
index e96e6ed..ec19089 100644
--- a/com/sun/electric/tool/user/tecEdit/LibToTech.java
+++ b/com/sun/electric/tool/user/tecEdit/LibToTech.java
@@ -4,9 +4,9 @@
*
* File: LibToTech.java
* Technology Editor, conversion of technology libraries to technologies
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -370,7 +370,9 @@ public class LibToTech
}
// add the component menu information if available
- Variable var = Library.getCurrent().getVar(Info.COMPMENU_KEY);
+ Variable var = null;
+ Library cLib = Library.getCurrent();
+ if (cLib != null) var = cLib.getVar(Info.COMPMENU_KEY);
if (var != null)
{
String compMenuXML = (String)var.getObject();
diff --git a/com/sun/electric/tool/user/tecEdit/Manipulate.java b/com/sun/electric/tool/user/tecEdit/Manipulate.java
index 9cc2960..a400f93 100644
--- a/com/sun/electric/tool/user/tecEdit/Manipulate.java
+++ b/com/sun/electric/tool/user/tecEdit/Manipulate.java
@@ -4,9 +4,9 @@
*
* File: Manipulate.java
* Technology Editor, editing technology libraries
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin=.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/tecEdit/NodeInfo.java b/com/sun/electric/tool/user/tecEdit/NodeInfo.java
index 55585ff..0109b2c 100644
--- a/com/sun/electric/tool/user/tecEdit/NodeInfo.java
+++ b/com/sun/electric/tool/user/tecEdit/NodeInfo.java
@@ -4,9 +4,9 @@
*
* File: NodeInfo.java
* Technology Editor, node information
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/tecEdit/Sample.java b/com/sun/electric/tool/user/tecEdit/Sample.java
index 7084845..91f45fc 100644
--- a/com/sun/electric/tool/user/tecEdit/Sample.java
+++ b/com/sun/electric/tool/user/tecEdit/Sample.java
@@ -4,9 +4,9 @@
*
* File: Sample.java
* Technology Editor, helper class during conversion of libraries to technologies
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/tecEdit/TechConversionResult.java b/com/sun/electric/tool/user/tecEdit/TechConversionResult.java
index 6c278a7..ab17bba 100644
--- a/com/sun/electric/tool/user/tecEdit/TechConversionResult.java
+++ b/com/sun/electric/tool/user/tecEdit/TechConversionResult.java
@@ -4,9 +4,9 @@
*
* File: TechConversionResult.java
* Technology Editor, conversion of technology libraries to technologies
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2007, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/tecEdit/TechToLib.java b/com/sun/electric/tool/user/tecEdit/TechToLib.java
index 0ead37e..d21cbdb 100644
--- a/com/sun/electric/tool/user/tecEdit/TechToLib.java
+++ b/com/sun/electric/tool/user/tecEdit/TechToLib.java
@@ -4,9 +4,9 @@
*
* File: TechToLib.java
* Technology Editor, conversion of technologies to libraries
- * Written by Steven M. Rubin, Sun Microsystems.
+ * Written by Steven M. Rubin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/tecEditWizard/Active.java b/com/sun/electric/tool/user/tecEditWizard/Active.java
index 957b8a1..5b31999 100644
--- a/com/sun/electric/tool/user/tecEditWizard/Active.java
+++ b/com/sun/electric/tool/user/tecEditWizard/Active.java
@@ -4,7 +4,7 @@
*
* File: Active.java
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/tecEditWizard/Antenna.java b/com/sun/electric/tool/user/tecEditWizard/Antenna.java
index 5c5ecf9..11160fd 100644
--- a/com/sun/electric/tool/user/tecEditWizard/Antenna.java
+++ b/com/sun/electric/tool/user/tecEditWizard/Antenna.java
@@ -4,7 +4,7 @@
*
* File: Antenna.java
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/tecEditWizard/Contact.java b/com/sun/electric/tool/user/tecEditWizard/Contact.java
index 9c20238..2be4994 100644
--- a/com/sun/electric/tool/user/tecEditWizard/Contact.java
+++ b/com/sun/electric/tool/user/tecEditWizard/Contact.java
@@ -4,7 +4,7 @@
*
* File: Contact.java
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/tecEditWizard/GDS.java b/com/sun/electric/tool/user/tecEditWizard/GDS.java
index a402dfc..9a2340f 100644
--- a/com/sun/electric/tool/user/tecEditWizard/GDS.java
+++ b/com/sun/electric/tool/user/tecEditWizard/GDS.java
@@ -4,7 +4,7 @@
*
* File: GDS.java
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/tecEditWizard/Gate.java b/com/sun/electric/tool/user/tecEditWizard/Gate.java
index fa267b2..e237f18 100644
--- a/com/sun/electric/tool/user/tecEditWizard/Gate.java
+++ b/com/sun/electric/tool/user/tecEditWizard/Gate.java
@@ -4,7 +4,7 @@
*
* File: Gate.java
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/tecEditWizard/General.java b/com/sun/electric/tool/user/tecEditWizard/General.java
index b90df84..c9eb76c 100644
--- a/com/sun/electric/tool/user/tecEditWizard/General.java
+++ b/com/sun/electric/tool/user/tecEditWizard/General.java
@@ -4,7 +4,7 @@
*
* File: General.java
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/tecEditWizard/Metal.java b/com/sun/electric/tool/user/tecEditWizard/Metal.java
index 83747a7..be8521c 100644
--- a/com/sun/electric/tool/user/tecEditWizard/Metal.java
+++ b/com/sun/electric/tool/user/tecEditWizard/Metal.java
@@ -4,7 +4,7 @@
*
* File: Metal.java
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/tecEditWizard/Poly.java b/com/sun/electric/tool/user/tecEditWizard/Poly.java
index d5c0633..f724140 100644
--- a/com/sun/electric/tool/user/tecEditWizard/Poly.java
+++ b/com/sun/electric/tool/user/tecEditWizard/Poly.java
@@ -4,7 +4,7 @@
*
* File: Poly.java
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/tecEditWizard/TechEditWizard.java b/com/sun/electric/tool/user/tecEditWizard/TechEditWizard.java
index b917842..8b21b64 100644
--- a/com/sun/electric/tool/user/tecEditWizard/TechEditWizard.java
+++ b/com/sun/electric/tool/user/tecEditWizard/TechEditWizard.java
@@ -4,7 +4,7 @@
*
* File: TechEditWizard.java
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/tecEditWizard/TechEditWizardData.java b/com/sun/electric/tool/user/tecEditWizard/TechEditWizardData.java
index b9bd30a..bab826b 100644
--- a/com/sun/electric/tool/user/tecEditWizard/TechEditWizardData.java
+++ b/com/sun/electric/tool/user/tecEditWizard/TechEditWizardData.java
@@ -6,7 +6,7 @@
* Create an Electric XML Technology from a simple numeric description of design rules
* Written in Perl by Andrew West, translated to Java by Steven Rubin.
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -376,7 +376,7 @@ public class TechEditWizardData
{
String nums = funcName.substring(3);
int lay = Integer.parseInt(nums);
- func = Layer.Function.getContact(lay);
+ func = Layer.Function.getContact(lay, 0);
}
else if (funcName.startsWith("METAL")) // metal case
{
@@ -2288,7 +2288,7 @@ public class TechEditWizardData
/**
* Method to create the XML version of a PrimitiveNode representing a pin
- * @return
+ * @return new XML.
*/
private Xml.PrimitiveNodeGroup makeXmlPrimitivePin(Xml.Technology t, String name, double size,
SizeOffset so, List<String> portNames, Xml.NodeLayer... list)
@@ -2316,7 +2316,7 @@ public class TechEditWizardData
/**
* Method to creat the XML version of a PrimitiveNode representing a contact
- * @return
+ * @return new XML.
*/
private Xml.PrimitiveNodeGroup makeXmlPrimitiveCon(List<Xml.PrimitiveNodeGroup> nodeGroups, String name,
PrimitiveNode.Function function, double sizeX, double sizeY,
@@ -2338,7 +2338,7 @@ public class TechEditWizardData
/**
* Method to creat the XML version of a PrimitiveNode representing a contact
- * @return
+ * @return new XML.
*/
private Xml.PrimitiveNodeGroup makeXmlCapacitor(List<Xml.PrimitiveNodeGroup> nodeGroups, String name,
PrimitiveNode.Function function, double sizeX, double sizeY,
@@ -2365,7 +2365,7 @@ public class TechEditWizardData
/**
* Method to create the XML version of a PrimitiveNode
- * @return
+ * @return new XML.
*/
private Xml.PrimitiveNodeGroup makeXmlPrimitive(List<Xml.PrimitiveNodeGroup> nodeGroups,
String name, PrimitiveNode.Function function,
@@ -2540,7 +2540,7 @@ public class TechEditWizardData
* Method to create the XML version of a ArcProto
* @param name
* @param function
- * @return
+ * @return new XML.
*/
private Xml.ArcProto makeXmlArc(Xml.Technology t, String name, com.sun.electric.technology.ArcProto.Function function,
double ant, Xml.ArcLayer ... arcLayers)
@@ -2565,7 +2565,7 @@ public class TechEditWizardData
/**
* Method to create the XML version of a Layer.
- * @return
+ * @return new XML.
*/
private Xml.Layer makeXmlLayer(List<Xml.Layer> layers, Map<Xml.Layer, WizardField> layerMap, String name,
Layer.Function function, int extraf, EGraphics graph,
@@ -2579,7 +2579,7 @@ public class TechEditWizardData
/**
* Method to create the XML version of a Layer.
- * @return
+ * @return new XML.
*/
private Xml.Layer makeXmlLayer(List<Xml.Layer> layers, String name, Layer.Function function, int extraf, EGraphics graph,
double width, boolean pureLayerNode, boolean pureLayerPortArc, String... portArcNames)
@@ -2697,7 +2697,7 @@ public class TechEditWizardData
/**
* Method to create the default XML version of a MultiCUt NodeLayer
- * @return
+ * @return new XML.
*/
private Xml.NodeLayer makeXmlMulticut(Xml.Layer lb, double sizeRuleX, double sizeRuleY, double sepRule, double sepRule2D)
{
@@ -2706,7 +2706,7 @@ public class TechEditWizardData
/**
* Method to create the default XML version of a MultiCUt NodeLayer
- * @return
+ * @return new XML.
*/
private Xml.NodeLayer makeXmlMulticut(double lx, double hx, double ly, double hy, Xml.Layer lb,
double sizeRuleX, double sizeRuleY, double sepRule, double sepRule2D)
@@ -2716,7 +2716,7 @@ public class TechEditWizardData
/**
* Method to create the default XML version of a MultiCUt NodeLayer
- * @return
+ * @return new XML.
*/
private Xml.NodeLayer makeXmlMulticut(double lx, int lxk, double hx, int hxk, double ly, int lyk, double hy, int hyk,
Xml.Layer lb, double sizeRuleX, double sizeRuleY, double sepRule, double sepRule2D)
@@ -3156,7 +3156,7 @@ public class TechEditWizardData
int b = via_colour.getBlue();
double opacity = 0.7;
EGraphics graph = new EGraphics(false, false, null, 0, r, g, b, opacity, true, nullPattern);
- Layer.Function fun = Layer.Function.getContact(metalNum+1); //via contact starts with CONTACT2
+ Layer.Function fun = Layer.Function.getContact(metalNum+1, 0); //via contact starts with CONTACT2
String viaName = getViaName()+metalNum;
if (fun == null)
throw new IOException("invalid number of vias");
diff --git a/com/sun/electric/tool/user/tecEditWizard/TechEditWizardPanel.java b/com/sun/electric/tool/user/tecEditWizard/TechEditWizardPanel.java
index 3167c75..afdd702 100644
--- a/com/sun/electric/tool/user/tecEditWizard/TechEditWizardPanel.java
+++ b/com/sun/electric/tool/user/tecEditWizard/TechEditWizardPanel.java
@@ -4,7 +4,7 @@
*
* File: TechEditWizardPanel.java
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/tecEditWizard/Via.java b/com/sun/electric/tool/user/tecEditWizard/Via.java
index 13a6f19..e49bdfe 100644
--- a/com/sun/electric/tool/user/tecEditWizard/Via.java
+++ b/com/sun/electric/tool/user/tecEditWizard/Via.java
@@ -4,7 +4,7 @@
*
* File: Via.java
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/tecEditWizard/WellImplant.java b/com/sun/electric/tool/user/tecEditWizard/WellImplant.java
index a55858f..35e3776 100644
--- a/com/sun/electric/tool/user/tecEditWizard/WellImplant.java
+++ b/com/sun/electric/tool/user/tecEditWizard/WellImplant.java
@@ -4,7 +4,7 @@
*
* File: WellImplant.java
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/tecEditWizard/WizardField.java b/com/sun/electric/tool/user/tecEditWizard/WizardField.java
index a149848..572713f 100644
--- a/com/sun/electric/tool/user/tecEditWizard/WizardField.java
+++ b/com/sun/electric/tool/user/tecEditWizard/WizardField.java
@@ -4,7 +4,7 @@
*
* File: WizardField.java
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/tecEditWizard2/Antenna.java b/com/sun/electric/tool/user/tecEditWizard2/Antenna.java
index f89e658..fa18436 100644
--- a/com/sun/electric/tool/user/tecEditWizard2/Antenna.java
+++ b/com/sun/electric/tool/user/tecEditWizard2/Antenna.java
@@ -4,7 +4,7 @@
*
* File: Antenna.java
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/tecEditWizard2/GDS.java b/com/sun/electric/tool/user/tecEditWizard2/GDS.java
index ddf2652..f62174b 100644
--- a/com/sun/electric/tool/user/tecEditWizard2/GDS.java
+++ b/com/sun/electric/tool/user/tecEditWizard2/GDS.java
@@ -4,7 +4,7 @@
*
* File: GDS.java
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/tecEditWizard2/General.java b/com/sun/electric/tool/user/tecEditWizard2/General.java
index f94d0c9..525d434 100644
--- a/com/sun/electric/tool/user/tecEditWizard2/General.java
+++ b/com/sun/electric/tool/user/tecEditWizard2/General.java
@@ -4,7 +4,7 @@
*
* File: General.java
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/tecEditWizard2/GenericPanel.java b/com/sun/electric/tool/user/tecEditWizard2/GenericPanel.java
index 7a1f5bb..8107475 100644
--- a/com/sun/electric/tool/user/tecEditWizard2/GenericPanel.java
+++ b/com/sun/electric/tool/user/tecEditWizard2/GenericPanel.java
@@ -4,7 +4,7 @@
*
* File: GenericPanel.java
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/tecEditWizard2/Metal.java b/com/sun/electric/tool/user/tecEditWizard2/Metal.java
index cd19424..b9a2320 100644
--- a/com/sun/electric/tool/user/tecEditWizard2/Metal.java
+++ b/com/sun/electric/tool/user/tecEditWizard2/Metal.java
@@ -4,7 +4,7 @@
*
* File: Metal.java
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/tecEditWizard2/TechEditWizard.java b/com/sun/electric/tool/user/tecEditWizard2/TechEditWizard.java
index 86aac54..4e2a8d9 100644
--- a/com/sun/electric/tool/user/tecEditWizard2/TechEditWizard.java
+++ b/com/sun/electric/tool/user/tecEditWizard2/TechEditWizard.java
@@ -4,7 +4,7 @@
*
* File: TechEditWizard.java
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/tecEditWizard2/TechEditWizardData.java b/com/sun/electric/tool/user/tecEditWizard2/TechEditWizardData.java
index 01e34ec..4dd5fec 100644
--- a/com/sun/electric/tool/user/tecEditWizard2/TechEditWizardData.java
+++ b/com/sun/electric/tool/user/tecEditWizard2/TechEditWizardData.java
@@ -6,7 +6,7 @@
* Create an Electric XML Technology from a simple numeric description of design rules
* Written in Perl by Andrew Wewist, translated to Java by Steven Rubin.
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -1643,7 +1643,7 @@ public class TechEditWizardData
/**
* Method to create the XML version of a PrimitiveNode representing a pin
- * @return
+ * @return new XML.
*/
private Xml.PrimitiveNodeGroup makeXmlPrimitivePin(Xml.Technology t, String name, double size,
SizeOffset so, List<String> portNames, Xml.NodeLayer... list)
@@ -1670,8 +1670,8 @@ public class TechEditWizardData
}
/**
- * Method to creat the XML version of a PrimitiveNode representing a contact
- * @return
+ * Method to create the XML version of a PrimitiveNode representing a contact
+ * @return new XML.
*/
private Xml.PrimitiveNodeGroup makeXmlPrimitiveCon(List<Xml.PrimitiveNodeGroup> nodeGroups, String name,
PrimitiveNode.Function function, double sizeX, double sizeY,
@@ -1692,8 +1692,8 @@ public class TechEditWizardData
}
/**
- * Method to creat the XML version of a PrimitiveNode representing a contact
- * @return
+ * Method to create the XML version of a PrimitiveNode representing a contact
+ * @return new XML.
*/
private Xml.PrimitiveNodeGroup makeXmlCapacitor(List<Xml.PrimitiveNodeGroup> nodeGroups, String name,
PrimitiveNode.Function function, double sizeX, double sizeY,
@@ -1720,7 +1720,7 @@ public class TechEditWizardData
/**
* Method to create the XML version of a PrimitiveNode
- * @return
+ * @return new XML.
*/
private Xml.PrimitiveNodeGroup makeXmlPrimitive(List<Xml.PrimitiveNodeGroup> nodeGroups,
String name, PrimitiveNode.Function function,
@@ -1896,7 +1896,7 @@ public class TechEditWizardData
* Method to create the XML version of a ArcProto
* @param name
* @param function
- * @return
+ * @return new XML.
*/
private Xml.ArcProto makeXmlArc(Xml.Technology t, String name, com.sun.electric.technology.ArcProto.Function function,
double ant, Xml.ArcLayer ... arcLayers)
@@ -1927,7 +1927,7 @@ public class TechEditWizardData
/**
* Method to create the XML version of a Layer.
- * @return
+ * @return new XML.
*/
private Xml.Layer makeXmlLayer(List<Xml.Layer> layers, Map<Xml.Layer, WizardField> layerMap, String name,
Layer.Function function, int extraf, EGraphics graph,
@@ -1941,7 +1941,7 @@ public class TechEditWizardData
/**
* Method to create the XML version of a Layer.
- * @return
+ * @return new XML.
*/
private Xml.Layer makeXmlLayer(List<Xml.Layer> layers, String name, Layer.Function function, int extraf, EGraphics graph,
double width, boolean pureLayerNode, boolean pureLayerPortArc, String... portArcNames)
@@ -2059,7 +2059,7 @@ public class TechEditWizardData
/**
* Method to create the default XML version of a MultiCUt NodeLayer
- * @return
+ * @return new XML.
*/
private Xml.NodeLayer makeXmlMulticut(Xml.Layer lb, double sizeRule, double sepRule, double sepRule2D)
{
@@ -2068,7 +2068,7 @@ public class TechEditWizardData
/**
* Method to create the default XML version of a MultiCUt NodeLayer
- * @return
+ * @return new XML.
*/
private Xml.NodeLayer makeXmlMulticut(double lx, double hx, double ly, double hy, Xml.Layer lb,
double sizeRule, double sepRule, double sepRule2D)
@@ -2078,7 +2078,7 @@ public class TechEditWizardData
/**
* Method to create the default XML version of a MultiCUt NodeLayer
- * @return
+ * @return new XML.
*/
private Xml.NodeLayer makeXmlMulticut(double lx, int lxk, double hx, int hxk, double ly, int lyk, double hy, int hyk,
Xml.Layer lb, double sizeRule, double sepRule, double sepRule2D)
@@ -2421,7 +2421,7 @@ public class TechEditWizardData
int b = via_colour.getBlue();
double opacity = 0.7;
EGraphics graph = new EGraphics(false, false, null, 0, r, g, b, opacity, true, nullPattern);
- Layer.Function fun = Layer.Function.getContact(metalNum+1); //via contact starts with CONTACT2
+ Layer.Function fun = Layer.Function.getContact(metalNum+1, 0); //via contact starts with CONTACT2
if (fun == null)
throw new IOException("invalid number of vias");
viaLayers.add(makeXmlLayer(t.layers, layerMap, "Via-"+metalNum, fun, Layer.Function.CONMETAL,
diff --git a/com/sun/electric/tool/user/tecEditWizard2/TechEditWizardPanel.java b/com/sun/electric/tool/user/tecEditWizard2/TechEditWizardPanel.java
index 4a4dbd3..7827b55 100644
--- a/com/sun/electric/tool/user/tecEditWizard2/TechEditWizardPanel.java
+++ b/com/sun/electric/tool/user/tecEditWizard2/TechEditWizardPanel.java
@@ -4,7 +4,7 @@
*
* File: TechEditWizardPanel.java
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/tecEditWizard2/Via.java b/com/sun/electric/tool/user/tecEditWizard2/Via.java
index 16a86e9..ec6d2cd 100644
--- a/com/sun/electric/tool/user/tecEditWizard2/Via.java
+++ b/com/sun/electric/tool/user/tecEditWizard2/Via.java
@@ -4,7 +4,7 @@
*
* File: Via.java
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/tecEditWizard2/WizardField.java b/com/sun/electric/tool/user/tecEditWizard2/WizardField.java
index ac4b6a0..d18cfad 100644
--- a/com/sun/electric/tool/user/tecEditWizard2/WizardField.java
+++ b/com/sun/electric/tool/user/tecEditWizard2/WizardField.java
@@ -4,7 +4,7 @@
*
* File: WizardField.java
*
- * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/database/geometry/bool/LayoutMerger.java b/com/sun/electric/tool/user/tests/AbstractGUITest.java
similarity index 58%
copy from com/sun/electric/database/geometry/bool/LayoutMerger.java
copy to com/sun/electric/tool/user/tests/AbstractGUITest.java
index 0a135fe..8b6c90d 100644
--- a/com/sun/electric/database/geometry/bool/LayoutMerger.java
+++ b/com/sun/electric/tool/user/tests/AbstractGUITest.java
@@ -2,10 +2,9 @@
*
* Electric(tm) VLSI Design System
*
- * File: LayoutMerger.java
- * Written by Dmitry Nadezhin, Sun Microsystems.
+ * File: AbstractGUITest.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -20,17 +19,28 @@
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-package com.sun.electric.database.geometry.bool;
+package com.sun.electric.tool.user.tests;
-import com.sun.electric.database.geometry.PolyBase;
-import com.sun.electric.technology.Layer;
+import java.net.URL;
import java.util.Collection;
+import java.util.Collections;
/**
*
*/
-public interface LayoutMerger {
- public Collection<Layer> getLayers();
- public boolean canMerge(Layer layer);
- public Iterable<PolyBase.PolyBaseTree> merge(Layer layer);
+public abstract class AbstractGUITest extends AbstractTest
+{
+ protected AbstractGUITest(String name)
+ {
+ super(name);
+ }
+
+ protected Collection<URL> getRequiredLibraries(String regressionPath)
+ {
+ return Collections.emptyList();
+ }
+
+ protected abstract boolean phase1();
+ protected abstract boolean phase2();
+ protected abstract boolean phase3();
}
diff --git a/com/sun/electric/tool/user/tests/AbstractTest.java b/com/sun/electric/tool/user/tests/AbstractTest.java
new file mode 100644
index 0000000..6f0edd3
--- /dev/null
+++ b/com/sun/electric/tool/user/tests/AbstractTest.java
@@ -0,0 +1,582 @@
+/* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: AbstractTest.java
+ *
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.user.tests;
+
+import com.sun.electric.database.hierarchy.Cell;
+import com.sun.electric.database.hierarchy.EDatabase;
+import com.sun.electric.database.hierarchy.Library;
+import com.sun.electric.database.text.Setting;
+import com.sun.electric.technology.Foundry;
+import com.sun.electric.technology.Technology;
+import com.sun.electric.tool.Job;
+import com.sun.electric.tool.io.output.Output;
+import com.sun.electric.tool.user.Clipboard;
+import com.sun.electric.tool.user.MessagesStream;
+import com.sun.electric.tool.user.User;
+import com.sun.electric.tool.user.ui.WindowFrame;
+import com.sun.electric.util.TextUtils;
+
+import java.awt.image.BufferedImage;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.FileReader;
+import java.io.FileWriter;
+import java.io.IOException;
+import java.io.LineNumberReader;
+import java.io.PrintWriter;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import javax.imageio.ImageIO;
+
+/**
+ * Auxiliary structure defined as class to avoid implementing all functions
+ */
+public abstract class AbstractTest implements Serializable
+{
+ ////////////////// ** static function ** /////////////////////////////////
+ static String properDirectory(String regressionPath, Class theClass)
+ {
+ String firstName = theClass.getName();
+
+ int j = firstName.lastIndexOf(".");
+ String type = firstName.substring(j + 1);
+
+ int k = type.lastIndexOf("Test");
+ type = type.substring(0, k);
+
+ dirMakeCheck(regressionPath, type);
+ return type;
+ }
+
+ static String outputDir(String regressionPath, String testType)
+ {
+ return workingDir(regressionPath, testType) + "output/";
+ }
+
+ static void ensureOutputDirectory(String dirName)
+ {
+ File f = new File(dirName);
+ if (!f.exists()) f.mkdir();
+ }
+
+ private static void dirMakeCheck(String regressionPath, String type)
+ {
+ boolean dirCheck = (new File(outputDir(regressionPath, type))).isDirectory();
+ if (dirCheck)
+ {
+ // System.out.println("Directory: " + outputDir(type) + " Exists");
+ } else
+ {
+ boolean dirMake = (new File(outputDir(regressionPath, type))).mkdir();
+ if (dirMake)
+ {
+ System.out.println("Successfully made directory: " + outputDir(regressionPath, type));
+ } else
+ {
+ System.out.println("Failed to make directory");
+ }
+ }
+ }
+
+ protected static String workingDir(String regressionPath, String testType)
+ {
+ String path = regressionPath;
+ if (path != null && path.length() != 0 && !path.contains("<")) // path setup
+ return regressionPath + "/tools/" + testType + "/";
+ return ""; // nothing
+ }
+
+ protected static String dataDir(String regressionPath, String testType)
+ {
+ return workingDir(regressionPath, testType) + "data/libs/";
+ }
+
+ /**
+ * Method to delete all current libraries so that any previous versions do not affect the current test.
+ */
+ public static void wipeLibraries()
+ {
+ Clipboard.clear();
+
+ List<Library> allLibs = new ArrayList<Library>();
+ for(Iterator<Library> it = Library.getLibraries(); it.hasNext(); )
+ allLibs.add(it.next());
+
+ while (allLibs.size() != 0)
+ {
+ // find a library to delete
+ boolean killedOne = false;
+ for(Library lib : allLibs)
+ {
+ Set<Cell> found = Library.findReferenceInCell(lib);
+
+ // if all references are from the clipboard, request that the clipboard be cleared, too
+ boolean nonClipboard = false;
+ for (Cell cell : found)
+ {
+ if (!cell.getLibrary().isHidden()) nonClipboard = true;
+ }
+
+ // You can't close it because there are open cells that refer to library elements
+ if (nonClipboard) continue;
+ WindowFrame.removeLibraryReferences(lib);
+ lib.kill("delete");
+ allLibs.remove(lib);
+ killedOne = true;
+ break;
+ }
+ if (!killedOne)
+ {
+ System.out.println("Circular loop in libraries: cannot wipe");
+ break;
+ }
+ }
+ }
+
+ ////////////////// ** end of static function ** /////////////////////////////////
+
+ private String name;
+ private String groupName;
+ private boolean multiTask;
+ private boolean interactive;
+ private FakeTestJob starterJob;
+
+ protected AbstractTest(String name)
+ {
+ this.name = name;
+ this.multiTask = false;
+ this.interactive = false;
+ }
+
+ protected AbstractTest(String name, boolean multiTask, boolean interactive)
+ {
+ this.name = name;
+ this.multiTask = multiTask;
+ this.interactive = interactive;
+ }
+
+ static String getValidRootPath(String root, String extraPath, String alternativePath)
+ {
+ return (root != null) ? root+extraPath : alternativePath;
+ }
+
+ public void setGroupName(String name) { groupName = name; }
+
+ public String getFunctionName() { return name; }
+
+ protected String getResultName() { return getFunctionName() + "Result"; }
+
+ protected String getLogName() { return getFunctionName() + "Out.log"; }
+
+ public String getFullTestName() { return groupName + ":" + name; }
+
+ boolean isMultiTask() { return multiTask; }
+
+ boolean isInteractive() { return interactive; }
+
+ void setStarterJob(FakeTestJob starterJob) { this.starterJob = starterJob; }
+
+ FakeTestJob getStarterJob() { return starterJob; }
+
+ EDatabase getDatabase() { return starterJob.getDatabase(); }
+
+ String getRegressionPath() { return User.getRegressionPath(); }
+
+ /**
+ * Method to get the real root path from the regression root directory.
+ */
+ protected String workingDir()
+ {
+ String path = getRegressionPath();
+ String testParameter = properDirectory(path, getClass());
+ return workingDir(path, testParameter);
+ }
+
+ public String toString() { return name; }
+
+ protected static Technology setFoundry(Technology tech)
+ {
+ Foundry.Type f = null;
+ if (tech == Technology.getMocmosTechnology())
+ {
+ f = Foundry.Type.MOSIS;
+ } else {
+ System.out.println(f + " not available for testing");
+ return tech;
+ }
+ return setFoundry(tech, f.getName());
+ }
+
+ /**
+ * Change foundry preference of given technology and return new version for this technology.
+ * @param tech technology to change foundry
+ * @param foundryName foundry name
+ * @return new version of technology
+ */
+ public static Technology setFoundry(Technology tech, String foundryName)
+ {
+ String techName = tech.getTechName();
+ Setting.SettingChangeBatch changeBatch = new Setting.SettingChangeBatch();
+ changeBatch.add(tech.getPrefFoundrySetting(), foundryName);
+ EDatabase.serverDatabase().implementSettingChanges(changeBatch);
+ return Technology.findTechnology(techName);
+ }
+
+ protected class CompareJob extends Job
+ {
+ private Cell cell;
+ private String resultName;
+
+ CompareJob(Cell cell)
+ {
+ this(cell, getResultName());
+ }
+
+ CompareJob(Cell cell, String resultName)
+ {
+ super("Test " + getFullTestName() + " compare", User.getUserTool(), Job.Type.CHANGE, null, null, Job.Priority.USER);
+ this.cell = cell;
+ this.resultName = resultName;
+ }
+
+ @Override
+ public boolean doIt()
+ {
+ // examine results
+ boolean good = false;
+ try
+ {
+ good = compareCellResults(cell, resultName);
+ } catch (Exception e)
+ {
+ System.out.println("Exception:" + e);
+ e.printStackTrace();
+ }
+ if (getStarterJob() != null) // not coming from the regression
+ getStarterJob().updateTestResult(good);
+ return good;
+ }
+ }
+
+ /**
+ * Method to compare a given library with the expected library stored in file.
+ * @param trueRootPath
+ * @param rootName
+ * @param outLib
+ * @param lineKeys Set of first characters in lines to ignore to proper compare the data.
+ * @return true if they are the same.
+ */
+ static boolean compareLibraryResults(String trueRootPath, String rootName, Library outLib, char[] lineKeys)
+ {
+ // write results in a different library
+ String commondEnd = rootName + "Result";
+ String outputDir = trueRootPath + "output/";
+ String destLibName = outputDir + commondEnd + ".jelib";
+ Output.saveJelib(destLibName, outLib);
+
+ // remove header lines from the library
+ String trimmedLib = outputDir + commondEnd + "Partial.jelib";
+ removeLines(destLibName, trimmedLib, lineKeys);
+
+ // see if the library is as expected
+ String expectedLib = trueRootPath + "data/expected/" + commondEnd + ".jelib";
+ return compareResults(trimmedLib, expectedLib);
+ }
+
+ /**
+ * Method to compare a given cell with the expected cell stored in file. This function can't be used
+ * if the cell doesn't exist in the expected data. Side effect: this function writes down the cell under
+ * analysis and also the trimmed version of it.
+ * @param cell Cell to compare.
+ * @param resultName
+ * @return true if they are the same.
+ */
+ boolean compareCellResults(Cell cell, String resultName)
+ {
+ if (resultName == null)
+ resultName = getResultName();
+
+ String testParameter = properDirectory(getRegressionPath(), getClass());
+ String outputDir = outputDir(getRegressionPath(), testParameter);
+
+ // reset modification date for consistent output
+ cell.lowLevelSetRevisionDate(new Date(0));
+ cell.getDatabase().backup();
+
+ // save output
+ String destLib = outputDir + resultName + "Out.jelib";
+ Output.saveJelib(destLib, cell.getLibrary());
+
+ // extract the cell from the library
+ String trimmedLib = outputDir + resultName + ".jelib";
+ trimLibToCell(destLib, trimmedLib, cell.getName() + ";");
+
+ // see if the cell is as expected
+ String expectedLib = workingDir(getRegressionPath(), testParameter) + "data/expected/" + resultName + ".jelib";
+ return compareResults(trimmedLib, expectedLib);
+ }
+
+ static void trimLibToCell(String inLibFile, String outLibFile, String cellName)
+ {
+ try
+ {
+ LineNumberReader lineReader = new LineNumberReader(new FileReader(inLibFile));
+ PrintWriter printWriter = new PrintWriter(new BufferedWriter(new FileWriter(outLibFile)));
+ boolean inCell = false;
+ for(;;)
+ {
+ String buf = lineReader.readLine();
+ if (buf == null) break;
+ if (!inCell)
+ {
+ if (buf.startsWith("C"))
+ {
+ if (buf.substring(1).startsWith(cellName))
+ inCell = true;
+ }
+ }
+ if (inCell)
+ printWriter.println(buf);
+ if (buf.startsWith("X")) inCell = false;
+ }
+ printWriter.close();
+ lineReader.close();
+ } catch (IOException e)
+ {
+ System.out.println("Error reading " + inLibFile);
+ return;
+ }
+ }
+
+ /**
+ * Method to remove a given string from each file line if the line starts with it.
+ * @param inLibFile the original file
+ * @param outLibFile the modified file
+ * @param key String to remove
+ */
+ public static void removeLines(String inLibFile, String outLibFile, String key)
+ {
+ try
+ {
+ LineNumberReader lineReader = new LineNumberReader(new FileReader(inLibFile));
+ PrintWriter printWriter = new PrintWriter(new BufferedWriter(new FileWriter(outLibFile)));
+ for(;;)
+ {
+ String buf = lineReader.readLine();
+ if (buf == null) break;
+ if (buf.length() == 0) continue;
+
+ if (buf.startsWith(key)) continue; // key found
+ printWriter.println(buf);
+ }
+ printWriter.close();
+ lineReader.close();
+ } catch (IOException e)
+ {
+ System.out.println("Error reading " + inLibFile);
+ return;
+ }
+ }
+
+ /**
+ * Method to remove first character from each file line if it matches with any of the given keys
+ * and it writes a new file.
+ * @param inLibFile the original file
+ * @param outLibFile the modified file
+ * @param lineKeys Key characters
+ */
+ public static void removeLines(String inLibFile, String outLibFile, char [] lineKeys)
+ {
+ try
+ {
+ LineNumberReader lineReader = new LineNumberReader(new FileReader(inLibFile));
+ PrintWriter printWriter = new PrintWriter(new BufferedWriter(new FileWriter(outLibFile)));
+ for(;;)
+ {
+ String buf = lineReader.readLine();
+ if (buf == null) break;
+ if (buf.length() == 0) continue;
+
+ char key = buf.charAt(0);
+ boolean found = false;
+ for(int i=0; i<lineKeys.length; i++)
+ {
+ if (lineKeys[i] == key) { found = true; break; }
+ }
+ if (found) continue;
+ printWriter.println(buf);
+ }
+ printWriter.close();
+ lineReader.close();
+ } catch (IOException e)
+ {
+ System.out.println("Error reading " + inLibFile);
+ return;
+ }
+ }
+
+ /**
+ * Method to compare two text files.
+ * @param file1 the first file.
+ * @param file2 the second file.
+ * @return true if they are the same, false if they differ.
+ */
+ public static boolean compareResults(String file1, String file2)
+ {
+ String reason = null;
+ LineNumberReader lineReader1 = null;
+ try
+ {
+ lineReader1 = new LineNumberReader(new FileReader(file1));
+ } catch (IOException e)
+ {
+ System.out.println("Cannot find file " + file1);
+ return false;
+ }
+ LineNumberReader lineReader2 = null;
+ try
+ {
+ lineReader2 = new LineNumberReader(new FileReader(file2));
+ } catch (IOException e)
+ {
+ System.out.println("Cannot find file " + file2);
+ try
+ {
+ lineReader1.close();
+ } catch (IOException e2) {}
+ return false;
+ }
+ try
+ {
+ for(;;)
+ {
+ String buf1 = lineReader1.readLine();
+ String buf2 = lineReader2.readLine();
+ if (buf1 == null && buf2 == null) break;
+ if (buf1 == null || buf2 == null)
+ {
+ reason = "Files have unequal length";
+ break;
+ }
+ if (!buf1.equals(buf2))
+ {
+ reason = "Line " + lineReader1.getLineNumber() + " differs";
+ break;
+ }
+ }
+ lineReader1.close();
+ lineReader2.close();
+ } catch (IOException e)
+ {
+ System.out.println("Error reading files");
+ return false;
+ }
+ if (reason != null) System.out.println("*** EXPECTED RESULTS IN " + file2 + " DO NOT MATCH " + file1 + ": " + reason);
+ return reason == null;
+ }
+
+ /**
+ * Method to compare two binary files.
+ * @param index the index of the image (-1 if it is not relevant).
+ * @param file the first file.
+ * @param exFile the second file.
+ * @return true if they are the same, false if they differ.
+ */
+ public static boolean compareImages(int index, String file, String exFile)
+ {
+ String panelName = (index < 0) ? "" : " Panel " + index;
+ BufferedImage image;
+ try
+ {
+ image = ImageIO.read(TextUtils.makeURLToFile(file));
+ } catch (IOException e)
+ {
+ System.out.println("ERROR Reading " + file + " (" + e.getMessage() + ")");
+ return false;
+ }
+ BufferedImage exImage;
+ try
+ {
+ exImage = ImageIO.read(TextUtils.makeURLToFile(exFile));
+ } catch (IOException e)
+ {
+ System.out.println("ERROR Reading " + exFile + " (" + e.getMessage() + ")");
+ return false;
+ }
+ int wid = image.getWidth(null);
+ int hei = image.getHeight(null);
+ int exWid = exImage.getWidth(null);
+ int exHei = exImage.getHeight(null);
+ double ratioX = 1, ratioY = 1;
+ if (wid != exWid || hei != exHei)
+ {
+ System.out.println("WARNING:" + panelName + " image in file " + file + " does not match expected image in file " + exFile);
+ System.out.println(" " + panelName + " image is " + wid + "x" + hei + " but expected image is " + exWid + "x" + exHei);
+ if (wid != exWid) ratioX = exWid / (double)wid;
+ if (hei != exHei) ratioY = exHei / (double)hei;
+ }
+
+ for(int y=0; y<hei; y++)
+ {
+ int trueY = (int)Math.round(y * ratioY);
+ for(int x=0; x<wid; x++)
+ {
+ int trueX = (int)Math.round(x * ratioX);
+ int c = image.getRGB(x, y) & 0xFFFFFF;
+ int exC = exImage.getRGB(trueX, trueY) & 0xFFFFFF;
+ if (c != exC)
+ {
+ String msg = "ERROR: ";
+ if (wid == exWid && hei == exHei)
+ {
+ System.out.println(msg + panelName + " image in file " + file + " does not match expected image in file " + exFile);
+ msg = "";
+ }
+ System.out.println(msg + "First pixel difference is at (" + x + "," + y +") where color is "+
+ ((c>>16)&0xFF)+"/"+((c>>8)&0xFF)+"/"+(c&0xFF) + " but expected color at (" + trueX + "," + trueY +") is "+
+ ((exC>>16)&0xFF)+"/"+((exC>>8)&0xFF)+"/"+(exC&0xFF));
+ return false;
+ }
+ }
+ }
+ return true;
+ }
+
+ /**
+ * Method to ensure output directory is available and it also initializes the messages file.
+ * @return String Root path to the current test location.
+ */
+ String createMessageOutput()
+ {
+ // initialization
+ String testParameter = properDirectory(getRegressionPath(), getClass());
+ String outputDir = outputDir(getRegressionPath(), testParameter);
+ ensureOutputDirectory(outputDir);
+ MessagesStream.getMessagesStream().save(outputDir + getLogName());
+ return testParameter;
+ }
+}
diff --git a/com/sun/electric/tool/user/tests/CommonSignalAnalysisTest.java b/com/sun/electric/tool/user/tests/CommonSignalAnalysisTest.java
new file mode 100644
index 0000000..12d0196
--- /dev/null
+++ b/com/sun/electric/tool/user/tests/CommonSignalAnalysisTest.java
@@ -0,0 +1,159 @@
+/* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: TimingAnalysisTest.java
+ *
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.user.tests;
+
+import com.sun.electric.tool.user.User;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+public class CommonSignalAnalysisTest extends AbstractTest
+{
+ private String name, vlFile, libFile;
+
+ /** Creates a new instance of TimingAnalysisTest */
+ public CommonSignalAnalysisTest(String name)
+ {
+ super(name);
+ }
+
+ public CommonSignalAnalysisTest(String name, String vlFile, String libFile)
+ {
+ super(name);
+ this.name = name;
+ this.vlFile = vlFile;
+ this.libFile = libFile;
+ }
+
+ public static List<AbstractTest> getTests()
+ {
+ List<AbstractTest> list = new ArrayList<AbstractTest>();
+ list.add(new CommonSignalAnalysisTest("det_msff_12x_testvalue", "test.vL", "u1.lib"));
+ list.add(new CommonSignalAnalysisTest("gate_basic_fourflops", "fourflops.vS", "u1.lib"));
+ list.add(new CommonSignalAnalysisTest("gate_basic_load", "test.vL", "sc2_l.lib"));
+// list.add(new CommonSignalAnalysisTest("gate_instNetList", "test.vL", "sc2_l.lib")); // FAILED
+ list.add(new CommonSignalAnalysisTest("gate_inv_2x_25ff_hiR", "test.vL", "u1.lib"));
+// list.add(new CommonSignalAnalysisTest("gate_inv_2x_25ff_loR", "test.vL", "u1.lib")); // FAILED
+ list.add(new CommonSignalAnalysisTest("gate_inv_16x_25ff_hiR", "test.vL", "u1.lib"));
+// list.add(new CommonSignalAnalysisTest("gate_inv_16x_25ff_loR", "test.vL", "u1.lib")); // FAILED
+// list.add(new CommonSignalAnalysisTest("gate_inv_16x_100ff_hiR", "test.vL", "u1.lib")); // FAILED
+// list.add(new CommonSignalAnalysisTest("gate_inv_16x_100ff_loR", "test.vL", "u1.lib")); // FAILED
+// list.add(new CommonSignalAnalysisTest("gate_inv_16x_100ff_superhiR", "test.vL", "u1.lib")); // FAILED
+ list.add(new CommonSignalAnalysisTest("net_ckt_6ps_25ff_loR", "test.vL", "sc2_l.lib"));
+ list.add(new CommonSignalAnalysisTest("net_dir_const_transfunction", "test.vL", "sc2_l.lib"));
+ list.add(new CommonSignalAnalysisTest("net_dir_non_const_transfunction", "test.vL", "sc2_l.lib"));
+// list.add(new CommonSignalAnalysisTest("stat_fsdseql_16_testvalue", "test.vL", "u1.lib")); // FAILED
+ return list;
+ }
+
+ public static String getOutputDirectory()
+ {
+ return null;
+ }
+
+ public Boolean det_msff_12x_testvalue() { return doIt(); }
+ public Boolean gate_basic_fourflops() { return doIt(); }
+ public Boolean gate_basic_load() { return doIt(); }
+ public Boolean gate_instNetList() { return doIt(); }
+ public Boolean gate_inv_2x_25ff_hiR() { return doIt(); }
+ public Boolean gate_inv_2x_25ff_loR() { return doIt(); }
+ public Boolean gate_inv_16x_25ff_hiR() { return doIt(); }
+ public Boolean gate_inv_16x_25ff_loR() { return doIt(); }
+ public Boolean gate_inv_16x_100ff_hiR() { return doIt(); }
+ public Boolean gate_inv_16x_100ff_loR() { return doIt(); }
+ public Boolean gate_inv_16x_100ff_superhiR() { return doIt(); }
+ public Boolean net_ckt_6ps_25ff_loR() { return doIt(); }
+ public Boolean net_dir_const_transfunction() { return doIt(); }
+ public Boolean net_dir_non_const_transfunction() { return doIt(); }
+ public Boolean stat_fsdseql_16_testvalue() { return doIt(); }
+
+ public Boolean doIt()
+ {
+ if (!hasCSA()) return false;
+
+ String testParameter = createMessageOutput();
+ String path = workingDir(getRegressionPath(), testParameter) + getFunctionName();
+ String fileNameVerilog = path + "/" + vlFile;
+ String fileNameLib = path + "/" + libFile;
+
+ Boolean good = Boolean.FALSE;
+ try
+ {
+ Object obj = csaTestInputMethod.invoke(csaTestClass, fileNameLib, fileNameVerilog, name);
+ if (obj instanceof Boolean)
+ {
+ good = (Boolean)obj;
+ }
+ } catch (Exception e)
+ {
+ System.out.println("Unable to run the CSA test module (" + name + ")");
+ e.printStackTrace(System.out);
+ good = Boolean.FALSE;
+ }
+ return good;
+ }
+
+ /****************************** REFLECTION INTERFACE ******************************/
+
+ private static boolean csaTestChecked = false;
+ private static Class<?> csaTestClass = null;
+ private static Method csaTestInputMethod;
+
+ /**
+ * Method to tell whether CSA is available.
+ * CSA is part of the Oyster timing analyzer.
+ * This method dynamically figures out whether the CSA module is present by using reflection.
+ * @return true if the CSA module is available.
+ */
+ public static boolean hasCSA()
+ {
+ if (!csaTestChecked)
+ {
+ csaTestChecked = true;
+
+ // find the CSA class
+ try
+ {
+ csaTestClass = Class.forName("com.sun.electric.plugins.csa.api.CsaDashInterface");
+ } catch (ClassNotFoundException e)
+ {
+ csaTestClass = null;
+ return false;
+ }
+
+ // find the necessary method on the CSA class
+ try
+ {
+ csaTestInputMethod = csaTestClass.getMethod("csa_regression", new Class[] {String.class, String.class, String.class});
+ } catch (NoSuchMethodException e)
+ {
+ csaTestClass = null;
+ return false;
+ }
+ }
+
+ // if already initialized, return
+ if (csaTestClass == null) return false;
+ return true;
+ }
+}
diff --git a/com/sun/electric/tool/user/tests/CompactionTest.java b/com/sun/electric/tool/user/tests/CompactionTest.java
new file mode 100644
index 0000000..3f74176
--- /dev/null
+++ b/com/sun/electric/tool/user/tests/CompactionTest.java
@@ -0,0 +1,123 @@
+/* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: CompactionTest.java
+ *
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.user.tests;
+
+import com.sun.electric.database.EditingPreferences;
+import com.sun.electric.database.hierarchy.Cell;
+import com.sun.electric.database.hierarchy.Library;
+import com.sun.electric.technology.TechPool;
+import com.sun.electric.tool.compaction.Compaction;
+import com.sun.electric.tool.io.FileType;
+import com.sun.electric.tool.io.input.LibraryFiles;
+import com.sun.electric.tool.user.User;
+import com.sun.electric.util.TextUtils;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Class to test the compaction tool.
+ */
+public class CompactionTest extends AbstractTest
+{
+ public CompactionTest(String name)
+ {
+ super(name, true, false);
+ }
+
+ public static List<AbstractTest> getTests()
+ {
+ List<AbstractTest> list = new ArrayList<AbstractTest>();
+ list.add(new CompactionTest("Regular1"));
+ list.add(new CompactionTest("Regular2"));
+ list.add(new CompactionTest("Regular3"));
+ list.add(new CompactionTest("Spread"));
+ return list;
+ }
+
+ public static String getOutputDirectory()
+ {
+ String rootPath = User.getRegressionPath();
+ if (rootPath == null) return null;
+ return rootPath + "/tools/Compaction/output/";
+ }
+
+ /************************************* Regular1 *********************************************************/
+
+ public boolean Regular1()
+ {
+ return test("compactionTest1", false);
+ }
+
+ /************************************* Regular2 *********************************************************/
+
+ public boolean Regular2()
+ {
+ return test("compactionTest2", false);
+ }
+
+ /************************************* Regular3 *********************************************************/
+
+ public boolean Regular3()
+ {
+ return test("compactionTest3", false);
+ }
+
+ /************************************* Spread *********************************************************/
+
+ public boolean Spread()
+ {
+ return test("spreadTest1", true);
+ }
+
+
+ /************************************* SUPPORT *********************************************************/
+
+ private boolean test(String cellName, boolean spreading)
+ {
+ String testParameter = createMessageOutput();
+
+ // read library
+ EditingPreferences ep = new EditingPreferences(true, TechPool.getThreadTechPool());
+ URL fileURL = TextUtils.makeURLToFile(dataDir(getRegressionPath(), testParameter) + "compactionTests.jelib");
+ String libName = "compactionTests";
+ Library lib = Library.findLibrary(libName);
+ if (lib == null) lib = LibraryFiles.readLibrary(ep, fileURL, libName, FileType.JELIB, true);
+ if (lib == null)
+ {
+ System.out.println("Library " + libName + " not found");
+ return false;
+ }
+
+ // find cell
+ Cell lay = lib.findNodeProto(cellName + "{lay}");
+ if (lay == null)
+ {
+ System.out.println("Cell " + cellName + "{lay} not found");
+ return false;
+ }
+
+ Compaction.compactNow(lay, spreading, new CompareJob(lay));
+ return true;
+ }
+}
diff --git a/com/sun/electric/tool/user/tests/DRCTest.java b/com/sun/electric/tool/user/tests/DRCTest.java
new file mode 100644
index 0000000..98904d2
--- /dev/null
+++ b/com/sun/electric/tool/user/tests/DRCTest.java
@@ -0,0 +1,414 @@
+/* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: DRCTest.java
+ *
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.user.tests;
+
+import com.sun.electric.database.EditingPreferences;
+import com.sun.electric.database.geometry.EPoint;
+import com.sun.electric.database.hierarchy.Cell;
+import com.sun.electric.database.hierarchy.Library;
+import com.sun.electric.database.hierarchy.View;
+import com.sun.electric.database.topology.NodeInst;
+import com.sun.electric.technology.Foundry;
+import com.sun.electric.technology.PrimitiveNode;
+import com.sun.electric.technology.SizeOffset;
+import com.sun.electric.technology.TechPool;
+import com.sun.electric.technology.Technology;
+import com.sun.electric.tool.drc.DRC;
+import com.sun.electric.tool.drc.Quick;
+import com.sun.electric.tool.drc.Schematic;
+import com.sun.electric.tool.generator.layout.LayoutLib;
+import com.sun.electric.tool.user.ErrorLogger;
+import com.sun.electric.tool.user.User;
+import com.sun.electric.util.ElapseTimer;
+import com.sun.electric.util.TextUtils;
+import com.sun.electric.util.math.ECoord;
+
+import java.awt.geom.Point2D;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Class to test the DRC tool.
+ */
+public class DRCTest extends AbstractTest
+{
+ public DRCTest(String name)
+ {
+ super(name);
+ }
+
+ public static List<AbstractTest> getTests()
+ {
+ List<AbstractTest> list = new ArrayList<AbstractTest>();
+ list.add(new DRCTest("Primitive"));
+ list.add(new DRCTest("Layout1"));
+ list.add(new DRCTest("Layout2"));
+ list.add(new DRCTest("Schematic1"));
+ list.add(new DRCTest("Schematic2"));
+ return list;
+ }
+
+ public static String getOutputDirectory()
+ {
+ String rootPath = User.getRegressionPath();
+ if (rootPath == null) return null;
+ return rootPath + "/tools/DRC/output/";
+ }
+
+ /************************************* Primitive *********************************************************/
+
+ /**
+ * Method to test PrimitiveNodes against their DRC rules.
+ * @return true if no DRC errors were found
+ */
+ public Boolean Primitive()
+ {
+ createMessageOutput();
+ return primitiveTechTest();
+ }
+
+ /**
+ * Static version of primitiveTest using Electric's DRC tool. Keep it public for the regressions
+ * @return true if it passes all primitive tests.
+ */
+ public static Boolean primitiveTechTest()
+ {
+ // by implementation of the tests, it is always a p-well process in this regression
+ Boolean passed = Boolean.TRUE;
+ if (!testDRCRules("mocmos", "MOSIS", 20, 20, 8)) passed = Boolean.FALSE;
+ return passed;
+ }
+
+ /**
+ * Method to run DRC tests on Cell. Keep it public for regressions.
+ * @param techName
+ * @param foundryName
+ * @return true if no errors were found
+ */
+ public static boolean testDRCRules(String techName, String foundryName, int ERROR_DEFAULT, int ERROR_EXHAUSTIVE, int ERROR_CELL)
+ {
+ // Make sure the foundry/technology are correct
+ Technology tech = setFoundry(Technology.findTechnology(techName), foundryName);
+ EditingPreferences ep = new EditingPreferences(true, TechPool.getThreadTechPool());
+
+ Cell gallery = builTechLibrary(tech, foundryName, ep);
+ return basicDRCLayoutTestInternal(gallery, ERROR_DEFAULT, 0, ERROR_EXHAUSTIVE, 0, ERROR_CELL, 0,
+ false, DRC.DRCCheckMinArea.AREA_LOCAL);
+ }
+
+ private static Cell builTechLibrary(Technology tech, String foundryName, EditingPreferences ep)
+ {
+ Library lib = Library.newInstance(tech.getTechName()+"-"+foundryName, null);
+
+ List<Cell> cellList = new ArrayList<Cell>();
+
+ // Setting the technology so the correct nodes will be tested
+ Technology theTech = setFoundry(tech, foundryName);
+
+ for(Iterator<PrimitiveNode> it = theTech.getNodes(); it.hasNext(); )
+ {
+ PrimitiveNode pnp = it.next();
+ if (pnp.isNotUsed()) continue;
+ boolean first = true;
+
+ // create the node layers
+ double xS = pnp.getDefWidth(ep) * 2;
+ double yS = pnp.getDefHeight(ep) * 2;
+ if (xS < 3) xS = 3;
+ if (yS < 3) yS = 3;
+ double nodeXPos = -xS*2;
+ Point2D [] pos = new Point2D[4];
+ pos[0] = new Point2D.Double(nodeXPos - xS, -5 + yS);
+ pos[1] = new Point2D.Double(nodeXPos + xS, -5 + yS);
+ pos[2] = new Point2D.Double(nodeXPos - xS, -5 - yS);
+ pos[3] = new Point2D.Double(nodeXPos + xS, -5 - yS);
+
+ SizeOffset so = pnp.getProtoSizeOffset();
+ xS = pnp.getDefWidth(ep) - so.getLowXOffset() - so.getHighXOffset();
+ yS = pnp.getDefHeight(ep) - so.getLowYOffset() - so.getHighYOffset();
+ double [] xsc = new double[4];
+ double [] ysc = new double[4];
+ xsc[0] = xS*1; ysc[0] = yS*1;
+ xsc[1] = xS*2; ysc[1] = yS*1;
+ xsc[2] = xS*1; ysc[2] = yS*2;
+ xsc[3] = xS*2; ysc[3] = yS*2;
+
+ // for multi-cut contacts, make large size be just right for 2 cuts
+ if (pnp.isMulticut())
+ {
+ EPoint min2size = pnp.getMulticut2Size();
+ double min2X = min2size.getLambdaX();
+ double min2Y = min2size.getLambdaY();
+ xsc[1] = min2X;
+ xsc[3] = min2X;
+ ysc[2] = min2Y;
+ ysc[3] = min2Y;
+ }
+ Cell nNp = null;
+ for(int e=0; e<4; e++)
+ {
+ // do not create node if main example had no polygons
+ if (e != 0 && first) continue;
+
+ // square nodes have only two examples
+ if (pnp.isSquare() && (e == 1 || e == 2)) continue;
+ double newXSize = xsc[e] + so.getLowXOffset() + so.getHighXOffset();
+ double newYSize = ysc[e] + so.getLowYOffset() + so.getHighYOffset();
+
+ // create the node cell on the first valid layer
+ if (first)
+ {
+ first = false;
+ String fName = "node-" + pnp.getName() + "{lay}";
+
+ // make sure the node doesn't exist
+ if (lib.findNodeProto(fName) != null)
+ {
+ System.out.println("Warning: multiple nodes named '" + fName + "'");
+ break;
+ }
+
+ nNp = Cell.makeInstance(ep, lib, fName);
+ cellList.add(nNp);
+ if (nNp == null) return null;
+ }
+
+ NodeInst.makeInstance(pnp, ep, EPoint.snap(pos[e]), newXSize, newYSize, nNp);
+ }
+ }
+ Cell gallery = Cell.newInstance(lib, "gallery{lay}");
+ NodeInst ni = null;
+ double y = 0;
+ for (Cell c : cellList)
+ {
+ if (ni != null) // not the first one
+ {
+ y += ni.getBounds().getHeight() * 1.5;
+ }
+ y += c.getBounds().getHeight();
+ ni = LayoutLib.newNodeInst(c, ep, c.getBounds().getWidth(), y, 0, 0, 0, gallery);
+ }
+
+ return gallery;
+ }
+
+ /************************************* Layout1&2 *********************************************************/
+
+ /**
+ * Method to run the simplest DRC test on an existing design
+ * @return true if it passes the test.
+ */
+ public Boolean Layout1()
+ {
+ createMessageOutput();
+ if (basicDRCTest(Technology.getMocmosTechnology(), Foundry.Type.MOSIS, getRegressionPath()+"/data/qThree",
+ "qThreeTop", "qThreeTop.jelib",
+ 4739, 0, // DEFAULT
+ 5027, 0, // EXHAUSTIVE
+ 810, 0, // CELL
+ false, DRC.DRCCheckMinArea.AREA_LOCAL)) return Boolean.TRUE;
+ return Boolean.FALSE;
+ }
+
+ /**
+ * Method to run the simplest DRC test on an existing design
+ * @return true if it passes the test.
+ */
+ public Boolean Layout2()
+ {
+ createMessageOutput();
+ if (basicDRCTest(Technology.getMocmosTechnology(), Foundry.Type.MOSIS, getRegressionPath()+"/data/muddChip",
+ "chip", "MIPS.jelib",
+ 532012, 4444, // DEFAULT
+ 759286, 4444, // EXHAUSTIVE
+ 189, 4444, // CELL
+ false, DRC.DRCCheckMinArea.AREA_LOCAL)) return Boolean.TRUE;
+ return Boolean.FALSE;
+ }
+
+ /**
+ * Method to test DRC on Layout examples. The method is public so it can be used from the script applied
+ * to big examples.
+ * @return true if test was successful
+ */
+ public static boolean basicDRCTest(Technology tech, Foundry.Type foundry, String regressiondata,
+ String testCell, String testlib,
+ int ERROR_DEFAULT, int WARN_DEFAULT, int ERROR_EXHAUSTIVE, int WARN_EXHAUSTIVE,
+ int ERROR_CELL, int WARN_CELL, boolean checkArea, DRC.DRCCheckMinArea areaAlgo)
+ {
+ Cell lay = getCellToDRC(tech, foundry, regressiondata, testCell, testlib);
+ return basicDRCLayoutTestInternal(lay,
+ ERROR_DEFAULT, WARN_DEFAULT,
+ ERROR_EXHAUSTIVE, WARN_EXHAUSTIVE,
+ ERROR_CELL, WARN_CELL, checkArea, areaAlgo);
+ }
+
+ private static Cell getCellToDRC(Technology tech, Foundry.Type foundry, String regressiondata,
+ String testcell, String testlib)
+ {
+ // Make sure the foundry/technology are correct
+ setFoundry(tech, foundry.getName());
+ EditingPreferences ep = new EditingPreferences(true, TechPool.getThreadTechPool());
+ Library rootLib = LayoutLib.openLibForRead(regressiondata+"/"+testlib, ep, true);
+ View view = View.LAYOUT;
+ Cell lay = rootLib.findNodeProto(testcell+view.getAbbreviationExtension());
+ return lay;
+ }
+
+ /************************************* Schematic1&2 *********************************************************/
+
+ /**
+ * Method to run the DRC test on an existing design
+ * @return true if it passes the test.
+ */
+ public Boolean Schematic1()
+ {
+ createMessageOutput();
+ if (basicDRCSchematicTest(getRegressionPath()+"/data/qThree", "qThreeTop", "qThreeTop.jelib", 1050, 2)) return Boolean.TRUE;
+ return Boolean.FALSE;
+ }
+
+ /**
+ * Method to run the DRC test on an existing design
+ * @return true if it passes the test.
+ */
+ public Boolean Schematic2()
+ {
+ createMessageOutput();
+ if (basicDRCSchematicTest(getRegressionPath()+"/data/muddChip", "chip", "MIPS.jelib", 195, 0)) return Boolean.TRUE;
+ return Boolean.FALSE;
+ }
+
+ /**
+ * Method to test DRC schematics. Used by regressions so don't remove
+ * @return true if number of errors and warnings match expected values
+ */
+ public static boolean basicDRCSchematicTest(String regressiondata, String testcell, String testlib,
+ int ERROR_DEFAULT, int WARN_DEFAULT)
+ {
+ EditingPreferences ep = new EditingPreferences(true, TechPool.getThreadTechPool());
+ LayoutLib.openLibForRead(regressiondata + "/" + testlib, ep, true);
+ Library.repairAllLibraries(ep);
+ URL fileURL = TextUtils.makeURLToFile(testlib);
+ String libName = TextUtils.getFileNameWithoutExtension(fileURL);
+ Library rootLib = Library.findLibrary(libName);
+ View view = View.SCHEMATIC;
+ Cell schematic = rootLib.findNodeProto(testcell+view.getAbbreviationExtension());
+ return basicDRCSchematicTestInternal(schematic, ERROR_DEFAULT, WARN_DEFAULT);
+ }
+
+ private static boolean basicDRCSchematicTestInternal(Cell schematic, int ERROR_DEFAULT, int WARN_DEFAULT)
+ {
+ int errorCounts, warnCounts;
+
+ try {
+ if (schematic == null) return false; // error reading the cell
+ DRC.resetDRCDates(false);
+ ElapseTimer timer = ElapseTimer.createInstance();
+ timer.start();
+ ErrorLogger errorLogger = DRC.getDRCErrorLogger(false, null);
+ errorLogger.disablePopups();
+ Schematic.doCheck(errorLogger, schematic, null, new DRC.DRCPreferences(true));
+ errorLogger.termLogging(true);
+ errorCounts = errorLogger.getNumErrors();
+ warnCounts = errorLogger.getNumWarnings();
+ timer.end();
+ System.out.println(errorCounts + " errors and " + warnCounts + " warnings found (took " + timer.toString() + ")");
+ System.out.println();
+ } catch (Exception e) {
+ System.out.println("exception: "+e);
+ e.printStackTrace();
+ return false;
+ }
+
+ boolean good = (errorCounts == ERROR_DEFAULT && warnCounts == WARN_DEFAULT);
+ if (!good) System.out.println("ERROR: Expected " +ERROR_DEFAULT + " errors and " + WARN_DEFAULT + " warnings");
+ return good;
+ }
+
+ /************************************* SUPPORT *********************************************/
+
+ public static boolean basicDRCLayoutTestInternal(Cell lay,
+ int ERROR_DEFAULT, int WARN_DEFAULT,
+ int ERROR_EXHAUSTIVE, int WARN_EXHAUSTIVE,
+ int ERROR_CELL, int WARN_CELL,
+ boolean checkArea, DRC.DRCCheckMinArea areaAlgo)
+ {
+ boolean globalPassed = true;
+
+ try {
+
+ if (lay == null) return false; // error reading the cell
+
+ DRC.DRCPreferences dp = new DRC.DRCPreferences(true);
+
+ // No resolution check for now
+ dp.setResolution(lay.getTechnology(), ECoord.ZERO);
+
+ // No area nor surround checking Since v8.03j, they are not variables stored in library.
+ dp.ignoreAreaCheck = !checkArea;
+ dp.ignoreExtensionRuleChecking = true;
+ dp.storeDatesInMemory = true;
+ dp.minAreaAlgoOption = areaAlgo;
+
+ int[] expectedErrors = {ERROR_DEFAULT, ERROR_CELL, ERROR_EXHAUSTIVE};
+ int[] expectedWarns = {WARN_DEFAULT, WARN_CELL, WARN_EXHAUSTIVE};
+
+ for (DRC.DRCCheckMode mode : DRC.DRCCheckMode.values())
+ {
+ // if expected numbers are -1, then skip the test
+ if (expectedErrors[mode.mode()] == -1) continue;
+
+ System.out.println("------RUNNING " + mode + " MODE -------------");
+ dp.errorType = mode;
+ DRC.resetDRCDates(false);
+ ElapseTimer timer = ElapseTimer.createInstance();
+ timer.start();
+ ErrorLogger errorLogger = Quick.checkDesignRules(dp, lay, null, null);
+ errorLogger.disablePopups();
+ errorLogger.termLogging(true);
+ int errorCounts = errorLogger.getNumErrors();
+ int warnCounts = errorLogger.getNumWarnings();
+ timer.end();
+ System.out.println(errorCounts + " errors and " + warnCounts + " warnings found (took " + timer.toString() + ")");
+
+ // check if passes
+ boolean passed = (errorCounts == expectedErrors[mode.mode()]) &&
+ (warnCounts == expectedWarns[mode.mode()]);
+ if (!passed)
+ {
+ System.out.println("ERROR: Expected " + expectedErrors[mode.mode()] + " errors and " + expectedWarns[mode.mode()] + " warnings");
+ globalPassed = false;
+ }
+ System.out.println();
+ }
+ } catch (Exception e)
+ {
+ System.out.println("exception: " + e);
+ e.printStackTrace();
+ return false;
+ }
+ return globalPassed;
+ }
+}
diff --git a/com/sun/electric/tool/user/tests/ERCTest.java b/com/sun/electric/tool/user/tests/ERCTest.java
new file mode 100644
index 0000000..c6c1eb5
--- /dev/null
+++ b/com/sun/electric/tool/user/tests/ERCTest.java
@@ -0,0 +1,174 @@
+/* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: ERCTest.java
+ *
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.user.tests;
+
+import com.sun.electric.database.EditingPreferences;
+import com.sun.electric.database.hierarchy.Cell;
+import com.sun.electric.database.hierarchy.Library;
+import com.sun.electric.technology.TechPool;
+import com.sun.electric.tool.Job;
+import com.sun.electric.tool.erc.ERCAntenna;
+import com.sun.electric.tool.erc.ERCWellCheck;
+import com.sun.electric.tool.generator.layout.LayoutLib;
+import com.sun.electric.tool.user.User;
+import com.sun.electric.util.TextUtils;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Class to test the ERC tool.
+ */
+public class ERCTest extends AbstractTest
+{
+ public ERCTest(String name)
+ {
+ super(name);
+ }
+
+ public static List<AbstractTest> getTests()
+ {
+ List<AbstractTest> list = new ArrayList<AbstractTest>();
+ list.add(new ERCTest("Well1"));
+ list.add(new ERCTest("Well2"));
+ list.add(new ERCTest("Antenna1"));
+ list.add(new ERCTest("Antenna2"));
+ return list;
+ }
+
+ public static String getOutputDirectory()
+ {
+ String rootPath = User.getRegressionPath();
+ if (rootPath == null) return null;
+ return rootPath + "/tools/ERC/output/";
+ }
+
+ /************************************* Well1 *********************************************************/
+
+ public Boolean Well1()
+ {
+ createMessageOutput();
+ Boolean passed = Boolean.TRUE;
+ if (!basicWellTest(getRegressionPath() + "/data/muddChip", "MIPS.jelib", "chip", "", 0, 0)) passed = Boolean.FALSE;
+ return passed;
+ }
+
+ /************************************* Well2 *********************************************************/
+
+ public Boolean Well2()
+ {
+ createMessageOutput();
+ Boolean passed = Boolean.TRUE;
+ if (!basicWellTest(getRegressionPath() + "/data/qThree", "qThreeTop.jelib", "qThreeTop", "", 390, 2)) passed = Boolean.FALSE;
+ return passed;
+ }
+
+ /************************************* Antenna1 *********************************************************/
+
+ public Boolean Antenna1()
+ {
+ createMessageOutput();
+ Boolean passed = Boolean.TRUE;
+ if (!basicERCAntennaTest(getRegressionPath() + "/data/muddChip", "MIPS.jelib", "chip", "", 1039)) passed = Boolean.FALSE;
+ return passed;
+ }
+
+ /************************************* Antenna2 *********************************************************/
+
+ public Boolean Antenna2()
+ {
+ createMessageOutput();
+ Boolean passed = Boolean.TRUE;
+ if (!basicERCAntennaTest(getRegressionPath() + "/data/qThree", "qThreeTop.jelib", "qThreeTop", "", 8)) passed = Boolean.FALSE;
+ return passed;
+ }
+
+ /************************************* SUPPORT *********************************************/
+
+ /**
+ * Basic ERC Test. Must be public for call from regression
+ */
+ public static boolean basicERCAntennaTest(String regressionData, String libNameIO, String cellName, String logName, int numErrors)
+ {
+ Cell lay = prepareERCTests(regressionData, libNameIO, cellName);
+ if (lay == null)
+ {
+ System.out.println("Layout cell '" + cellName + "' not found");
+ return false;
+ }
+
+ ERCAntenna.AntennaPreferences antennaPrefs = new ERCAntenna.AntennaPreferences(false, lay.getDatabase().getTechPool());
+ antennaPrefs.disablePopups = true;
+ int err = ERCAntenna.checkERCAntenna(lay, antennaPrefs, null);
+ boolean passed = (numErrors == err);
+ if (!passed)
+ System.out.println("ERC ANTENNA FOUND " + err + " ERRORS BUT EXPECTED " + numErrors);
+ return passed;
+ }
+
+ /**
+ * Basic ERC Test. Must be public for call from regression
+ */
+ public static boolean basicWellTest(String regressionData, String libNameIO, String cellName, String logName, int numErrors, int numOfThreads)
+ {
+ System.out.println("Running ERC Well Check");
+ Job.setDebug(true);
+
+ Cell lay = prepareERCTests(regressionData, libNameIO, cellName);
+ if (lay == null)
+ {
+ System.out.println("Layout cell '" + cellName + "' not found");
+ return false;
+ }
+
+ ERCWellCheck.WellCheckPreferences prefs = new ERCWellCheck.WellCheckPreferences(true);
+ prefs.drcCheck = false;
+ prefs.pWellCheck = 1;
+ prefs.nWellCheck = 1;
+ prefs.maxProc = numOfThreads;
+ prefs.disablePopups = true;
+
+ int err = ERCWellCheck.checkERCWell(lay, prefs);
+ boolean passed = (numErrors == err);
+ if (!passed)
+ System.out.println("ERC FOUND " + err + " ERRORS BUT EXPECTED " + numErrors);
+
+ return passed;
+ }
+
+ private static Cell prepareERCTests(String regressionData, String libNameIO, String cellName)
+ {
+ Cell lay = null;
+ try
+ {
+ EditingPreferences ep = new EditingPreferences(true, TechPool.getThreadTechPool());
+ LayoutLib.openLibForRead(regressionData + "/" + libNameIO, ep, true);
+
+ URL fileURL = TextUtils.makeURLToFile(libNameIO);
+ String libName = TextUtils.getFileNameWithoutExtension(fileURL);
+ Library rootLib = Library.findLibrary(libName);
+ lay = rootLib.findNodeProto(cellName + "{lay}");
+ } catch (Exception e) { e.printStackTrace(); }
+ return lay;
+ }
+}
diff --git a/com/sun/electric/tool/user/tests/ExportForeignTest.java b/com/sun/electric/tool/user/tests/ExportForeignTest.java
new file mode 100644
index 0000000..7d7560f
--- /dev/null
+++ b/com/sun/electric/tool/user/tests/ExportForeignTest.java
@@ -0,0 +1,483 @@
+/* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: ExportForeignTest.java
+ *
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.user.tests;
+
+import com.sun.electric.database.EditingPreferences;
+import com.sun.electric.database.hierarchy.Cell;
+import com.sun.electric.database.hierarchy.EDatabase;
+import com.sun.electric.database.hierarchy.Library;
+import com.sun.electric.database.variable.VarContext;
+import com.sun.electric.database.variable.Variable;
+import com.sun.electric.technology.TechPool;
+import com.sun.electric.technology.Technology;
+import com.sun.electric.tool.Job;
+import com.sun.electric.tool.generator.layout.LayoutLib;
+import com.sun.electric.tool.io.FileType;
+import com.sun.electric.tool.io.input.LibraryFiles;
+import com.sun.electric.tool.io.output.DXF;
+import com.sun.electric.tool.io.output.EDIF.EDIFPreferences;
+import com.sun.electric.tool.io.output.Output;
+import com.sun.electric.tool.io.output.Output.OutputPreferences;
+import com.sun.electric.tool.io.output.Spice;
+import com.sun.electric.tool.io.output.Telesis.TelesisPreferences;
+import com.sun.electric.tool.io.output.Verilog;
+import com.sun.electric.tool.lang.EvalJavaBsh;
+import com.sun.electric.tool.simulation.SimulationTool;
+import com.sun.electric.tool.user.MessagesStream;
+import com.sun.electric.tool.user.User;
+import com.sun.electric.tool.user.UserInterfaceMain;
+import com.sun.electric.tool.user.menus.FileMenu;
+import com.sun.electric.tool.user.projectSettings.ProjSettings;
+import com.sun.electric.util.TextUtils;
+
+import java.io.File;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Class to test foreign-file export.
+ */
+public class ExportForeignTest extends AbstractTest
+{
+ public ExportForeignTest(String name)
+ {
+ super(name);
+ }
+
+ public ExportForeignTest(String name, boolean interactive)
+ {
+ super(name, false, interactive);
+ }
+
+ public static List<AbstractTest> getTests()
+ {
+ List<AbstractTest> list = new ArrayList<AbstractTest>();
+ list.add(new ExportForeignTest("CIF1"));
+ list.add(new ExportForeignTest("CIF2"));
+ list.add(new ExportForeignTest("DXF"));
+ list.add(new ExportForeignTest("EAGLE"));
+ list.add(new ExportForeignTest("ECAD"));
+ list.add(new ExportForeignTest("EDIF"));
+ list.add(new ExportForeignTest("ESIM"));
+ list.add(new ExportForeignTest("FastHenry"));
+ list.add(new ExportForeignTest("GDS"));
+ list.add(new ExportForeignTest("L"));
+ list.add(new ExportForeignTest("LEFDEF"));
+ list.add(new ExportForeignTest("Mossim"));
+ list.add(new ExportForeignTest("PADS"));
+ list.add(new ExportForeignTest("PAL"));
+ list.add(new ExportForeignTest("PNG", true));
+ list.add(new ExportForeignTest("Silos"));
+ list.add(new ExportForeignTest("Spice1"));
+ list.add(new ExportForeignTest("Spice2"));
+ list.add(new ExportForeignTest("Spice3"));
+ if (EvalJavaBsh.hasBeanShell())
+ {
+ list.add(new ExportForeignTest("Spice4"));
+ list.add(new ExportForeignTest("Spice4_C"));
+ }
+ list.add(new ExportForeignTest("SpiceBus"));
+ list.add(new ExportForeignTest("STL"));
+ list.add(new ExportForeignTest("SVG"));
+ list.add(new ExportForeignTest("Tegas"));
+ list.add(new ExportForeignTest("Telesis"));
+ list.add(new ExportForeignTest("Verilog1"));
+ list.add(new ExportForeignTest("Verilog2"));
+ list.add(new ExportForeignTest("Verilog3"));
+ list.add(new ExportForeignTest("Verilog4"));
+ list.add(new ExportForeignTest("Verilog5"));
+ list.add(new ExportForeignTest("Verilog6"));
+ return list;
+ }
+
+ public static String getOutputDirectory()
+ {
+ String rootPath = User.getRegressionPath();
+ if (rootPath == null) return null;
+ return rootPath + "/tools/Database/output/";
+ }
+
+ public Boolean CIF1()
+ {
+ return exportGDS_CIF("cif", getRegressionPath()+"/data/qThree", "qThreeTop.jelib", "qThreeTop", getRegressionPath()+"/tools/IO/output/", 750, 0);
+ }
+
+ public Boolean CIF2()
+ {
+ return exportGDS_CIF("cif", getRegressionPath()+"/data/muddChip", "MIPS.jelib", "chip", getRegressionPath()+"/tools/IO/output/", 5748, 0);
+ }
+
+ public Boolean DXF()
+ {
+ return runExportTest(getRegressionPath(), "DXFOut.log", "DXFTest1.dxf", "DXFTest", FileType.DXF);
+ }
+
+ public Boolean EAGLE()
+ {
+ return runExportTest(getRegressionPath(), "EAGLEOut.log", "EagleTest1.txt", "EaglePadsECADTest{sch}", FileType.EAGLE);
+ }
+
+ public Boolean ECAD()
+ {
+ return runExportTest(getRegressionPath(), "ECADOut.log", "ECADTest1.enl", "EaglePadsECADTest{sch}", FileType.ECAD);
+ }
+
+ public Boolean EDIF()
+ {
+ return runExportTest(getRegressionPath(), "EDIFOut.log", "EDIFTest1.edif", "Bus{sch}", FileType.EDIF);
+ }
+
+ public Boolean ESIM()
+ {
+ return runExportTest(getRegressionPath(), "ESIMOut.log", "SimTest1.sim", "SimTest{lay}", FileType.ESIM);
+ }
+
+ public Boolean FastHenry()
+ {
+ return runExportTest(getRegressionPath(), "FastHenryOut.log", "FastHenryTest1.inp", "FastHenryTest{lay}", FileType.FASTHENRY);
+ }
+
+ public Boolean GDS()
+ {
+ return exportGDS_CIF("gds", getRegressionPath()+"/tools/IO/data/libs", "simpleDRCTest.jelib", "NoErrorsOnPins", getRegressionPath()+"/tools/IO/output/", 0, 0);
+ }
+
+ public Boolean L()
+ {
+ return runExportTest(getRegressionPath(), "LOut.log", "LTest1.L", "LTest{lay}", FileType.L);
+ }
+
+ public Boolean LEFDEF()
+ {
+ Boolean result1 = runExportTest(getRegressionPath(), "LEFOut.log", "LEFTest1.lef", "LEFTest{lay}", FileType.LEF);
+ Boolean result2 = runExportTest(getRegressionPath(), "DEFOut.log", "DEFTest1.lef", "LEFTest{lay}", FileType.DEF);
+ return Boolean.valueOf(result1.booleanValue() && result2.booleanValue());
+ }
+
+ public Boolean Mossim()
+ {
+ return runExportTest(getRegressionPath(), "MossimOut.log", "MOSSIMTest1.ntk", "MOSSIMTest{lay}", FileType.MOSSIM);
+ }
+
+ public Boolean PADS()
+ {
+ return runExportTest(getRegressionPath(), "PADSOut.log", "PadsTest1.asc", "EaglePadsECADTest{sch}", FileType.PADS);
+ }
+
+ public Boolean PAL()
+ {
+ return runExportTest(getRegressionPath(), "PALOut.log", "PalTest1.pal", "PalTest{sch}", FileType.PAL);
+ }
+
+ public Boolean PNG()
+ {
+ // do not run in regressions...needs display
+ if (!(Job.getExtendedUserInterface() instanceof UserInterfaceMain)) return Boolean.TRUE;
+
+ return runExportTestFromMenu(getRegressionPath(), "PNGOut.log", "PNGTest1.png", "PNGTest1{lay}", null);
+ }
+
+ public Boolean Silos()
+ {
+ return runExportTest(getRegressionPath(), "SilosOut.log", "SilosTest1.sil", "SilosTest{sch}", FileType.SILOS);
+ }
+
+ public Boolean Spice1()
+ {
+ return basicSpice(getRegressionPath(), "SpiceOut1.log", "SpiceHOut1.spi", "SpiceTest1{lay}",
+ SimulationTool.SpiceEngine.SPICE_ENGINE_H, SimulationTool.SpiceParasitics.RC_CONSERVATIVE,
+ SimulationTool.SpiceGlobal.USEGLOBALBLOCK, false, false);
+ }
+
+ public Boolean Spice2()
+ {
+ return basicSpice(getRegressionPath(), "SpiceOut2.log", "SpiceHOut2.spi", "SpiceTest2{sch}",
+ SimulationTool.SpiceEngine.SPICE_ENGINE_H, SimulationTool.SpiceParasitics.RC_CONSERVATIVE,
+ SimulationTool.SpiceGlobal.USEGLOBALBLOCK, false, false);
+ }
+
+ public Boolean Spice3()
+ {
+ return basicSpice(getRegressionPath(), "SpiceOut3.log", "Spice3Out1.spi", "SpiceTest2{sch}",
+ SimulationTool.SpiceEngine.SPICE_ENGINE_3, SimulationTool.SpiceParasitics.RC_CONSERVATIVE,
+ SimulationTool.SpiceGlobal.USESUBCKTPORTS, false, false);
+ }
+
+ public Boolean Spice4()
+ {
+ return basicSpice(getRegressionPath(), "SpiceOut4.log", "SpiceHOut4.spi", "SpiceTest4{sch}",
+ SimulationTool.SpiceEngine.SPICE_ENGINE_H, SimulationTool.SpiceParasitics.RC_CONSERVATIVE,
+ SimulationTool.SpiceGlobal.USEGLOBALBLOCK, false, false);
+ }
+
+ public Boolean Spice4_C()
+ {
+ return basicSpice(getRegressionPath(), "SpiceHOut4_c.log", "SpiceHOut4_c.spi", "SpiceTest4{sch}",
+ SimulationTool.SpiceEngine.SPICE_ENGINE_H, SimulationTool.SpiceParasitics.RC_CONSERVATIVE,
+ SimulationTool.SpiceGlobal.USEGLOBALBLOCK, false, true);
+ }
+
+ public Boolean SpiceBus()
+ {
+ return basicSpice(getRegressionPath(), "SpiceBus.log", "SpiceBus.spi", "Bus{sch}",
+ SimulationTool.SpiceEngine.SPICE_ENGINE_H, SimulationTool.SpiceParasitics.RC_CONSERVATIVE,
+ SimulationTool.SpiceGlobal.USESUBCKTPORTS, false, false);
+ }
+
+ public Boolean STL()
+ {
+ return runExportTest(getRegressionPath(), "STLOut.log", "STLTest.stl", "STLTest{lay}", FileType.STL);
+ }
+
+ public Boolean SVG()
+ {
+ return runExportTest(getRegressionPath(), "SVGOut.log", "SVG1.svg", "SVGTest1{lay}", FileType.SVG);
+ }
+
+ public Boolean Tegas()
+ {
+ return runExportTest(getRegressionPath(), "TegasOut.log", "TegasTest1.tdl", "TegasTest{sch}", FileType.TEGAS);
+ }
+
+ public Boolean Telesis()
+ {
+ return runExportTest(getRegressionPath(), "TelesisOut.log", "TelesisTest.txt", "TelesisTest{sch}", FileType.TELESIS);
+ }
+
+ public Boolean Verilog1()
+ {
+ return runExportTest(getRegressionPath(), "Verilog1Out.log", "VerilogFile1.v", "VerilogTest1{sch}", FileType.VERILOG);
+ }
+
+ public Boolean Verilog2()
+ {
+ return runExportTest(getRegressionPath(), "Verilog2Out.log", "VerilogFile2.v", "VerilogTest2{sch}", FileType.VERILOG);
+ }
+
+ public Boolean Verilog3()
+ {
+ return runExportTest(getRegressionPath(), "Verilog3Out.log", "VerilogFile3.v", "VerilogTest3{sch}", FileType.VERILOG);
+ }
+
+ public Boolean Verilog4()
+ {
+ return runExportTest(getRegressionPath(), "Verilog4Out.log", "VerilogFile4.v", "VerilogTest4{sch}", FileType.VERILOG);
+ }
+
+ public Boolean Verilog5()
+ {
+ return runExportTest(getRegressionPath(), "Verilog5Out.log", "VerilogFile5.v", "VerilogTest5{sch}", FileType.VERILOG);
+ }
+
+ public Boolean Verilog6()
+ {
+ return runExportTest(getRegressionPath(), "Verilog6Out.log", "VerilogFile6.v",
+ "VerilogTest6WithVeryLongNameNowIsTheTimeForAllGoodMenToComeToTheAidOfTheParty-1-nowIsTheTimeForAllGoodMenToComeToTheAidOfTheParty-2{lay}",
+ FileType.VERILOG);
+ }
+
+ /************************************* SUPPORT *********************************************/
+
+ /**
+ * Method must be public due to the regressions
+ */
+ public static Boolean exportGDS_CIF(String type, String regName, String libName, String cellName, int expectedE, int expectedW)
+ {
+ return exportGDS_CIF(type, regName, libName, cellName, "", expectedE, expectedW);
+ }
+
+ private static Boolean exportGDS_CIF(String type, String regName, String libName, String cellName, String outputDir, int expectedE, int expectedW)
+ {
+ FileType theType = FileType.findType(type);
+
+ ensureOutputDirectory(outputDir);
+ MessagesStream.getMessagesStream().save(outputDir + type + "LogFile.log");
+
+ try
+ {
+ EditingPreferences ep = new EditingPreferences(true, TechPool.getThreadTechPool());
+ Library rootLib = LayoutLib.openLibForRead(regName + "/" + libName, ep, true);
+ Cell lay = rootLib.findNodeProto(cellName + "{lay}");
+
+ OutputPreferences op = Output.getOutputPreferences(theType, null, true, null);
+ op.disablePopups();
+ Output out = op.doOutput(lay, VarContext.globalContext, outputDir + "output." + type);
+ if (out != null)
+ {
+ System.out.println("Got " + out.getNumErrors() + " errors and " + out.getNumWarnings() + " warnings");
+ if (expectedE != out.getNumErrors() || expectedW != out.getNumWarnings())
+ {
+ System.out.println("BUT EXPECTED " + expectedE + " errors and " + expectedW + " warnings");
+ return Boolean.FALSE;
+ }
+ }
+ return Boolean.TRUE;
+ } catch (Exception e)
+ {
+ System.out.println("Exception: " + e);
+ e.printStackTrace();
+ return Boolean.FALSE;
+ }
+ }
+
+ private static Boolean basicSpice(String rootPath, String logFile, String outputFile, String cellToWrite,
+ SimulationTool.SpiceEngine engine, SimulationTool.SpiceParasitics parasitics, SimulationTool.SpiceGlobal global, boolean noResistors, boolean useCellParams)
+ {
+ Spice.SpicePreferences sp = new Spice.SpicePreferences(true, false);
+ sp.engine = engine;
+ sp.ignoreParasiticResistors = noResistors;
+ sp.parasiticsLevel = parasitics;
+ sp.globalTreatment = global;
+ sp.useCellParameters = useCellParams;
+ return runExportTestFromMenu(rootPath, logFile, outputFile, cellToWrite, sp);
+ }
+
+ private static Boolean runExportTest(String rootPath, String logFile, String outputFile, String cellToWrite, FileType type)
+ {
+ return runExportTestFromMenu(rootPath, logFile, outputFile, cellToWrite, Output.getOutputPreferences(type, null, true, null));
+ }
+
+ private static Boolean runExportTestFromMenu(String rootPath, String logFile, String outputFile, String cellToWrite, Output.OutputPreferences op)
+ {
+ if (op != null) op.disablePopups();
+ String trueRootPath = (rootPath != null) ? (rootPath + "/tools/IO/") : "";
+ return runExportTestInternal(trueRootPath, "data/libs", "netlistTests.jelib", logFile,
+ outputFile, cellToWrite, op, Technology.getMocmosTechnology());
+ }
+
+ /**
+ * Public because it is used in the regressions
+ */
+ public static Boolean runExportTest(String libPath, String libName, String logFile, String outputFile,
+ String cellToWrite, FileType type, String spiceModel, String layTech, String spiceFlags, String spiceLevel, String spiceGlobal)
+ {
+ Output.OutputPreferences op = Output.getOutputPreferences(type, null, true, null);
+ if (type == FileType.SPICE)
+ {
+ Spice.SpicePreferences sp = (Spice.SpicePreferences)op;
+ if (spiceModel != null && !spiceModel.equals(""))
+ sp.engine = SimulationTool.SpiceEngine.valueOf(spiceModel);
+
+ // handle any flags to change preferences
+ if (spiceFlags.contains("p")) sp.ignoreParasiticResistors = true;
+ if (spiceFlags.contains("c")) sp.useCellParameters = true;
+ if (!spiceLevel.equals("")) sp.parasiticsLevel = SimulationTool.SpiceParasitics.valueOf(spiceLevel);
+
+ // Dealing with Spice global setting
+ if (!spiceGlobal.equals("")) sp.globalTreatment = SimulationTool.SpiceGlobal.valueOf(spiceGlobal);
+ }
+
+ return runExportTestInternal("", libPath, libName, logFile, outputFile, cellToWrite, op,
+ Technology.findTechnology(layTech));
+ }
+
+ private static Boolean runExportTestInternal(String trueRootPath, String libPath, String libName, String logFile,
+ String outputFile, String cellToWrite, Output.OutputPreferences op, Technology layTech)
+ {
+ String outputDir = trueRootPath + "output/";
+ ensureOutputDirectory(outputDir);
+ MessagesStream.getMessagesStream().save(outputDir + logFile);
+ ProjSettings.readSettings(new File(trueRootPath + "data/projsettings_" + layTech.getTechName() + ".xml"), EDatabase.currentDatabase(), true, true);
+ EditingPreferences ep = new EditingPreferences(true, TechPool.getThreadTechPool());
+ String destFile = outputDir + outputFile;
+ String expectedFilePath = trueRootPath + "data/expected/" + outputFile;
+
+ Boolean good = Boolean.TRUE;
+ try
+ {
+ // read library
+ URL fileURL = TextUtils.makeURLToFile(trueRootPath + libPath + "/" + libName);
+ Library lib = Library.findLibrary(libName);
+ if (lib == null) lib = LibraryFiles.readLibrary(ep, fileURL, null, FileType.JELIB, true);
+ if (lib == null)
+ {
+ System.out.println("Error loading " + fileURL.getFile());
+ return Boolean.FALSE;
+ }
+ Library.repairAllLibraries(ep);
+ Job.setCurrentLibraryInJob(lib);
+ Cell cell = lib.findNodeProto(cellToWrite);
+ String destFileOrdir = destFile;
+
+ if (op == null)
+ {
+ // PNG format has no OutputPreferences
+ new FileMenu.ExportImage(cell, null, destFile, true);
+
+ // compare results
+ if (!compareImages(-1, destFile, expectedFilePath)) good = Boolean.FALSE;
+ } else
+ {
+ if (op instanceof Spice.SpicePreferences) {
+ ((Spice.SpicePreferences)op).modelFiles = convertVarsToModelFiles(Spice.SPICE_MODEL_FILE_KEY);
+ } else if (op instanceof Verilog.VerilogPreferences) {
+ ((Verilog.VerilogPreferences)op).modelFiles = convertVarsToModelFiles(Verilog.VERILOG_BEHAVE_FILE_KEY);
+ } else if (op instanceof DXF.DXFPreferences) {
+ ((DXF.DXFPreferences)op).tech = Technology.getMocmosTechnology();
+ } else if (op instanceof TelesisPreferences) {
+ destFileOrdir = outputDir; // the name is taken from the cell name
+ } else if (op instanceof EDIFPreferences) {
+ ((EDIFPreferences)op).writeTime = false;
+ }
+ op.includeDateAndVersionInOutput = false;
+
+ // Generate output
+ if (cell != null)
+ {
+ Output out = op.doOutput(cell, null, destFileOrdir, ep);
+ System.out.println("Errors writing: " + out.getNumErrors());
+ System.out.println("Warnings writing: " + out.getNumWarnings());
+ }
+
+ // see if the output is as expected
+ if (!compareResults(destFile, expectedFilePath)) good = Boolean.FALSE;
+ }
+ } catch (Exception e)
+ {
+ // Catching any type of exception
+ e.printStackTrace();
+ good = Boolean.FALSE;
+ }
+ return good;
+ }
+
+ private static Map<Cell,String> convertVarsToModelFiles(Variable.Key varKey)
+ {
+ HashMap<Cell,String> m = new HashMap<Cell,String>();
+ for (Iterator<Library> lit = Library.getLibraries(); lit.hasNext(); )
+ {
+ Library lib = lit.next();
+ for (Iterator<Cell> it = lib.getCells(); it.hasNext(); )
+ {
+ Cell cell = it.next();
+ String unfilteredModelFile = cell.getVarValue(varKey, String.class);
+ if (unfilteredModelFile != null && unfilteredModelFile.length() > 0)
+ m.put(cell, unfilteredModelFile);
+ }
+ }
+ return m;
+ }
+}
diff --git a/com/sun/electric/tool/user/tests/ExtractionTest.java b/com/sun/electric/tool/user/tests/ExtractionTest.java
new file mode 100644
index 0000000..1c8cc0d
--- /dev/null
+++ b/com/sun/electric/tool/user/tests/ExtractionTest.java
@@ -0,0 +1,159 @@
+/* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: ExtractionTest.java
+ *
+ * Copyright (c) 2012, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.user.tests;
+
+import com.sun.electric.database.EditingPreferences;
+import com.sun.electric.database.hierarchy.Cell;
+import com.sun.electric.database.hierarchy.Library;
+import com.sun.electric.technology.TechPool;
+import com.sun.electric.technology.Technology;
+import com.sun.electric.tool.extract.Connectivity;
+import com.sun.electric.tool.io.FileType;
+import com.sun.electric.tool.io.input.LibraryFiles;
+import com.sun.electric.tool.user.ErrorLogger;
+import com.sun.electric.tool.user.User;
+import com.sun.electric.util.TextUtils;
+import com.sun.electric.util.math.ECoord;
+
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.regex.Pattern;
+
+/**
+ * Class to test the node extraction facility.
+ */
+public class ExtractionTest extends AbstractTest
+{
+ public ExtractionTest(String name)
+ {
+ super(name);
+ }
+
+ public static List<AbstractTest> getTests()
+ {
+ List<AbstractTest> list = new ArrayList<AbstractTest>();
+ list.add(new ExtractionTest("Extract1"));
+ list.add(new ExtractionTest("Extract2"));
+ list.add(new ExtractionTest("Extract3"));
+ list.add(new ExtractionTest("Extract4"));
+ list.add(new ExtractionTest("Extract5"));
+ list.add(new ExtractionTest("Extract6"));
+ list.add(new ExtractionTest("Extract7"));
+ list.add(new ExtractionTest("Extract8"));
+ list.add(new ExtractionTest("Extract9"));
+ list.add(new ExtractionTest("Extract10"));
+ return list;
+ }
+
+ public static String getOutputDirectory()
+ {
+ String rootPath = User.getRegressionPath();
+ if (rootPath == null) return null;
+ return rootPath + "/tools/Extraction/output/";
+ }
+
+ public Boolean Extract1() { return commonExtractionTest("Test01"); }
+
+ public Boolean Extract2() { return commonExtractionTest("Test02"); }
+
+ public Boolean Extract3() { return commonExtractionTest("Test03"); }
+
+ public Boolean Extract4() { return commonExtractionTest("Test04"); }
+
+ public Boolean Extract5() { return commonExtractionTest("Test05"); }
+
+ public Boolean Extract6() { return commonExtractionTest("Test06"); }
+
+ public Boolean Extract7() { return commonExtractionTest("Test07"); }
+
+ public Boolean Extract8() { return commonExtractionTest("Test08"); }
+
+ public Boolean Extract9() { return commonExtractionTest("Test09"); }
+
+ public Boolean Extract10() { return commonExtractionTest("Test10"); }
+
+ public static boolean runExtractionTest(String testName)
+ {
+ ExtractionTest t = new ExtractionTest(testName);
+ Class c = t.getClass();
+ boolean good = false;
+ try
+ {
+ Method method = c.getDeclaredMethod(testName, new Class[]{});
+ Object obj = method.invoke(t, new Object[]{});
+ if (obj instanceof Boolean)
+ good = ((Boolean)obj).booleanValue();
+ } catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ return good;
+ }
+
+ private Boolean commonExtractionTest(String cellName)
+ {
+ // initialize
+ String testParameter = createMessageOutput();
+ EditingPreferences ep = new EditingPreferences(true, TechPool.getThreadTechPool());
+ Technology tech = Technology.getMocmosTechnology();
+ setFoundry(tech);
+
+ // read library with test setup
+ URL fileURL = TextUtils.makeURLToFile(dataDir(getRegressionPath(), testParameter) + "ExtractionTests.jelib");
+ String libName = "ExtractionTests";
+ Library rootLib = Library.findLibrary(libName);
+ if (rootLib == null) rootLib = LibraryFiles.readLibrary(ep, fileURL, libName, FileType.JELIB, true);
+ Cell cell = rootLib.findNodeProto(cellName + "{lay}");
+ if (cell == null)
+ {
+ System.out.println("ERROR: Cannot find cell " + cellName + "{lay}");
+ return Boolean.FALSE;
+ }
+
+ // setup extraction parameters
+ ErrorLogger errorLogger = ErrorLogger.newInstance("Node Extraction Test on cell " + cell.getName());
+ boolean recursive = false;
+ double smallestPolygonSize = 0;
+ int activeHandling = 0;
+ boolean gridAlignExtraction = false;
+ ECoord scaledResolution = tech.getFactoryResolution();
+ boolean approximateCuts = false;
+ boolean flattenPcells = false;
+ boolean usePureLayerNodes = false;
+ List<Pattern> pats = new ArrayList<Pattern>();
+
+ // run extraction
+ Connectivity c = new Connectivity(cell, null, ep, errorLogger, smallestPolygonSize, activeHandling,
+ gridAlignExtraction, scaledResolution, approximateCuts, recursive, pats);
+ Cell newCell = c.doExtract(cell, recursive, pats, flattenPcells, usePureLayerNodes, true, null, null, null, null);
+
+ // analyze results
+ if (newCell == null)
+ System.out.println("ERROR: Extraction of cell " + cell.describe(false) + " failed"); else
+ newCell.lowLevelSetCreationDate(new Date(0));
+ cell.rename(cell.getName() + "_ORIGINAL", null);
+ return Boolean.valueOf(compareCellResults(newCell, getResultName()));
+ }
+}
diff --git a/com/sun/electric/tool/user/tests/FakeTestJob.java b/com/sun/electric/tool/user/tests/FakeTestJob.java
new file mode 100644
index 0000000..1b729f3
--- /dev/null
+++ b/com/sun/electric/tool/user/tests/FakeTestJob.java
@@ -0,0 +1,202 @@
+/* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: FakeTestJob.java
+ *
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.user.tests;
+
+import com.sun.electric.database.EditingPreferences;
+import com.sun.electric.database.text.Setting;
+import com.sun.electric.tool.Job;
+import com.sun.electric.tool.JobException;
+import com.sun.electric.tool.io.FileType;
+import com.sun.electric.tool.io.input.LibraryFiles;
+import com.sun.electric.tool.user.ErrorLogger;
+import com.sun.electric.tool.user.User;
+import com.sun.electric.util.ElapseTimer;
+
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import javax.swing.SwingUtilities;
+
+public class FakeTestJob extends Job
+{
+ private List<AbstractTest> list;
+ private boolean result;
+ private int whichTest, numPassed, numFailed;
+ private ErrorLogger errorLogger;
+ private List<URL> requiredLibraries;
+ private static ElapseTimer theTimer;
+
+ public FakeTestJob(AbstractTest test)
+ {
+ this(Collections.singletonList(test));
+ }
+
+ public FakeTestJob(List<AbstractTest> list)
+ {
+ this(list, 0, 0, 0, User.getRegressionPath(), ErrorLogger.newInstance(list.get(0).getClass().getName() + " Tests"));
+ }
+
+ private FakeTestJob(List<AbstractTest> list, int nextTest, int numPassed, int numFailed, String regressionPath, ErrorLogger errorLogs)
+ {
+ // does it have to be change?
+ super("Test " + (list.size() == 1 ? "" : (nextTest+1) + " of " + list.size() + ": ") + list.get(nextTest).getFullTestName(),
+ User.getUserTool(), Job.Type.CHANGE, null, null, Job.Priority.USER);
+ this.list = list;
+ this.numPassed = numPassed;
+ this.numFailed = numFailed;
+ whichTest = nextTest;
+ if (nextTest == 0) theTimer = ElapseTimer.createInstance().start();
+ System.out.println("\n****************** TEST " + list.get(whichTest).getFullTestName());
+ errorLogger = errorLogs;
+ errorLogger.disablePopups();
+ boolean guiTests = (list.get(nextTest) instanceof AbstractGUITest);
+ if (guiTests)
+ {
+ requiredLibraries = new ArrayList<URL>();
+ for (AbstractTest t: list)
+ {
+ if (!(t instanceof AbstractGUITest)) continue;
+ t.setStarterJob(this);
+ requiredLibraries.addAll(((AbstractGUITest)t).getRequiredLibraries(t.workingDir()));
+ }
+ }
+ startJob();
+ }
+
+ @Override
+ public boolean doIt() throws JobException
+ {
+ EditingPreferences ep = getEditingPreferences();
+ AbstractTest test = list.get(whichTest);
+ if (test == null) throw new JobException("Test is null");
+ boolean guiTests = (test instanceof AbstractGUITest);
+ test.setStarterJob(this);
+
+ Setting.SettingChangeBatch restoreBatch = new Setting.SettingChangeBatch();
+ Setting.SettingChangeBatch resetBatch = new Setting.SettingChangeBatch();
+ for (Map.Entry<Setting,Object> e: getDatabase().getSettings().entrySet())
+ {
+ Setting setting = e.getKey();
+ Object value = e.getValue();
+ restoreBatch.add(setting, value);
+ resetBatch.add(setting, setting.getFactoryValue());
+ }
+ getDatabase().implementSettingChanges(resetBatch);
+ try
+ {
+ if (guiTests)
+ {
+ for (URL libFileURL: requiredLibraries)
+ {
+ LibraryFiles.readLibrary(ep, libFileURL, null, FileType.JELIB, false);
+ }
+ } else
+ {
+ Method t = test.getClass().getMethod(test.getFunctionName(), new Class[] {});
+ Object o = t.invoke(test, new Object[] {});
+ if (o != null && o instanceof Boolean) result = ((Boolean)o).booleanValue();
+ }
+ } catch (Exception e)
+ {
+ e.printStackTrace();
+ } finally
+ {
+ getDatabase().implementSettingChanges(restoreBatch);
+ Job.getUserInterface().saveMessages(null);
+ }
+ if (!test.isMultiTask() && !guiTests)
+ updateTestResult(result);
+ if (guiTests)
+ {
+ AbstractGUITest gTest = (AbstractGUITest)test;
+ if (!gTest.phase1()) updateTestResult(false);
+ }
+ return true;
+ }
+
+ @Override
+ public void terminateOK()
+ {
+ AbstractTest test = (AbstractTest)list.get(whichTest);
+ if (!(test instanceof AbstractGUITest)) return;
+ final AbstractGUITest fTest = (AbstractGUITest)test;
+ if (fTest.phase2()) {
+ SwingUtilities.invokeLater(new Runnable()
+ {
+ public void run() { updateTestResult(fTest.phase3()); }
+ });
+ } else
+ {
+ updateTestResult(false);
+ }
+ }
+
+ void updateTestResult(boolean result)
+ {
+ AbstractTest test = list.get(whichTest);
+
+ String msg = "****************** TEST " + test.getFullTestName() + (result ? " PASSED" : " FAILED");
+ System.out.println(msg);
+
+ // update test results
+ if (result) numPassed++; else numFailed++;
+
+ if (result)
+ errorLogger.logWarning(msg, null, -1);
+ else
+ errorLogger.logError(msg, -1);
+
+ // see if there are more tests to run
+ whichTest++;
+ if (whichTest < list.size())
+ {
+ new FakeTestJob(list, whichTest, numPassed, numFailed, User.getRegressionPath(), errorLogger);
+ return;
+ }
+ else
+ errorLogger.termLogging(true);
+
+ // give final result
+ if (numPassed + numFailed == 1)
+ {
+ // ran only 1 test
+ String message = result ? "Test passed" : "Test failed";
+ Job.getUserInterface().showInformationMessage(message, test.getFullTestName());
+ } else
+ {
+ String message = "";
+ if (numPassed > 0) message += numPassed + " tests passed";
+ if (numFailed > 0)
+ {
+ if (message.length() > 0) message += ", ";
+ message += numFailed + " tests failed";
+ }
+ theTimer.end();
+ message += " (took " + theTimer + ")";
+ Job.getUserInterface().showInformationMessage(message, test.getFullTestName());
+ }
+ }
+}
diff --git a/com/sun/electric/tool/user/tests/GenerationTest.java b/com/sun/electric/tool/user/tests/GenerationTest.java
new file mode 100644
index 0000000..29d41de
--- /dev/null
+++ b/com/sun/electric/tool/user/tests/GenerationTest.java
@@ -0,0 +1,606 @@
+ /* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: GenerationTest.java
+ *
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.user.tests;
+
+import com.sun.electric.database.EditingPreferences;
+import com.sun.electric.database.hierarchy.Cell;
+import com.sun.electric.database.hierarchy.Library;
+import com.sun.electric.technology.TechPool;
+import com.sun.electric.technology.Technology;
+import com.sun.electric.tool.drc.DRC;
+import com.sun.electric.tool.drc.Quick;
+import com.sun.electric.tool.extract.LayerCoverageTool;
+import com.sun.electric.tool.generator.PadGenerator;
+import com.sun.electric.tool.generator.ROMGenerator;
+import com.sun.electric.tool.generator.cmosPLA.PLA;
+import com.sun.electric.tool.generator.layout.GateRegression;
+import com.sun.electric.tool.generator.layout.LayoutLib;
+import com.sun.electric.tool.generator.layout.fill.FillGenConfig;
+import com.sun.electric.tool.generator.layout.fill.FillGeneratorTool;
+import com.sun.electric.tool.generator.layout.fill.StitchFillJob;
+import com.sun.electric.tool.generator.layout.fillCell.FillCellGenJob;
+import com.sun.electric.tool.io.FileType;
+import com.sun.electric.tool.io.IOTool;
+import com.sun.electric.tool.io.input.LibraryFiles;
+import com.sun.electric.tool.io.output.Output;
+import com.sun.electric.tool.sc.SilComp;
+import com.sun.electric.tool.user.ErrorLogger;
+import com.sun.electric.tool.user.MessagesStream;
+import com.sun.electric.tool.user.User;
+import com.sun.electric.tool.user.menus.ToolMenu;
+import com.sun.electric.tool.user.tecEditWizard.TechEditWizardData;
+import com.sun.electric.util.TextUtils;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Class to test PLA, PadFrame, ROM, Fill, and other generation tests.
+ */
+public class GenerationTest extends AbstractTest
+{
+ GenerationTest(String name)
+ {
+ super(name);
+ }
+
+ public static List<AbstractTest> getTests()
+ {
+ List<AbstractTest> list = new ArrayList<AbstractTest>();
+ list.add(new GenerationTest("FillTemplate"));
+ list.add(new GenerationTest("FillStitch"));
+ list.add(new GenerationTest("PLA"));
+ list.add(new GenerationTest("PadFrame1"));
+ list.add(new GenerationTest("PadFrame2"));
+ list.add(new GenerationTest("ROM"));
+ list.add(new GenerationTest("SiliconCompiler1"));
+ list.add(new GenerationTest("SiliconCompiler2"));
+ list.add(new GenerationTest("TechEditWizard"));
+ list.add(new GenerationTest("GateGen"));
+ return list;
+ }
+
+ public static String getOutputDirectory()
+ {
+ String rootPath = User.getRegressionPath();
+ if (rootPath == null) return null;
+ return rootPath + "/tools/Generation/output/";
+ }
+
+ /************************************* FillTemplate *********************************************************/
+
+ public Boolean FillTemplate()
+ {
+ return basicTemplateFillTest(getRegressionPath());
+ }
+
+ /**
+ * Method to run Template Fill test. Must be public/static due to regressions.
+ * @param rootPath
+ * @return true if test successfully run.
+ */
+ public static Boolean basicTemplateFillTest(String rootPath)
+ {
+ String trueRootPath = (rootPath != null) ? (rootPath + "/tools/Generation/") : "";
+ String outputDir = trueRootPath + "output/";
+ ensureOutputDirectory(outputDir);
+ MessagesStream.getMessagesStream().save(outputDir + "TemplateFillOut.log");
+
+ int[] cells = {2, 3, 4, 5, 6, 7, 8, 9, 10};
+ double drcSpacingRule = 6;
+ double vddReserve = drcSpacingRule*2;
+ double gndReserve = drcSpacingRule*3;
+
+ // set technology properly
+ Technology tech = Technology.getMocmosTechnology();
+ setFoundry(tech);
+
+ String rootName = "autoFillTemplateLib";
+ FillGenConfig config = new FillGenConfig(tech, FillGeneratorTool.FillTypeEnum.TEMPLATE, rootName,
+ FillGeneratorTool.PERIMETER, 2, 6, 100, 200,
+ true, cells, true, 0.1, drcSpacingRule, false, false, false, 0, FillGenConfig.FillGenType.INTERNAL, -1);
+ config.reserveSpaceOnLayer(tech, 3, vddReserve, FillGeneratorTool.LAMBDA, gndReserve, FillGeneratorTool.LAMBDA);
+ config.reserveSpaceOnLayer(tech, 4, vddReserve, FillGeneratorTool.LAMBDA, gndReserve, FillGeneratorTool.LAMBDA);
+
+ FillCellGenJob job = new FillCellGenJob(null, config, true, new LayerCoverageTool.LayerCoveragePreferences(true));
+
+ // compare results by writing results in a different library
+ Library lib = Library.findLibrary(rootName);
+ boolean sameLib = compareLibraryResults(trueRootPath, rootName, lib,
+ new char [] {'H', 'C', 'F', 'R', 'T', 'O', '#'});
+
+ Cell cell = job.getAutoFilLibrary().findNodeProto("gallery");
+
+ // Make sure the foundry/technology are correct
+ setFoundry(tech);
+
+ // Running DRC now
+ boolean passed = DRCTest.basicDRCLayoutTestInternal(cell, 0, 0, 0, 0, 0, 0, false, DRC.DRCCheckMinArea.AREA_LOCAL);
+
+ // Last messages to print otherwise they might not be seen
+ if (!sameLib)
+ System.out.println("Error: TemplateFill didn't generate expected results");
+ if (!passed)
+ System.out.println("Error: TemplateFill didn't pass DRC");
+
+ return Boolean.valueOf(passed && sameLib);
+ }
+
+ /************************************* FillStitch *********************************************************/
+
+ public Boolean FillStitch()
+ {
+ return Boolean.valueOf(basicStitchFillGenTest(getRegressionPath()));
+ }
+
+ /**
+ * Method to run Stitch Fill test. Must be public/static due to regressions.
+ * @param rootPath if rootPath is not null, then the data path includes tool path
+ * otherwise assume the regression is running locally
+ * @return true if test successfully run.
+ */
+ public static boolean basicStitchFillGenTest(String rootPath)
+ {
+ String trueRootPath = (rootPath != null) ? (rootPath + "/tools/Generation/") : "";
+ String outputDir = trueRootPath + "output/";
+ ensureOutputDirectory(outputDir);
+ MessagesStream.getMessagesStream().save(outputDir + "StitchFillOut.log");
+
+ int expectedNumCells = 1, foundCells;
+ int expectedDRCNumErrors = 0, foundDRCErrors;
+ boolean sameLib = false;
+
+ try
+ {
+ // Check that technology is properly set
+ Technology tech = Technology.getMocmosTechnology();
+ setFoundry(tech);
+ EditingPreferences ep = new EditingPreferences(true, TechPool.getThreadTechPool());
+
+ String libName = "GenerationTests";
+ URL fileURL = TextUtils.makeURLToFile(trueRootPath + "data/libs/GenerationTests.jelib");
+ Library rootLib = Library.findLibrary(libName);
+ if (rootLib == null) rootLib = LibraryFiles.readLibrary(ep, fileURL, libName, FileType.JELIB, true);
+
+ String rootName = "StitchFill";
+ String testcell = rootName + "{doc}";
+ Cell cell = rootLib.findNodeProto(testcell);
+ if (cell == null)
+ {
+ System.out.println("Cell '" + testcell + "' can't be read in basicStitchFillGenTest");
+ return(false); // error reading the cell
+ }
+
+ // running the job
+ fileURL = TextUtils.makeURLToFile(trueRootPath + "output/" + rootName + ".jelib");
+ Library lib = Library.newInstance(rootName, fileURL);
+ StitchFillJob job = new StitchFillJob(cell, lib, true);
+ List<Cell> list = job.getGeneratedCells();
+ foundCells = list.size();
+ assert(foundCells == 1);
+
+ // compare results by writing results in a different library
+ sameLib = compareLibraryResults(trueRootPath, rootName, lib,
+ new char [] {'H', 'C', 'F', 'R', 'T', 'O', '#'});
+
+ // Make sure the foundry/technology are correct
+ setFoundry(tech);
+
+ // Running DRC now
+ boolean passed = DRCTest.basicDRCLayoutTestInternal(cell, 0, 0, 0, 0, 0, 0, false, DRC.DRCCheckMinArea.AREA_LOCAL);
+ foundDRCErrors = (passed) ? 0 : 1; // any positive number would make it
+ } catch (Exception e)
+ {
+ // Catching any time of exception!
+ e.printStackTrace();
+ return false;
+ }
+
+ // 1 warning from gnd, 1 error from vdd
+ boolean noErrors = foundCells == expectedNumCells && foundDRCErrors == expectedDRCNumErrors && sameLib;
+ System.out.println("Expected results: ");
+ System.out.println("\t#cells generated=" + expectedNumCells + "(found="+foundCells+")");
+ System.out.println("\t#DRC errors=" + expectedDRCNumErrors + "(found="+foundDRCErrors+")");
+ System.out.println("\tGenerated same library?: " + sameLib);
+ return noErrors;
+ }
+
+ /************************************* PLA *********************************************************/
+
+ public Boolean PLA()
+ {
+ return Boolean.valueOf(basicPLATest(getRegressionPath()));
+ }
+
+ /**
+ * Method to run basic test for PLA. Must be public/static due to regressions.
+ * @param rootPath the top level of the regressions data.
+ * @return true if test successfully run.
+ */
+ public static boolean basicPLATest(String rootPath)
+ {
+ String trueRootPath = (rootPath != null) ? (rootPath + "/tools/Generation/") : "";
+ String outputDir = trueRootPath + "output/";
+ ensureOutputDirectory(outputDir);
+ MessagesStream.getMessagesStream().save(outputDir + "CMOSPLA1Out.log");
+
+ boolean good = true;
+ try
+ {
+ // initialize
+ setFoundry(Technology.getMocmosTechnology());
+
+ // Generate PLA
+ Library lib = Library.newInstance("CMOSPLA1Result", null);
+ String libDir = trueRootPath + "data/libs/";
+ PLA.generate(lib, "pla", libDir + "/cmos-pla-and-table", libDir + "/cmos-pla-or-table", true, true, true);
+
+ // reset creation dates for consistent output
+ Date zeroDate = new Date(0);
+ for(Iterator<Cell> it = lib.getCells(); it.hasNext(); )
+ {
+ Cell cell = it.next();
+ cell.lowLevelSetCreationDate(zeroDate);
+ cell.lowLevelSetRevisionDate(zeroDate);
+ }
+ lib.getDatabase().backup();
+
+ // compare results by writing results in a different library
+ if (!compareLibraryResults(trueRootPath, "CMOSPLA1", lib,
+ new char [] {'H', 'L', 'F', 'R', 'T', 'O', '#'})) good = false;
+ } catch (Exception e)
+ {
+ // Catching any type of exception
+ e.printStackTrace();
+ good = false;
+ }
+ return good;
+ }
+
+ /************************************* PadFrame1&2 *********************************************************/
+
+ public Boolean PadFrame1()
+ {
+ return Boolean.valueOf(basicPadFrameTest(getRegressionPath(), 1));
+ }
+
+ public Boolean PadFrame2()
+ {
+ return Boolean.valueOf(basicPadFrameTest(getRegressionPath(), 2));
+ }
+
+ /**
+ * Method to run the PadFrame regression. Must be public/static due to regressions.
+ * @param rootPath
+ * @param testNumber 1 or 2 for the two tests.
+ * @return true if basic pad frame test passes.
+ */
+ public static boolean basicPadFrameTest(String rootPath, int testNumber)
+ {
+ String trueRootPath = (rootPath != null) ? rootPath + "/tools/Generation/" : "";
+ String outputDir = trueRootPath + "output/";
+ ensureOutputDirectory(outputDir);
+ MessagesStream.getMessagesStream().save(outputDir + "PadFrame" + testNumber + "Out.log");
+ EditingPreferences ep = new EditingPreferences(true, TechPool.getThreadTechPool());
+
+ boolean good = true;
+ try
+ {
+ // initialize
+ setFoundry(Technology.getMocmosTechnology());
+
+ // read library
+ String libName = "Generation" + testNumber + "Tests";
+ URL fileURL = TextUtils.makeURLToFile(trueRootPath + "data/libs/GenerationTests.jelib");
+ Library lib = Library.findLibrary(libName);
+ if (lib == null) lib = LibraryFiles.readLibrary(ep, fileURL, libName, FileType.JELIB, true);
+
+ // Generate Pad Frame
+ String arrFile = "pads4u.arr";
+ if (testNumber == 2) arrFile = "pads4uGapCopy.arr";
+ PadGenerator.makePadFrameUseJob(lib, trueRootPath + "data/libs/" + arrFile, null, ep);
+
+ // reset creation date for consistent output
+ Cell c = lib.findNodeProto("padframe");
+ if (c != null)
+ {
+ c.lowLevelSetCreationDate(new Date(0));
+ c.lowLevelSetRevisionDate(new Date(0));
+ }
+ lib.getDatabase().backup();
+
+ // write results
+ String destLib = outputDir + "PadFrame" + testNumber + "Result.jelib";
+ Output.saveJelib(destLib, lib);
+
+ // remove header lines from the library
+ String trimmedLib = outputDir + "PadFrame" + testNumber + "ResultPartial.jelib";
+ trimLibToCell(destLib, trimmedLib, "padframe");
+
+ // see if the library is as expected
+ String expectedLib = trueRootPath + "data/expected/PadFrame" + testNumber + "Result.jelib";
+ if (!compareResults(trimmedLib, expectedLib)) good = false;
+ } catch (Exception e)
+ {
+ // Catching any time of exception!
+ e.printStackTrace();
+ good = false;
+ }
+
+ return good;
+ }
+
+ /************************************* ROM *********************************************************/
+
+ public Boolean ROM()
+ {
+ return Boolean.valueOf(basicROMTest(getRegressionPath()));
+ }
+
+ /**
+ * Method to run ROM generation test. Must be public/static due to regressions.
+ * @param rootPath if rootPath is not null, then the data path includes tool path
+ * otherwise assume the regression is running locally
+ * @return true if test successfully run.
+ */
+ public static boolean basicROMTest(String rootPath)
+ {
+ String trueRootPath = (rootPath != null) ? rootPath + "/tools/Generation/" : "";
+ String outputDir = trueRootPath + "output/";
+ ensureOutputDirectory(outputDir);
+ MessagesStream.getMessagesStream().save(outputDir + "ROM1Out.log");
+
+ boolean good = true;
+ try
+ {
+ // initialize
+ setFoundry(Technology.getMocmosTechnology());
+
+ // generate ROM
+ Library lib = Library.newInstance("rom", null);
+ EditingPreferences ep = new EditingPreferences(true, lib.getTechPool());
+ String libDir = trueRootPath + "data/libs/";
+ ROMGenerator.generateROM(lib, libDir + "rom.txt", ep);
+
+ // reset creation dates for consistent output
+ Date zeroDate = new Date(0);
+ for(Iterator<Cell> it = lib.getCells(); it.hasNext(); )
+ {
+ Cell cell = it.next();
+ cell.lowLevelSetCreationDate(zeroDate);
+ cell.lowLevelSetRevisionDate(zeroDate);
+ }
+ lib.getDatabase().backup();
+
+ // compare results by writing results in a different library
+ if (!compareLibraryResults(trueRootPath, "ROM1", lib,
+ new char [] {'H', 'L', 'F', 'R', 'T', 'O', '#'})) good = false;
+ } catch (Exception e)
+ {
+ // Catching any time of exception!
+ e.printStackTrace();
+ good = false;
+ }
+ return good;
+ }
+
+ /************************************* SiliconCompiler1&2 *********************************************************/
+
+ public Boolean SiliconCompiler1()
+ {
+ return Boolean.valueOf(basicSiliconCompilerTest(getRegressionPath(), 1));
+ }
+
+ public Boolean SiliconCompiler2()
+ {
+ return Boolean.valueOf(basicSiliconCompilerTest(getRegressionPath(), 2));
+ }
+
+ /**
+ * Method to run Silicon Compiler test. Must be public/static due to regressions.
+ * @param rootPath if rootPath is not null, then the data path includes tool path
+ * otherwise assume the regression is running locally
+ * @return true if test successfully run.
+ */
+ public static boolean basicSiliconCompilerTest(String rootPath, int testNumber)
+ {
+ String trueRootPath = (rootPath != null) ? rootPath + "/tools/Generation/" : "";
+ String outputDir = trueRootPath + "output/";
+ ensureOutputDirectory(outputDir);
+ MessagesStream.getMessagesStream().save(outputDir + "SiliconCompilation" + testNumber + "Out.log");
+
+ boolean good = true;
+ try
+ {
+ // initialize
+ setFoundry(Technology.getMocmosTechnology());
+ EditingPreferences ep = new EditingPreferences(true, TechPool.getThreadTechPool());
+
+ // read library
+ String libName = "GenerationTests";
+ URL fileURL = TextUtils.makeURLToFile(trueRootPath + "data/libs/GenerationTests.jelib");
+ Library lib = Library.findLibrary(libName);
+ if (lib == null) lib = LibraryFiles.readLibrary(ep, fileURL, libName, FileType.JELIB, true);
+
+ // do silicon compilation
+ String trimStr;
+ if (testNumber == 1)
+ {
+ trimStr = "ACC;";
+ Cell lay = lib.findNodeProto("tool-SiliconCompiler{vhdl}");
+ SilComp.SilCompPrefs prefs = new SilComp.SilCompPrefs(true, Technology.getMocmosTechnology().getTechName());
+ ToolMenu.doSiliconCompilation(lay, true, prefs, ep);
+
+ // write results
+ String destLibA = outputDir + "SiliconCompilation1ResultA.jelib";
+ Output.saveJelib(destLibA, lib);
+ } else
+ {
+ trimStr = "adder4;";
+ Cell lay = lib.findNodeProto("adder4{vhdl}");
+ SilComp.SilCompPrefs prefs = new SilComp.SilCompPrefs(true, Technology.getMocmosTechnology().getTechName());
+ ToolMenu.doSilCompActivityNoJob(lay, ToolMenu.COMPILE_VHDL_FOR_SC, prefs, true);
+ }
+
+ // reset creation dates for consistent output
+ Date zeroDate = new Date(0);
+ for(Iterator<Cell> it = lib.getCells(); it.hasNext(); )
+ {
+ Cell cell = it.next();
+ cell.lowLevelSetCreationDate(zeroDate);
+ cell.lowLevelSetRevisionDate(zeroDate);
+ }
+ lib.getDatabase().backup();
+
+ // write results
+ String destLib = outputDir + "SiliconCompilation" + testNumber + "Result.jelib";
+ Output.saveJelib(destLib, lib);
+
+ // remove header lines from the library
+ String trimmedLib = outputDir + "SiliconCompilation" + testNumber + "ResultPartial.jelib";
+ trimLibToCell(destLib, trimmedLib, trimStr);
+
+ // see if the library is as expected
+ String expectedLib = trueRootPath + "data/expected/SiliconCompilation" + testNumber + "Result.jelib";
+ if (!compareResults(trimmedLib, expectedLib)) good = false;
+ } catch (Exception e)
+ {
+ // Catching any time of exception!
+ e.printStackTrace();
+ good = false;
+ }
+ return good;
+ }
+
+ /************************************* TechEditWizard *********************************************************/
+
+ public Boolean TechEditWizard()
+ {
+ return Boolean.valueOf(basicTechEditWizardTest(getRegressionPath()));
+ }
+
+ /**
+ * Method to run TechEditWizard test. Must be public/static due to regressions.
+ * @param rootPath if rootPath is not null, then the data path includes tool path
+ * otherwise assume the regression is running locally
+ * @return true if test successfully run.
+ */
+ public static boolean basicTechEditWizardTest(String rootPath)
+ {
+ String trueRootPath = (rootPath != null) ? rootPath + "/tools/Generation/" : "";
+ String outputDir = trueRootPath + "output/";
+ ensureOutputDirectory(outputDir);
+ MessagesStream.getMessagesStream().save(outputDir + "TechEditWizardOut.log");
+
+ boolean good = true;
+ try
+ {
+ // initialize
+ setFoundry(Technology.getMocmosTechnology());
+
+ TechEditWizardData data = new TechEditWizardData();
+
+ // Open the text file
+ String destLib = trueRootPath + "output/MoCmos.xml";
+ data.importDataFromWizardFormat(trueRootPath + "data/libs/mocmos.txt");
+
+ // Write the file
+ data.dumpXMLFile(destLib);
+
+ // remove header lines from the library
+ String trimmedLib = trueRootPath + "output/MoCmosPartial.xml";
+ removeLines(destLib, trimmedLib, " *"); // remove license
+
+ // see if the library is as expected
+ String expectedLib = trueRootPath + "data/expected/TechEditWizardMoCmos.xml";
+ if (!compareResults(trimmedLib, expectedLib)) good = false;
+ } catch (Exception e)
+ {
+ // Catching any time of exception!
+ e.printStackTrace();
+ good = false;
+ }
+ return good;
+ }
+
+ /************************************* GateGen *********************************************************/
+
+ public Boolean GateGen()
+ {
+ return Boolean.valueOf(basicGateGenerationTest(getRegressionPath()));
+ }
+
+ /**
+ * Method to run Gate Generator test. Must be public/static due to regressions.
+ * @return true if test successfully run.
+ */
+ public static boolean basicGateGenerationTest(String rootPath)
+ {
+ String trueRootPath = (rootPath != null) ? (rootPath + "/tools/Generation/") : "";
+ String outputDir = trueRootPath + "output/";
+ ensureOutputDirectory(outputDir);
+ MessagesStream.getMessagesStream().save(outputDir + "GateGen.log");
+
+ int numErrs = 0;
+ boolean sameLib = false;
+ try
+ {
+ String libName = trueRootPath + "data/libs/purpleFour.jelib";
+ System.out.println("Opening " + libName);
+
+ EditingPreferences ep = new EditingPreferences(true, TechPool.getThreadTechPool());
+ LayoutLib.openLibForRead(libName, ep, true);
+ Library scratchLib = Library.newInstance("GateGenScratch", TextUtils.makeURLToFile(outputDir + "GateGenScratch.jelib"));
+
+ // Check that technology is properly set
+ Technology tech = Technology.getMocmosTechnology();
+ tech = setFoundry(tech);
+ GateRegression.runRegression(tech, scratchLib, IOTool.getBackupRedundancy(), ep);
+ sameLib = compareLibraryResults(trueRootPath, scratchLib.getName(), scratchLib,
+ new char [] {'H', 'C', 'F', 'R', 'T', 'O', '#'});
+
+ // Running now DRC on those new cells
+ Cell gallery = scratchLib.findNodeProto("gallery{lay}");
+ DRC.DRCPreferences dp = new DRC.DRCPreferences(true);
+ dp.ignoreAreaCheck = true; // no min area
+ dp.ignoreExtensionRuleChecking = true;
+ ErrorLogger errorLog = Quick.checkDesignRules(dp, gallery, null, null);
+ errorLog.termLogging(true);
+ numErrs = errorLog.getNumErrors();
+ } catch (Exception e)
+ {
+ System.out.println("exception: "+e);
+ e.printStackTrace();
+ return false;
+ }
+ boolean cleanDRC = numErrs == 0;
+ if (!sameLib)
+ System.out.println("ERROR: Library generated is different from the reference");
+ else if (!cleanDRC)
+ System.out.println("ERROR: DRC errors in basicGateGenerationTest");
+
+ return sameLib && cleanDRC;
+ }
+}
diff --git a/com/sun/electric/tool/user/tests/IOTest.java b/com/sun/electric/tool/user/tests/IOTest.java
new file mode 100644
index 0000000..30a4065
--- /dev/null
+++ b/com/sun/electric/tool/user/tests/IOTest.java
@@ -0,0 +1,131 @@
+ /* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: IOTest.java
+ *
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.user.tests;
+
+import com.sun.electric.database.EditingPreferences;
+import com.sun.electric.database.hierarchy.Cell;
+import com.sun.electric.database.hierarchy.Library;
+import com.sun.electric.database.network.NetworkTool;
+import com.sun.electric.technology.TechPool;
+import com.sun.electric.technology.Technology;
+import com.sun.electric.tool.generator.layout.LayoutLib;
+import com.sun.electric.tool.io.input.Input;
+import com.sun.electric.tool.user.ErrorLogger;
+import com.sun.electric.tool.user.MessagesStream;
+import com.sun.electric.tool.user.User;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Class to test library reading.
+ */
+public class IOTest extends AbstractTest
+{
+ public IOTest(String name)
+ {
+ super(name);
+ }
+
+ public static List<AbstractTest> getTests()
+ {
+ List<AbstractTest> list = new ArrayList<AbstractTest>();
+ list.add(new IOTest("readLib1"));
+ list.add(new IOTest("readLib2"));
+ return list;
+ }
+
+ public static String getOutputDirectory()
+ {
+ String rootPath = User.getRegressionPath();
+ if (rootPath == null) return null;
+ return rootPath + "/tools/IO/output/";
+ }
+
+ /************************************* readLib1 *********************************************************/
+
+ public boolean readLib1()
+ {
+ return ioReadGenStatic(getRegressionPath(), "/data/qThree", "qThreeTop.jelib", "qThreeTop", 365, 0, 0);
+ }
+
+ /************************************* readLib2 *********************************************************/
+
+ public boolean readLib2()
+ {
+ return ioReadGenStatic(getRegressionPath(), "/data/muddChip", "MIPS.jelib", "chip", 0, 3879, 0);
+ }
+
+ /************************************* SUPPORT *********************************************************/
+
+ public static boolean ioReadGenStatic(String trueRootPath, String libPath, String libName,
+ String logFile, int expectedNumInputLogs, int expectedNumNetworkLogs, int expectedNumCheckErrors)
+ {
+ boolean passed = false;
+ try
+ {
+ String testParameter = properDirectory(trueRootPath, IOTest.class);
+ String outputDir = outputDir(trueRootPath, testParameter);
+ ensureOutputDirectory(outputDir);
+ MessagesStream.getMessagesStream().save(outputDir + logFile + ".log");
+ setFoundry(Technology.getMocmosTechnology(), "Mosis");
+ EditingPreferences ep = new EditingPreferences(true, TechPool.getThreadTechPool());
+
+ NetworkTool.totalNumErrors = 0;
+ wipeLibraries();
+ LayoutLib.openLibForRead(trueRootPath + libPath + "/" + libName, ep, true);
+
+ for (Iterator<Library> it = Library.getLibraries(); it.hasNext(); )
+ {
+ Library lib = it.next();
+ for (Iterator<Cell> cit = lib.getCells(); cit.hasNext(); )
+ {
+ Cell cell = cit.next();
+ cell.getNetlist();
+ }
+ }
+
+ int numInputLogs = Input.errorLogger.getNumLogs();
+ int numNetworkLogs = NetworkTool.totalNumErrors;
+ int numCheckErrors = 0;
+ for(Iterator<Library> it = Library.getLibraries(); it.hasNext(); )
+ {
+ Library lib = it.next();
+ numCheckErrors += lib.checkAndRepair(false, ErrorLogger.newInstance("Check Libraries"), ep);
+ }
+
+ passed = (expectedNumInputLogs == numInputLogs && expectedNumNetworkLogs == numNetworkLogs &&
+ expectedNumCheckErrors == numCheckErrors);
+ if (!passed)
+ {
+ System.out.println("ERROR: Expected " + expectedNumInputLogs + " input " + expectedNumNetworkLogs + " network " + expectedNumCheckErrors + " errors");
+ System.out.println(" but obtained " + numInputLogs + " input " + numNetworkLogs + " network " + numCheckErrors + " errors");
+ }
+ } catch (Exception e)
+ {
+ System.out.println("Exception: " +e);
+ e.printStackTrace();
+ }
+ return passed;
+ }
+}
diff --git a/com/sun/electric/tool/user/tests/ImportForeignTest.java b/com/sun/electric/tool/user/tests/ImportForeignTest.java
new file mode 100644
index 0000000..6896dec
--- /dev/null
+++ b/com/sun/electric/tool/user/tests/ImportForeignTest.java
@@ -0,0 +1,509 @@
+ /* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: ImportForeignTest.java
+ *
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.user.tests;
+
+import com.sun.electric.database.EditingPreferences;
+import com.sun.electric.database.hierarchy.Cell;
+import com.sun.electric.database.hierarchy.EDatabase;
+import com.sun.electric.database.hierarchy.Library;
+import com.sun.electric.database.id.CellId;
+import com.sun.electric.database.id.CellUsage;
+import com.sun.electric.technology.TechPool;
+import com.sun.electric.technology.Technology;
+import com.sun.electric.technology.technologies.Artwork;
+import com.sun.electric.technology.technologies.MoCMOS;
+import com.sun.electric.tool.Job;
+import com.sun.electric.tool.io.FileType;
+import com.sun.electric.tool.io.input.CIF;
+import com.sun.electric.tool.io.input.DEF;
+import com.sun.electric.tool.io.input.DXF;
+import com.sun.electric.tool.io.input.EDIF;
+import com.sun.electric.tool.io.input.GDS;
+import com.sun.electric.tool.io.input.Gerber;
+import com.sun.electric.tool.io.input.Input;
+import com.sun.electric.tool.io.input.LEF;
+import com.sun.electric.tool.io.input.Sue;
+import com.sun.electric.tool.io.input.bookshelf.Bookshelf;
+import com.sun.electric.tool.lang.EvalJavaBsh;
+import com.sun.electric.tool.user.MessagesStream;
+import com.sun.electric.tool.user.User;
+import com.sun.electric.util.TextUtils;
+
+import java.io.File;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.BitSet;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Class to test the foreign-file import facilities.
+ */
+public class ImportForeignTest extends AbstractTest
+{
+ public ImportForeignTest(String name)
+ {
+ super(name);
+ }
+
+ public static List<AbstractTest> getTests()
+ {
+ List<AbstractTest> list = new ArrayList<AbstractTest>();
+ list.add(new ImportForeignTest("Bookshelf"));
+
+ list.add(new ImportForeignTest("CIF1"));
+ list.add(new ImportForeignTest("CIF2"));
+ list.add(new ImportForeignTest("CIF3"));
+ list.add(new ImportForeignTest("CIF4"));
+
+ list.add(new ImportForeignTest("DXF1"));
+ list.add(new ImportForeignTest("DXF2"));
+ list.add(new ImportForeignTest("DXF3"));
+ list.add(new ImportForeignTest("DXF4"));
+ list.add(new ImportForeignTest("DXF5"));
+ list.add(new ImportForeignTest("DXF6"));
+
+ list.add(new ImportForeignTest("EDIF1"));
+ list.add(new ImportForeignTest("EDIF2"));
+ list.add(new ImportForeignTest("EDIF3"));
+ list.add(new ImportForeignTest("EDIF4"));
+ list.add(new ImportForeignTest("EDIF5"));
+
+ list.add(new ImportForeignTest("GDS1"));
+ list.add(new ImportForeignTest("GDS2"));
+ list.add(new ImportForeignTest("GDS3"));
+ list.add(new ImportForeignTest("GDS4"));
+
+ list.add(new ImportForeignTest("Gerber"));
+
+ list.add(new ImportForeignTest("LEFDEF1"));
+ list.add(new ImportForeignTest("LEFDEF2"));
+
+ if (EvalJavaBsh.hasBeanShell())
+ {
+ list.add(new ImportForeignTest("SUE1"));
+ list.add(new ImportForeignTest("SUE2"));
+ list.add(new ImportForeignTest("SUE3"));
+ }
+ return list;
+ }
+
+ public static String getOutputDirectory()
+ {
+ String rootPath = User.getRegressionPath();
+ if (rootPath == null) return null;
+ return rootPath + "/tools/IO/output/";
+ }
+
+ /***************************************** Bookshelf *****************************************/
+
+ public Boolean Bookshelf() { return Boolean.valueOf(basicBOOKSHELF1(getRegressionPath(), getStarterJob())); }
+ private static boolean basicBOOKSHELF1(String rootPath, Job job)
+ {
+ Bookshelf.BookshelfPreferences bp1 = new Bookshelf.BookshelfPreferences(true);
+ return runImportTest(rootPath, "ImportBOOKSHELF-1", null, MoCMOS.getMocmosTechnology(), job, false,
+ ".aux", null, FileType.BOOKSHELF, null, bp1, null);
+ }
+
+ /***************************************** CIF *****************************************/
+
+ public Boolean CIF1() { return Boolean.valueOf(basicCIF1(getRegressionPath(), getStarterJob())); }
+ private static boolean basicCIF1(String rootPath, Job job)
+ {
+ CIF.CIFPreferences ip = new CIF.CIFPreferences(true);
+ return runImportTest(rootPath, "ImportCIF-1", null, Technology.findTechnology("nmos"), job, true,
+ ".cif", null, FileType.CIF, null, ip, null);
+ }
+
+ public Boolean CIF2() { return Boolean.valueOf(basicCIF2(getRegressionPath(), getStarterJob())); }
+ private static boolean basicCIF2(String rootPath, Job job)
+ {
+ CIF.CIFPreferences ip = new CIF.CIFPreferences(true);
+ return runImportTest(rootPath, "ImportCIF-2", null, MoCMOS.getMocmosTechnology(), job, true,
+ ".cif", null, FileType.CIF, null, ip, null);
+ }
+
+ public Boolean CIF3() { return Boolean.valueOf(basicCIF3(getRegressionPath(), getStarterJob())); }
+ private static boolean basicCIF3(String rootPath, Job job)
+ {
+ CIF.CIFPreferences ip = new CIF.CIFPreferences(true);
+ return runImportTest(rootPath, "ImportCIF-3", null, MoCMOS.getMocmosTechnology(), job, true,
+ ".cif", null, FileType.CIF, null, ip, null);
+ }
+
+ public Boolean CIF4() { return Boolean.valueOf(basicCIF4(getRegressionPath(), getStarterJob())); }
+ private static boolean basicCIF4(String rootPath, Job job)
+ {
+ CIF.CIFPreferences ip = new CIF.CIFPreferences(true);
+ return runImportTest(rootPath, "ImportCIF-4", null, MoCMOS.getMocmosTechnology(), job, true,
+ ".cif", null, FileType.CIF, null, ip, null);
+ }
+
+ /***************************************** DXF *****************************************/
+
+ public Boolean DXF1() { return Boolean.valueOf(basicDXF1(getRegressionPath(), getStarterJob())); }
+ private static boolean basicDXF1(String rootPath, Job job)
+ {
+ DXF.DXFPreferences ip = new DXF.DXFPreferences(true);
+ return runImportTest(rootPath, "ImportDXF-1", null, Artwork.tech(), job, true,
+ ".dxf", null, FileType.DXF, null, ip, null);
+ }
+
+ public Boolean DXF2() { return Boolean.valueOf(basicDXF2(getRegressionPath(), getStarterJob())); }
+ private static boolean basicDXF2(String rootPath, Job job)
+ {
+ DXF.DXFPreferences ip = new DXF.DXFPreferences(true);
+ return runImportTest(rootPath, "ImportDXF-2", null, null, job, true,
+ ".dxf", null, FileType.DXF, null, ip, null);
+ }
+
+ public Boolean DXF3() { return Boolean.valueOf(basicDXF3(getRegressionPath(), getStarterJob())); }
+ private static boolean basicDXF3(String rootPath, Job job)
+ {
+ DXF.DXFPreferences ip = new DXF.DXFPreferences(true);
+ return runImportTest(rootPath, "ImportDXF-3", null, Artwork.tech(), job, true,
+ ".dxf", null, FileType.DXF, null, ip, null);
+ }
+
+ public Boolean DXF4() { return Boolean.valueOf(basicDXF4(getRegressionPath(), getStarterJob())); }
+ private static boolean basicDXF4(String rootPath, Job job)
+ {
+ DXF.DXFPreferences ip = new DXF.DXFPreferences(true);
+ return runImportTest(rootPath, "ImportDXF-4", null, Artwork.tech(), job, true,
+ ".dxf", null, FileType.DXF, null, ip, null);
+ }
+
+ public Boolean DXF5() { return Boolean.valueOf(basicDXF5(getRegressionPath(), getStarterJob())); }
+ private static boolean basicDXF5(String rootPath, Job job)
+ {
+ DXF.DXFPreferences ip = new DXF.DXFPreferences(true);
+ return runImportTest(rootPath, "ImportDXF-5", null, Artwork.tech(), job, true,
+ ".dxf", null, FileType.DXF, null, ip, null);
+ }
+
+ public Boolean DXF6() { return Boolean.valueOf(basicDXF6(getRegressionPath(), getStarterJob())); }
+ private static boolean basicDXF6(String rootPath, Job job)
+ {
+ DXF.DXFPreferences ip = new DXF.DXFPreferences(true);
+ return runImportTest(rootPath, "ImportDXF-6", null, Artwork.tech(), job, true,
+ ".dxf", null, FileType.DXF, null, ip, null);
+ }
+
+ /***************************************** EDIF *****************************************/
+
+ public Boolean EDIF1() { return Boolean.valueOf(basicEDIF1(getRegressionPath(), getStarterJob())); }
+ private static boolean basicEDIF1(String rootPath, Job job)
+ {
+ EDIF.EDIFPreferences ip = new EDIF.EDIFPreferences(true);
+ return runImportTest(rootPath, "ImportEDIF-1", null, MoCMOS.getMocmosTechnology(), job, false,
+ ".edif", null, FileType.EDIF, null, ip, null);
+ }
+
+ public Boolean EDIF2() { return Boolean.valueOf(basicEDIF2(getRegressionPath(), getStarterJob())); }
+ private static boolean basicEDIF2(String rootPath, Job job)
+ {
+ EDIF.EDIFPreferences ip = new EDIF.EDIFPreferences(true);
+ return runImportTest(rootPath, "ImportEDIF-2", null, MoCMOS.getMocmosTechnology(), job, false,
+ ".edif", null, FileType.EDIF, null, ip, null);
+ }
+
+ public Boolean EDIF3() { return Boolean.valueOf(basicEDIF3(getRegressionPath(), getStarterJob())); }
+ private static boolean basicEDIF3(String rootPath, Job job)
+ {
+ EDIF.EDIFPreferences ip = new EDIF.EDIFPreferences(true);
+ ip.cadenceCompatibility = false;
+ return runImportTest(rootPath, "ImportEDIF-3", null, MoCMOS.getMocmosTechnology(), job, false,
+ ".edif", null, FileType.EDIF, null, ip, null);
+ }
+
+ public Boolean EDIF4() { return Boolean.valueOf(basicEDIF4(getRegressionPath(), getStarterJob())); }
+ private static boolean basicEDIF4(String rootPath, Job job)
+ {
+ EDIF.EDIFPreferences ip = new EDIF.EDIFPreferences(true);
+ ip.cadenceCompatibility = false;
+ return runImportTest(rootPath, "ImportEDIF-4", null, MoCMOS.getMocmosTechnology(), job, false,
+ ".edif", null, FileType.EDIF, null, ip, null);
+ }
+
+ public Boolean EDIF5() { return Boolean.valueOf(basicEDIF5(getRegressionPath(), getStarterJob())); }
+ private static boolean basicEDIF5(String rootPath, Job job)
+ {
+ EDIF.EDIFPreferences ip = new EDIF.EDIFPreferences(true);
+ ip.cadenceCompatibility = false;
+ return runImportTest(rootPath, "ImportEDIF-5", null, MoCMOS.getMocmosTechnology(), job, false,
+ ".edif", null, FileType.EDIF, null, ip, null);
+ }
+
+ public Boolean EDIF6() { return Boolean.valueOf(basicEDIF6(getRegressionPath(), getStarterJob())); }
+ private static boolean basicEDIF6(String rootPath, Job job)
+ {
+ EDIF.EDIFPreferences ip = new EDIF.EDIFPreferences(true);
+ return runImportTest(rootPath, "ImportEDIF-6", null, MoCMOS.getMocmosTechnology(), job, false,
+ ".edif", null, FileType.EDIF, null, ip, null);
+ }
+
+ /***************************************** GDS *****************************************/
+
+ public Boolean GDS1() { return Boolean.valueOf(basicGDS1(getRegressionPath(), getStarterJob())); }
+ private static boolean basicGDS1(String rootPath, Job job)
+ {
+ GDS.GDSPreferences ip = new GDS.GDSPreferences(true);
+ return runImportTest(rootPath, "ImportGDS-1", null, MoCMOS.getMocmosTechnology(), job, true,
+ ".gds", null, FileType.GDS, null, ip, null);
+ }
+
+ public Boolean GDS2() { return Boolean.valueOf(basicGDS2(getRegressionPath(), getStarterJob())); }
+ private static boolean basicGDS2(String rootPath, Job job)
+ {
+ GDS.GDSPreferences ip = new GDS.GDSPreferences(true);
+ return runImportTest(rootPath, "ImportGDS-2", null, MoCMOS.getMocmosTechnology(), job, true,
+ ".gds", null, FileType.GDS, null, ip, null);
+ }
+
+ public Boolean GDS3() { return Boolean.valueOf(basicGDS3(getRegressionPath(), getStarterJob())); }
+ private static boolean basicGDS3(String rootPath, Job job)
+ {
+ GDS.GDSPreferences ip = new GDS.GDSPreferences(true);
+ return runImportTest(rootPath, "ImportGDS-3", null, MoCMOS.getMocmosTechnology(), job, true,
+ ".gds", null, FileType.GDS, null, ip, null);
+ }
+
+ public Boolean GDS4() { return Boolean.valueOf(basicGDS4(getRegressionPath(), getStarterJob())); }
+ private static boolean basicGDS4(String rootPath, Job job)
+ {
+ GDS.GDSPreferences ip = new GDS.GDSPreferences(true);
+ return runImportTest(rootPath, "ImportGDS-4", null, Technology.findTechnology("mocmosold"), job, true,
+ ".gds", null, FileType.GDS, null, ip, null);
+ }
+
+ /***************************************** Gerber *****************************************/
+
+ public Boolean Gerber() { return Boolean.valueOf(basicGERBER1(getRegressionPath(), getStarterJob())); }
+ private static boolean basicGERBER1(String rootPath, Job job)
+ {
+ Gerber.GerberPreferences gp1 = new Gerber.GerberPreferences(true);
+ return runImportTest(rootPath, "ImportGERBER-1-1", null, MoCMOS.getMocmosTechnology(), job, false,
+ ".gbr", null, FileType.GERBER, null, gp1, null);
+ }
+
+ /***************************************** LEF/DEF *****************************************/
+
+ public Boolean LEFDEF1() { return Boolean.valueOf(basicLEFDEF1(getRegressionPath(), getStarterJob())); }
+ private static boolean basicLEFDEF1(String rootPath, Job job)
+ {
+ LEF.LEFPreferences ip1 = new LEF.LEFPreferences(true);
+ DEF.DEFPreferences ip2 = new DEF.DEFPreferences(true);
+ return runImportTest(rootPath, "ImportLEFDEF-1", null, MoCMOS.getMocmosTechnology(), job, false,
+ ".lef", ".def", FileType.LEF, FileType.DEF, ip1, ip2);
+ }
+
+ public Boolean LEFDEF2() { return Boolean.valueOf(basicLEFDEF2(getRegressionPath(), getStarterJob())); }
+ private static boolean basicLEFDEF2(String rootPath, Job job)
+ {
+ LEF.LEFPreferences ip = new LEF.LEFPreferences(true);
+ return runImportTest(rootPath, "ImportLEFDEF-2", null, MoCMOS.getMocmosTechnology(), job, false,
+ ".lef", null, FileType.LEF, null, ip, null);
+ }
+
+ /***************************************** SUE *****************************************/
+
+ public Boolean SUE1() { return Boolean.valueOf(basicSUE1(getRegressionPath(), getStarterJob())); }
+ private static boolean basicSUE1(String rootPath, Job job)
+ {
+ Sue.SuePreferences ip = new Sue.SuePreferences(true);
+ return runImportTest(rootPath, "ImportSUE-1", "ImportSUE-1", MoCMOS.getMocmosTechnology(), job, true,
+ ".sue", null, FileType.SUE, null, ip, null);
+ }
+
+ public Boolean SUE2() { return Boolean.valueOf(basicSUE2(getRegressionPath(), getStarterJob())); }
+ private static boolean basicSUE2(String rootPath, Job job)
+ {
+ Sue.SuePreferences ip = new Sue.SuePreferences(true);
+ return runImportTest(rootPath, "ImportSUE-2", "ImportSUE-2", MoCMOS.getMocmosTechnology(), job, true,
+ ".sue", null, FileType.SUE, null, ip, null);
+ }
+
+ public Boolean SUE3() { return Boolean.valueOf(basicSUE3(getRegressionPath(), getStarterJob())); }
+ private static boolean basicSUE3(String rootPath, Job job)
+ {
+ Sue.SuePreferences ip = new Sue.SuePreferences(true);
+ return runImportTest(rootPath, "ImportSUE-3", "ImportSUE-3", MoCMOS.getMocmosTechnology(), job, true,
+ ".sue", null, FileType.SUE, null, ip, null);
+ }
+
+ private static boolean runImportTest(String rootPath, String testName, String subLoc, Technology tech, Job job, boolean makeLib,
+ String extension1, String extension2, FileType type1, FileType type2,
+ Input.InputPreferences ip1, Input.InputPreferences ip2)
+ {
+ String currentDir = new File("").getAbsolutePath() + File.separator;
+ String trueRootPath = (rootPath != null && rootPath.length() > 0) ? (rootPath + "/tools/IO/") : currentDir;
+ String inputDir = trueRootPath + "data/libs/";
+ String outputDir = trueRootPath + "output/";
+ ensureOutputDirectory(outputDir);
+ MessagesStream.getMessagesStream().save(outputDir + testName + ".log");
+ try
+ {
+ // delete previous libraries
+ List<Library> libsToDelete = getLibsInOrder();
+ for(Library l : libsToDelete) l.kill("delete");
+
+ // make a library
+ Library iniLib = null;
+ if (makeLib)
+ {
+ String outputFileName = inputDir + (subLoc == null ? "" : subLoc + "/") + testName + ".jelib";
+ URL outputFileURL = TextUtils.makeURLToFile(outputFileName);
+ iniLib = Library.newInstance(testName, outputFileURL);
+ }
+ TechPool techPool = TechPool.getThreadTechPool();
+ EditingPreferences ep = new EditingPreferences(true, techPool);
+
+ // Read foreign file
+ String importFileName = inputDir + (subLoc == null ? "" : subLoc + "/") + testName;
+ if (extension2 != null) importFileName += "a";
+ importFileName += extension1;
+ URL importFileURL = TextUtils.makeURLToFile(importFileName);
+ Map<Library,Cell> currentCells = new HashMap<Library,Cell>();
+ Map<CellId,BitSet> nodesToExpand = new HashMap<CellId,BitSet>();
+ ip1.disablePopups = true;
+ Library libNew = Input.importLibrary(ep, ip1, importFileURL, type1, iniLib, tech, currentCells, nodesToExpand, false, job);
+ if (libNew == null)
+ {
+ System.out.println("Import failed");
+ return false;
+ }
+
+ // if there is a second foreign file, read it too
+ if (extension2 != null)
+ {
+ String importFileName2 = inputDir + (subLoc == null ? "" : subLoc + "/") + testName + "b" + extension2;
+ URL importFileURL2 = TextUtils.makeURLToFile(importFileName2);
+ currentCells = new HashMap<Library,Cell>();
+ nodesToExpand = new HashMap<CellId,BitSet>();
+ ip2.disablePopups = true;
+ libNew = Input.importLibrary(ep, ip2, importFileURL2, type2, iniLib, tech, currentCells, nodesToExpand, false, job);
+ if (libNew == null)
+ {
+ System.out.println("Import failed");
+ return false;
+ }
+ }
+
+ // make sure libraries have correct name
+ for(Iterator<Library> it = Library.getLibraries(); it.hasNext(); )
+ {
+ Library lib = it.next();
+ if (lib.getNumCells() == 0) continue;
+
+ if (!lib.getName().startsWith(testName))
+ lib.setName(testName + "_" + lib.getName());
+ }
+
+ // write and test all libraries
+ List<Library> allLibraries = getLibsInOrder();
+ for(Library l : allLibraries)
+ {
+ if (l.getNumCells() == 0) continue;
+
+ // reset all dates so file will compare
+ Date zeroDate = new Date(0);
+ for(Iterator<Cell> it = l.getCells(); it.hasNext(); )
+ {
+ Cell cell = it.next();
+ cell.lowLevelSetCreationDate(zeroDate);
+ cell.lowLevelSetRevisionDate(zeroDate);
+ cell.getDatabase().backup();
+ }
+
+ // save library and compare it to expected
+ boolean compares = compareLibraryResults(trueRootPath, l.getName(), l,
+ new char [] {'H', 'V', 'L', 'R', 'F', 'T', 'O', '#'});
+ if (!compares)
+ {
+ System.out.println("ImportForeignTest test '" + testName + "' FAILED");
+ return false;
+ }
+ }
+ } catch (Exception e)
+ {
+ // Catching any type of exception
+ e.printStackTrace();
+ return false;
+ }
+ System.out.println("ImportForeignTest test '" + testName + "' PASSED");
+ return true;
+ }
+
+ /**
+ * Method to return a list of all libraries in proper order for deletion.
+ * The first library does not depend on others, the second may depend on the
+ * first but no others, etc.
+ * @return a list of all libraries in proper order for deletion.
+ */
+ private static List<Library> getLibsInOrder()
+ {
+ // make ordered list of libraries, from top down
+ List<Library> allLibraries = new ArrayList<Library>();
+ boolean libsToFind = true;
+ while (libsToFind)
+ {
+ libsToFind = false;
+ for(Iterator<Library> it = Library.getLibraries(); it.hasNext(); )
+ {
+ Library lib = it.next();
+ if (lib.isHidden()) continue;
+ EDatabase database = lib.getDatabase();
+ if (allLibraries.contains(lib)) continue;
+ if (lib.getNumCells() != 0)
+ {
+ boolean cleanParents = true;
+ for(Iterator<Cell> cIt = lib.getCells(); cIt.hasNext(); )
+ {
+ Cell cell = cIt.next();
+ for(Iterator<CellUsage> uIt = cell.getUsagesOf(); uIt.hasNext(); )
+ {
+ CellUsage cu = uIt.next();
+ Cell parent = cu.getParent(database);
+ Library parentLib = parent.getLibrary();
+ if (parentLib != lib)
+ {
+ if (!allLibraries.contains(parentLib))
+ {
+ cleanParents = false;
+ break;
+ }
+ }
+ }
+ if (!cleanParents) break;
+ }
+ if (!cleanParents) continue;
+ }
+ allLibraries.add(lib);
+ libsToFind = true;
+ }
+ }
+ return allLibraries;
+ }
+}
diff --git a/com/sun/electric/tool/user/tests/JobsTest.java b/com/sun/electric/tool/user/tests/JobsTest.java
new file mode 100644
index 0000000..e6131e6
--- /dev/null
+++ b/com/sun/electric/tool/user/tests/JobsTest.java
@@ -0,0 +1,230 @@
+ /* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: JobsTest.java
+ *
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.user.tests;
+
+import com.sun.electric.database.EditingPreferences;
+import com.sun.electric.database.hierarchy.Cell;
+import com.sun.electric.database.hierarchy.Library;
+import com.sun.electric.database.id.CellId;
+import com.sun.electric.tool.Consumer;
+import com.sun.electric.tool.Job;
+import com.sun.electric.tool.MultiTaskJob;
+import com.sun.electric.tool.user.User;
+import com.sun.electric.tool.user.UserInterfaceMain;
+
+import java.awt.geom.Point2D;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Class to test Job control.
+ */
+public class JobsTest extends AbstractTest
+{
+ EditingPreferences ep = UserInterfaceMain.getEditingPreferences();
+
+ public JobsTest(String name, boolean interactive)
+ {
+ super(name, false, interactive);
+ }
+
+ public static List<AbstractTest> getTests()
+ {
+ List<AbstractTest> list = new ArrayList<AbstractTest>();
+ list.add(new JobsTest("Terminate", true));
+ list.add(new JobsTest("MultiTask", true));
+ list.add(new JobsTest("HangingReferenceJob", false));
+ list.add(new JobsTest("PrintJob", false));
+ list.add(new JobsTest("InfiniteLoopJob", true));
+ return list;
+ }
+
+ public static String getOutputDirectory()
+ {
+ String rootPath = User.getRegressionPath();
+ if (rootPath == null) return null;
+ return rootPath + "/tools/Database/output/";
+ }
+
+ /************************************* Terminate *********************************************************/
+
+ public Boolean Terminate()
+ {
+ new FakeJob(Job.Type.CHANGE, false);
+ new FakeJob(Job.Type.SERVER_EXAMINE, false);
+// new FakeJob(Job.Type.CLIENT_EXAMINE, false);
+ new FakeJob(Job.Type.CHANGE, true);
+ new FakeJob(Job.Type.SERVER_EXAMINE, true);
+// new FakeJob(Job.Type.CLIENT_EXAMINE, true);
+ return Boolean.TRUE;
+ }
+
+ private static class FakeJob extends Job
+ {
+ Job.Type jobType;
+ String field;
+ boolean fail;
+
+ FakeJob(Job.Type jobType, boolean fail)
+ {
+ super("JobTest", null, jobType, null, null, null);
+ this.jobType = jobType;
+ this.fail = fail;
+ startJob();
+ }
+
+ @Override
+ public boolean doIt()
+ {
+ System.out.println("doIt " + jobType + " fail=" + fail);
+ field = "Value";
+ fieldVariableChanged("field");
+ if (fail)
+ {
+ int x = 0;
+ int y = 1/x;
+ if (y == 0) return false;
+ }
+ return true;
+ }
+
+ @Override
+ public void terminateOK()
+ {
+ System.out.println("TerminateOK " + jobType + " fail=" + fail + " field=" + field);
+ }
+
+ @Override
+ public void terminateFail(Throwable e)
+ {
+ System.out.println("TerminateFail " + jobType + " fail=" + fail + " e=" + e + " field=" + field);
+ super.terminateFail(e);
+ }
+ }
+
+ /************************************* MultiTask *********************************************************/
+
+ private static Boolean multiTaskTestDone;
+
+ public Boolean MultiTask()
+ {
+ multiTaskTestDone = null;
+ final double expectedResult = 9900;
+ Consumer<Double> consumer = new Consumer<Double>()
+ {
+ public void consume(Double result)
+ {
+ System.out.println("Server " + result + " expected " + expectedResult);
+ boolean good = result.equals(expectedResult);
+ multiTaskTestDone = Boolean.valueOf(good);
+// getStarterJob().updateTestResult(good);
+ }
+ };
+ LauncherJob lj = new LauncherJob(100, consumer);
+ lj.startJob();
+ try
+ {
+ for(;;)
+ {
+ lj.wait();
+ if (lj.isFinished()) break;
+ }
+ } catch (Exception e) {}
+ return multiTaskTestDone;
+ }
+
+ private static class LauncherJob extends MultiTaskJob<Integer,Point2D,Double>
+ {
+ private int numTasks;
+
+ LauncherJob(int numTasks, Consumer<Double> consumer)
+ {
+ super("MultiTaskJobTest", User.getUserTool(), consumer);
+ this.numTasks = numTasks;
+ }
+
+ @Override
+ public void prepareTasks()
+ {
+ for (int i = 0; i < numTasks; i++)
+ startTask("Task " + i, Integer.valueOf(i));
+ }
+
+ @Override
+ public Point2D runTask(Integer taskKey)
+ {
+ return new Point2D.Double(taskKey, taskKey);
+ }
+
+ @Override
+ public Double mergeTaskResults(Map<Integer,Point2D> taskResults)
+ {
+ double result = 0;
+ for (Map.Entry<Integer,Point2D> e: taskResults.entrySet())
+ {
+ Point2D p = e.getValue();
+ System.out.println(e.getKey() + ": " + p);
+ result += p.getX() + p.getY();
+ }
+ return Double.valueOf(result);
+ }
+ }
+
+ /************************************* HangingReferenceJob *********************************************************/
+
+ public Boolean HangingReferenceJob()
+ {
+ String libName = "hangRef";
+ Library lib = Library.findLibrary(libName);
+ if (lib == null)
+ lib = Library.newInstance(libName, null);
+ Cell refCell = Cell.newInstance(lib, "referenced{ic}");
+ CellId refCellId = refCell.getId();
+ Cell cell = Cell.newInstance(lib, "hangRef{sch}");
+ cell.newVar("ATTR_FOO", refCellId, ep);
+ refCell.kill();
+ return Boolean.TRUE;
+ }
+
+ /************************************* PrintJob *********************************************************/
+
+ public Boolean PrintJob()
+ {
+ String longString = "qqwqweqwerwefasdfvadg;ladfladjfl;gjadlfbvaldkmvalkml;vasvlkjaslkvjalskvjlakssjvlkasjvlkadfjvlkadjfvlkjadlkvjalkdjvlkadfjvlkadjvlkajvlakjvladkjvladkjvlkajvlkadjf";
+ for (int i = 0; i < 1000; i++)
+ System.out.println(longString);
+ return Boolean.TRUE;
+ }
+
+ /************************************* InfiniteLoopJob *********************************************************/
+
+ public Boolean InfiniteLoopJob()
+ {
+ for (;;)
+ {
+ if (getStarterJob().checkAbort()) break;
+ if (false) break;
+ }
+ return Boolean.TRUE;
+ }
+}
diff --git a/com/sun/electric/tool/user/tests/LayerCoverageToolTest.java b/com/sun/electric/tool/user/tests/LayerCoverageToolTest.java
new file mode 100644
index 0000000..bf139a5
--- /dev/null
+++ b/com/sun/electric/tool/user/tests/LayerCoverageToolTest.java
@@ -0,0 +1,391 @@
+ /* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: LayerCoverageToolTest.java
+ *
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.user.tests;
+
+import com.sun.electric.database.EditingPreferences;
+import com.sun.electric.database.geometry.GeometryHandler;
+import com.sun.electric.database.geometry.ObjectQTree;
+import com.sun.electric.database.hierarchy.Cell;
+import com.sun.electric.database.hierarchy.EDatabase;
+import com.sun.electric.database.hierarchy.Library;
+import com.sun.electric.database.id.CellId;
+import com.sun.electric.database.network.Netlist;
+import com.sun.electric.database.network.Network;
+import com.sun.electric.database.prototype.NodeProto;
+import com.sun.electric.database.text.TextUtils;
+import com.sun.electric.database.topology.NodeInst;
+import com.sun.electric.technology.Layer;
+import com.sun.electric.technology.TechPool;
+import com.sun.electric.technology.Technology;
+import com.sun.electric.tool.Job;
+import com.sun.electric.tool.JobException;
+import com.sun.electric.tool.extract.LayerCoverageTool;
+import com.sun.electric.tool.user.MessagesStream;
+import com.sun.electric.tool.user.User;
+import com.sun.electric.util.math.DBMath;
+import com.sun.electric.util.math.GenMath;
+import com.sun.electric.util.math.Orientation;
+
+import java.awt.geom.Point2D;
+import java.awt.geom.Rectangle2D;
+import java.util.ArrayList;
+import java.util.BitSet;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Class to test the layer coverage tool.
+ */
+public class LayerCoverageToolTest extends AbstractTest
+{
+ public LayerCoverageToolTest(String name)
+ {
+ super(name);
+ }
+
+ public static List<AbstractTest> getTests()
+ {
+ List<AbstractTest> list = new ArrayList<AbstractTest>();
+ list.add(new LayerCoverageToolTest("Area"));
+ list.add(new LayerCoverageToolTest("Network"));
+ list.add(new LayerCoverageToolTest("Implant"));
+ list.add(new LayerCoverageToolTest("QTree"));
+ return list;
+ }
+
+ public static String getOutputDirectory()
+ {
+ return null;
+ }
+
+ /************************************* Area *********************************************************/
+
+ public Boolean Area()
+ {
+ return Boolean.valueOf(basicAreaCoverageTest(null));
+ }
+
+ /**
+ * Basic test of area coverage. Function must be public due to regressions.
+ * @param logname
+ * @return true if test passes
+ */
+ public static boolean basicAreaCoverageTest(String logname)
+ {
+ boolean[] errorCounts = new boolean[2];
+
+ try
+ {
+ if (logname != null)
+ MessagesStream.getMessagesStream().save(logname);
+ String techName = "mocmos";
+ String libName = "areaCoverage" + techName;
+ EditingPreferences ep = new EditingPreferences(true, TechPool.getThreadTechPool());
+ makeFakeCircuitryForCoverageCommand(libName, techName, false, ep);
+ Library rootLib = Library.findLibrary(libName);
+ Cell cell = rootLib.findNodeProto("higher{lay}");
+
+ GeometryHandler.GHMode[] modes = {GeometryHandler.GHMode.ALGO_MERGE, GeometryHandler.GHMode.ALGO_SWEEP};
+ for (int i = 0; i < modes.length; i++)
+ {
+ GeometryHandler.GHMode mode = modes[i];
+ System.out.println("------ RUNNING " + mode + " MODE -------------");
+ Map<Layer,Double> map = LayerCoverageTool.layerCoverageCommand(cell, mode, false, new LayerCoverageTool.LayerCoveragePreferences(true));
+ errorCounts[i] = map == null;
+ System.out.println("------ FINISHED " + mode + " MODE: " + (errorCounts[i] ? "FAILED" : "PASSED"));
+ }
+ } catch (Exception e)
+ {
+ System.out.println("exception: "+e);
+ e.printStackTrace();
+ return false;
+ }
+ return(!errorCounts[0] && !errorCounts[1]);
+ }
+
+ public static void makeFakeCircuitryForCoverageCommand(String libName, String tech, boolean asJob, EditingPreferences ep)
+ {
+ // test code to make and show something
+ if (asJob)
+ {
+ new FakeCoverageCircuitry(libName, tech);
+ } else
+ {
+ FakeCoverageCircuitry.doItInternal(libName, tech, new HashMap<CellId,BitSet>(), ep);
+ }
+ }
+
+ private static class FakeCoverageCircuitry extends Job
+ {
+ private String theTechnology;
+ private String theLibrary;
+ private Map<CellId,BitSet> nodesToExpand = new HashMap<CellId,BitSet>();
+
+ protected FakeCoverageCircuitry(String libName, String tech)
+ {
+ super("Make fake circuitry for coverage tests", User.getUserTool(), Job.Type.CHANGE, null, null, Job.Priority.USER);
+ theTechnology = tech;
+ theLibrary = libName;
+ startJob();
+ }
+
+ @Override
+ public boolean doIt() throws JobException
+ {
+ doItInternal(theLibrary, theTechnology, nodesToExpand, getEditingPreferences());
+ fieldVariableChanged("nodesToExpand");
+ return true;
+ }
+
+ @Override
+ public void terminateOK()
+ {
+ getDatabase().expandNodes(nodesToExpand);
+ }
+
+ private static void doItInternal(String libName, String technology, Map<CellId,BitSet> nodesToExpand, EditingPreferences ep)
+ {
+ EDatabase database = EDatabase.currentDatabase();
+
+ // get information about the nodes
+ Technology tech = Technology.findTechnology(technology);
+ if (tech == null)
+ {
+ System.out.println("Technology not found in createCoverageTestCells");
+ return;
+ }
+
+ NodeProto m1NodeProto = Cell.findNodeProto(technology+":Metal-1-Node");
+ NodeProto m2NodeProto = Cell.findNodeProto(technology+":Metal-2-Node");
+ NodeProto m3NodeProto = Cell.findNodeProto(technology+":Metal-3-Node");
+ NodeProto m4NodeProto = Cell.findNodeProto(technology+":Metal-4-Node");
+
+ // create the test library
+ Library mainLib = Library.newInstance(libName, null);
+
+ // create a layout cell in the library
+ Cell m1Cell = Cell.makeInstance(ep, mainLib, technology+"Metal1Test{lay}");
+ NodeInst.newInstance(m1NodeProto, ep, new Point2D.Double(0, 0), m1NodeProto.getDefWidth(ep), m1NodeProto.getDefHeight(ep), m1Cell);
+
+ // Two metals
+ Cell myCell = Cell.makeInstance(ep, mainLib, technology+"M1M2Test{lay}");
+ NodeInst.newInstance(m1NodeProto, ep, new Point2D.Double(-m1NodeProto.getDefWidth(ep)/2, -m1NodeProto.getDefHeight(ep)/2),
+ m1NodeProto.getDefWidth(ep), m1NodeProto.getDefHeight(ep), myCell);
+ NodeInst.newInstance(m2NodeProto, ep, new Point2D.Double(-m2NodeProto.getDefWidth(ep)/2, m2NodeProto.getDefHeight(ep)/2),
+ m2NodeProto.getDefWidth(ep), m2NodeProto.getDefHeight(ep), myCell);
+ NodeInst.newInstance(m3NodeProto, ep, new Point2D.Double(m3NodeProto.getDefWidth(ep)/2, -m3NodeProto.getDefHeight(ep)/2),
+ m3NodeProto.getDefWidth(ep), m3NodeProto.getDefHeight(ep), myCell);
+ NodeInst.newInstance(m4NodeProto, ep, new Point2D.Double(m4NodeProto.getDefWidth(ep)/2, m4NodeProto.getDefHeight(ep)/2),
+ m4NodeProto.getDefWidth(ep), m4NodeProto.getDefHeight(ep), myCell);
+
+ // now up the hierarchy
+ Cell higherCell = Cell.makeInstance(ep, mainLib, "higher{lay}");
+ double myWidth = myCell.getDefWidth();
+ double myHeight = myCell.getDefHeight();
+ for (int iX = 0; iX < 2; iX++)
+ {
+ boolean flipX = iX != 0;
+ for (int i = 0; i < 4; i++)
+ {
+ Orientation orient = Orientation.fromJava(i*900, flipX, false);
+ NodeInst instanceNode = NodeInst.newInstance(myCell, ep, new Point2D.Double(i*myWidth, iX*myHeight), myWidth, myHeight, higherCell, orient, null);
+ database.addToNodes(nodesToExpand, instanceNode);
+ }
+ }
+ System.out.println("Created " + higherCell);
+ }
+ }
+
+ /************************************* Network *********************************************************/
+
+ public Boolean Network()
+ {
+ return Boolean.valueOf(basicNetworkCoverageTest(null));
+ }
+
+ /**
+ * Basic test of network coverage. Function must be public due to regressions.
+ * @param logname
+ * @return true if test passes.
+ */
+ public static boolean basicNetworkCoverageTest(String logname)
+ {
+ boolean[] errorCounts = new boolean[2];
+ double delta = DBMath.getEpsilon()* DBMath.getEpsilon();
+ double wireLength = GenMath.toNearest(165.45876875, delta);
+
+ try
+ {
+ if (logname != null)
+ MessagesStream.getMessagesStream().save(logname);
+ String techName = "mocmos";
+ String libName = "networkCoverage"+techName;
+ EditingPreferences ep = new EditingPreferences(true, TechPool.getThreadTechPool());
+ MakeFakeCircuitry.makeFakeCircuitryCommand(libName, techName, Boolean.FALSE, ep);
+ Library rootLib = Library.findLibrary(libName);
+ Cell cell = rootLib.findNodeProto(techName+"test{lay}");
+ double calculatedValue = 0;
+
+ // Similar to ListGeomsAllNetworksJob
+ Netlist netlist = cell.getNetlist();
+ ArrayList<Network> networks = new ArrayList<Network>();
+ for (Iterator<Network> it = netlist.getNetworks(); it.hasNext(); )
+ {
+ networks.add(it.next());
+ }
+
+ // sort list of networks by name
+ Collections.sort(networks, new TextUtils.NetworksByName());
+
+ GeometryHandler.GHMode[] modes = {GeometryHandler.GHMode.ALGO_MERGE, GeometryHandler.GHMode.ALGO_SWEEP};
+
+ LayerCoverageTool.LayerCoveragePreferences lcp = new LayerCoverageTool.LayerCoveragePreferences(true);
+ for (int i = 0; i < modes.length; i++)
+ {
+ GeometryHandler.GHMode mode = modes[i];
+ System.out.println("------ RUNNING " + mode + " MODE -------------");
+ for (Iterator<Network> it = networks.iterator(); it.hasNext(); )
+ {
+ Network net = it.next();
+ Set<Network> nets = new HashSet<Network>();
+ nets.add(net);
+ LayerCoverageTool.GeometryOnNetwork geoms =
+ LayerCoverageTool.listGeometryOnNetworks(cell, nets, false, mode, lcp);
+ System.out.println("Network "+net+" has wire length "+geoms.getTotalWireLength());
+
+ // Only 1 net gives non zero value
+ if (geoms.getTotalWireLength() != 0)
+ calculatedValue = GenMath.toNearest(geoms.getTotalWireLength(), delta);
+ }
+ System.out.println("Wire value " + calculatedValue + " (expected " + wireLength + ")");
+ errorCounts[i] = !GenMath.doublesEqual(calculatedValue, wireLength);
+ System.out.println("------ FINISHED " + mode + " MODE: " + (errorCounts[i] ? "FAILED" : "PASSED"));
+ }
+ } catch (Exception e)
+ {
+ System.out.println("exception: "+e);
+ e.printStackTrace();
+ return false;
+ }
+ return(!errorCounts[0] && !errorCounts[1]);
+ }
+
+ /************************************* Implant *********************************************************/
+
+ public Boolean Implant()
+ {
+ return Boolean.valueOf(basicImplantCoverageTest(null));
+ }
+
+ /**
+ * Basic test of implant coverage. Function must be public due to regressions.
+ * @param logname
+ * @return true if test passes
+ */
+ public static boolean basicImplantCoverageTest(String logname)
+ {
+ boolean[] errorCounts = new boolean[2];
+
+ try
+ {
+ if (logname != null)
+ MessagesStream.getMessagesStream().save(logname);
+ String techName = "mocmos";
+ String libName = "implantCoverage"+techName;
+ EditingPreferences ep = new EditingPreferences(true, TechPool.getThreadTechPool());
+ MakeFakeCircuitry.makeFakeCircuitryCommand(libName, techName, Boolean.FALSE, ep);
+ Library rootLib = Library.findLibrary(libName);
+ Cell cell = rootLib.findNodeProto(techName+"test{lay}");
+ GeometryHandler.GHMode[] modes = {GeometryHandler.GHMode.ALGO_MERGE, GeometryHandler.GHMode.ALGO_SWEEP};
+ int[] results = {2, 2};
+
+ for (int i = 0; i < modes.length; i++)
+ {
+ GeometryHandler.GHMode mode = modes[i];
+ System.out.println("------ RUNNING " + mode + " MODE -------------");
+ List<Object> list = LayerCoverageTool.layerCoverageCommand(LayerCoverageTool.LCMode.IMPLANT, mode, cell, false, new LayerCoverageTool.LayerCoveragePreferences(true));
+ errorCounts[i] = (list.size() != results[i]); // Only one implant is expected. We should get the size and location!!!
+ System.out.println("------ FINISHED " + mode + " MODE: " + (errorCounts[i] ? "FAILED" : "PASSED"));
+ }
+ } catch (Exception e)
+ {
+ System.out.println("exception: "+e);
+ e.printStackTrace();
+ return false;
+ }
+ return !errorCounts[0] && !errorCounts[1];
+ }
+
+ /************************************* QTree *********************************************************/
+
+ public Boolean QTree()
+ {
+ return Boolean.valueOf(basicQTreeTest(null));
+ }
+
+ /**
+ * Basic function to test QTree operations. Function must be public due to regressions.
+ * @param logname
+ * @return true if test passes
+ */
+ public static boolean basicQTreeTest(String logname)
+ {
+ boolean pass = false;
+
+ try
+ {
+ if (logname != null)
+ MessagesStream.getMessagesStream().save(logname);
+
+ Rectangle2D expanded = new Rectangle2D.Double(9, 7, 2, 6);
+ ObjectQTree oqt = new ObjectQTree(expanded);
+
+ Rectangle2D bounds1 = new Rectangle2D.Double(10, 8, 0, 0); // along middle X = 10, outside search box
+ oqt.add(new Integer(1), bounds1);
+ Rectangle2D bounds2 = new Rectangle2D.Double(10, 10, 0, 0); // along middle X = 10
+ oqt.add(new Integer(2), bounds2);
+ Rectangle2D bounds3 = new Rectangle2D.Double(10, 12, 0, 0); // along middle X = 10
+ oqt.add(new Integer(3), bounds3);
+ Rectangle2D bounds4 = new Rectangle2D.Double(10.5, 11, 0, 0); // in top-left quadrant
+ oqt.add(new Integer(4), bounds4);
+ Rectangle2D bounds5 = new Rectangle2D.Double(14, 10.6, 0, 0); // in bottom-left quadrant, outside search box
+ oqt.add(new Integer(5), bounds5);
+
+ Rectangle2D searchBounds = new Rectangle2D.Double(9.5, 10, 2, 4);
+ Set set = oqt.find(searchBounds);
+ int setSize = 0;
+ if (set != null) setSize = set.size();
+ pass = setSize == 3;
+
+ } catch (Exception e)
+ {
+ System.out.println("exception: "+e);
+ e.printStackTrace();
+ }
+ return pass;
+ }
+}
diff --git a/com/sun/electric/tool/user/tests/LogicalEffortTest.java b/com/sun/electric/tool/user/tests/LogicalEffortTest.java
new file mode 100644
index 0000000..da77dcf
--- /dev/null
+++ b/com/sun/electric/tool/user/tests/LogicalEffortTest.java
@@ -0,0 +1,147 @@
+ /* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: LogicalEffortTest.java
+ *
+ * Copyright (c) 2008, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.user.tests;
+
+import com.sun.electric.database.EditingPreferences;
+import com.sun.electric.database.hierarchy.Cell;
+import com.sun.electric.database.hierarchy.Library;
+import com.sun.electric.database.variable.VarContext;
+import com.sun.electric.technology.TechPool;
+import com.sun.electric.tool.generator.layout.LayoutLib;
+import com.sun.electric.tool.lang.EvalJavaBsh;
+import com.sun.electric.tool.logicaleffort.LENetlister;
+import com.sun.electric.tool.logicaleffort.LESizer;
+import com.sun.electric.tool.logicaleffort.LETool;
+import com.sun.electric.tool.user.ErrorLogger;
+import com.sun.electric.tool.user.MessagesStream;
+import com.sun.electric.tool.user.User;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Class to test the Logical Effort tool.
+ */
+public class LogicalEffortTest extends AbstractTest
+{
+ public LogicalEffortTest(String name)
+ {
+ super(name);
+ }
+
+ public static List<AbstractTest> getTests()
+ {
+ List<AbstractTest> list = new ArrayList<AbstractTest>();
+ if (EvalJavaBsh.hasBeanShell())
+ list.add(new LogicalEffortTest("LE"));
+ return list;
+ }
+
+ public static String getOutputDirectory()
+ {
+ String rootPath = User.getRegressionPath();
+ if (rootPath == null) return null;
+ return rootPath + "/tools/LogicalEffort/output/";
+ }
+
+ /************************************* LE *********************************************************/
+
+ public Boolean LE()
+ {
+ String libName = "LETest.jelib";
+ String cellName = "total_core";
+ int expectedSize = 2247;
+ int expectedErrors = 0;
+ int expectedWarnings = 770;
+
+ boolean failed = runSizing("LogicalEffort", libName, cellName, getRegressionPath(), expectedSize, expectedErrors, expectedWarnings);
+ return Boolean.valueOf(!failed);
+ }
+
+ /**
+ * Run Logical Effort Sizing on a cell.
+ * @param testName the name of the test.
+ * @param libName the name of the library to load.
+ * @param cellName the name of the schematic cell to test.
+ * @param rootPath
+ * @param expectedSize the expected total size of all sizable gates, truncated to an integer.
+ * @param expectedErrors the number of expected errors.
+ * @param expectedWarnings the number of expected warnings.
+ * @return true if failed.
+ */
+ public static boolean runSizing(String testName, String libName, String cellName,
+ String rootPath, int expectedSize, int expectedErrors, int expectedWarnings)
+ {
+ boolean failed = false;
+ try
+ {
+ String testParameter = properDirectory(rootPath, LogicalEffortTest.class);
+ String testLibPath = dataDir(rootPath, testParameter) + libName;
+ String outputDir = outputDir(rootPath, testParameter);
+ ensureOutputDirectory(outputDir);
+ MessagesStream.getMessagesStream().save(outputDir + testName + ".log");
+
+ EditingPreferences ep = new EditingPreferences(true, TechPool.getThreadTechPool());
+ Library lib = LayoutLib.openLibForRead(testLibPath, ep, true);
+ if (lib == null)
+ {
+ System.out.println("ERROR: Cannot read library " + testLibPath);
+ return true;
+ }
+ Cell lay = lib.findNodeProto(cellName + "{sch}");
+ if (lay == null)
+ {
+ System.out.println("ERROR: Cannot find cell " + cellName + "{sch} in library " + lib.getName());
+ return true;
+ }
+
+ // run logical effort on top level
+ LETool.AnalyzeCell job = new LETool.AnalyzeCell(LESizer.Alg.EQUALGATEDELAYS, lay, VarContext.globalContext, true);
+ job.doIt();
+ LENetlister netlister = job.getNetlister();
+ ErrorLogger logger = netlister.getErrorLogger();
+
+ // check number of errors and warnings
+ if (expectedErrors != logger.getNumErrors())
+ {
+ System.out.println("Error: found: " + logger.getNumErrors() + " errors but expected " + expectedErrors);
+ failed = true;
+ }
+ if (expectedWarnings != logger.getNumWarnings())
+ {
+ System.out.println("Error: found: " + logger.getNumWarnings() + " warnings but expected " + expectedWarnings);
+ failed = true;
+ }
+ if (expectedSize != (int)netlister.getTotalLESize())
+ {
+ System.out.println("Error: found: " + (int)netlister.getTotalLESize() + " size, but expected " + expectedSize);
+ failed = true;
+ }
+ } catch (Exception e)
+ {
+ System.out.println("Exception: " + e);
+ e.printStackTrace();
+ failed = true;
+ }
+ return failed;
+ }
+}
diff --git a/com/sun/electric/tool/user/tests/MakeFakeCircuitry.java b/com/sun/electric/tool/user/tests/MakeFakeCircuitry.java
new file mode 100644
index 0000000..dc311b5
--- /dev/null
+++ b/com/sun/electric/tool/user/tests/MakeFakeCircuitry.java
@@ -0,0 +1,263 @@
+ /* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: MakeFakeCircuitry.java
+ *
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.user.tests;
+
+import com.sun.electric.database.EditingPreferences;
+import com.sun.electric.database.hierarchy.Cell;
+import com.sun.electric.database.hierarchy.EDatabase;
+import com.sun.electric.database.hierarchy.Export;
+import com.sun.electric.database.hierarchy.Library;
+import com.sun.electric.database.id.CellId;
+import com.sun.electric.database.prototype.NodeProto;
+import com.sun.electric.database.prototype.PortCharacteristic;
+import com.sun.electric.database.topology.ArcInst;
+import com.sun.electric.database.topology.NodeInst;
+import com.sun.electric.database.topology.PortInst;
+import com.sun.electric.database.variable.TextDescriptor;
+import com.sun.electric.technology.ArcProto;
+import com.sun.electric.technology.Technology;
+import com.sun.electric.technology.technologies.Artwork;
+import com.sun.electric.tool.Job;
+import com.sun.electric.tool.JobException;
+import com.sun.electric.tool.user.User;
+import com.sun.electric.util.math.Orientation;
+
+import java.awt.geom.Point2D;
+import java.util.BitSet;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Class to read a library in a new thread.
+ */
+public class MakeFakeCircuitry extends Job
+{
+ private String theTechnology;
+ private String theLibrary;
+ private Cell myCell;
+ private Map<CellId,BitSet> nodesToExpand = new HashMap<CellId,BitSet>();
+
+ /**
+ * Used by regressions and GUI
+ * @param lib
+ * @param tech
+ * @param asJob
+ */
+ public static void makeFakeCircuitryCommand(String lib, String tech, Boolean asJob, EditingPreferences ep)
+ {
+ // test code to make and show something
+ if (asJob.booleanValue())
+ {
+ new MakeFakeCircuitry(lib, tech);
+ } else
+ {
+ doItInternal(lib, tech, new HashMap<CellId,BitSet>(), ep);
+ }
+ }
+
+ protected MakeFakeCircuitry(String lib, String tech)
+ {
+ super("Make fake circuitry", User.getUserTool(), Job.Type.CHANGE, null, null, Job.Priority.USER);
+ theLibrary = lib;
+ theTechnology = tech;
+ startJob();
+ }
+
+ @Override
+ public boolean doIt() throws JobException
+ {
+ myCell = doItInternal(theLibrary, theTechnology, nodesToExpand, getEditingPreferences());
+ fieldVariableChanged("myCell");
+ fieldVariableChanged("nodesToExpand");
+ return true;
+ }
+
+ @Override
+ public void terminateOK()
+ {
+ getDatabase().expandNodes(nodesToExpand);
+ Job.getUserInterface().displayCell(myCell);
+ }
+
+ /**
+ * External static call for regressions
+ * @param library
+ * @param technology
+ * @return the generated Cell.
+ */
+ private static Cell doItInternal(String library, String technology, Map<CellId,BitSet> nodesToExpand, EditingPreferences ep)
+ {
+ EDatabase database = EDatabase.currentDatabase();
+ // get information about the nodes
+ Technology tech = Technology.findTechnology(technology);
+ if (tech == null)
+ {
+ System.out.println("Technology not found in MakeFakeCircuitry");
+ return null;
+ }
+
+ StringBuffer polyName = new StringBuffer("Polysilicon");
+ String lateral = "top";
+ int traRot = 0;
+ int rotTraRot = 3150;
+
+ if (technology.equals("mocmos"))
+ {
+ polyName.append("-1");
+ lateral = "right";
+ } else
+ {
+ traRot = 2700;
+ rotTraRot = 2250;
+ }
+
+ NodeProto m1m2Proto = Cell.findNodeProto(technology+":Metal-1-Metal-2-Con");
+ NodeProto m2PinProto = Cell.findNodeProto(technology+":Metal-2-Pin");
+ NodeProto p1PinProto = Cell.findNodeProto(technology+":" + polyName + "-Pin");
+ NodeProto m1PolyConProto = Cell.findNodeProto(technology+":Metal-1-" + polyName + "-Con");
+ NodeProto pTransProto = Cell.findNodeProto(technology+":P-Transistor");
+ NodeProto nTransProto = Cell.findNodeProto(technology+":N-Transistor");
+ NodeProto invisiblePinProto = Cell.findNodeProto("generic:Invisible-Pin");
+
+ // get information about the arcs
+ ArcProto m1Proto = ArcProto.findArcProto(technology+":Metal-1");
+ if (m1Proto == null)
+ m1Proto = ArcProto.findArcProto(technology+":metal-1");
+ ArcProto m2Proto = ArcProto.findArcProto(technology+":Metal-2");
+ if (m2Proto == null)
+ m2Proto = ArcProto.findArcProto(technology+":metal-2");
+ ArcProto p1Proto = ArcProto.findArcProto(technology+":"+polyName);
+
+ // create the test library
+ Library mainLib = Library.newInstance(library, null);
+
+ // create a layout cell in the library
+ Cell myCell = Cell.makeInstance(ep, mainLib, technology+"test{lay}");
+ NodeInst metal12Via = NodeInst.newInstance(m1m2Proto, ep, new Point2D.Double(-20.0, 20.0), m1m2Proto.getDefWidth(ep), m1m2Proto.getDefHeight(ep), myCell);
+ NodeInst contactNode = NodeInst.newInstance(m1PolyConProto, ep, new Point2D.Double(20.0, 20.0), m1PolyConProto.getDefWidth(ep), m1PolyConProto.getDefHeight(ep), myCell);
+ NodeInst metal2Pin = NodeInst.newInstance(m2PinProto, ep, new Point2D.Double(-20.0, 10.0), m2PinProto.getDefWidth(ep), m2PinProto.getDefHeight(ep), myCell);
+ NodeInst poly1PinA = NodeInst.newInstance(p1PinProto, ep, new Point2D.Double(20.0, -20.0), p1PinProto.getDefWidth(ep), p1PinProto.getDefHeight(ep), myCell);
+ NodeInst poly1PinB = NodeInst.newInstance(p1PinProto, ep, new Point2D.Double(20.0, -10.0), p1PinProto.getDefWidth(ep), p1PinProto.getDefHeight(ep), myCell);
+ NodeInst transistor = NodeInst.newInstance(pTransProto, ep, new Point2D.Double(0.0, -20.0), pTransProto.getDefWidth(ep), pTransProto.getDefHeight(ep), myCell, Orientation.fromAngle(traRot), null);
+ NodeInst rotTrans = NodeInst.newInstance(nTransProto, ep, new Point2D.Double(0.0, 10.0), nTransProto.getDefWidth(ep), nTransProto.getDefHeight(ep), myCell, Orientation.fromAngle(rotTraRot), "rotated");
+ if (metal12Via == null || contactNode == null || metal2Pin == null || poly1PinA == null ||
+ poly1PinB == null || transistor == null || rotTrans == null) return myCell;
+
+ // make arcs to connect them
+ PortInst m1m2Port = metal12Via.getOnlyPortInst();
+ PortInst contactPort = contactNode.getOnlyPortInst();
+ PortInst m2Port = metal2Pin.getOnlyPortInst();
+ PortInst p1PortA = poly1PinA.getOnlyPortInst();
+ PortInst p1PortB = poly1PinB.getOnlyPortInst();
+ PortInst transPortR = transistor.findPortInst("poly-" + lateral);
+
+ // Old style
+ if (transPortR == null) transPortR = transistor.findPortInst("p-trans-poly-" + lateral);
+ PortInst transRPortR = rotTrans.findPortInst("poly-" + lateral);
+
+ // Old style
+ if (transRPortR == null) transRPortR = rotTrans.findPortInst("n-trans-poly-" + lateral);
+ ArcInst metal2Arc = ArcInst.makeInstance(m2Proto, ep, m2Port, m1m2Port);
+ if (metal2Arc == null) return myCell;
+ metal2Arc.setRigid(true);
+ ArcInst metal1Arc = ArcInst.makeInstance(m1Proto, ep, contactPort, m1m2Port);
+ if (metal1Arc == null) return myCell;
+ ArcInst polyArc1 = ArcInst.makeInstance(p1Proto, ep, contactPort, p1PortB);
+ if (polyArc1 == null) return myCell;
+ ArcInst polyArc3 = ArcInst.makeInstance(p1Proto, ep, p1PortB, p1PortA);
+ if (polyArc3 == null) return myCell;
+ ArcInst polyArc2 = ArcInst.makeInstance(p1Proto, ep, transPortR, p1PortA);
+ if (polyArc2 == null) return myCell;
+ ArcInst polyArc4 = ArcInst.makeInstance(p1Proto, ep, transRPortR, p1PortB);
+ if (polyArc4 == null) return myCell;
+
+ // export the two pins
+ Export.newInstance(myCell, m1m2Port, "in", ep, PortCharacteristic.IN);
+ Export.newInstance(myCell, p1PortA, "out", ep, PortCharacteristic.OUT);
+ System.out.println("Created " + myCell);
+
+ // now up the hierarchy
+ Cell higherCell = Cell.makeInstance(ep, mainLib, "higher{lay}");
+ double myWidth = myCell.getDefWidth();
+ double myHeight = myCell.getDefHeight();
+ for (int iX = 0; iX < 2; iX++)
+ {
+ boolean flipX = iX != 0;
+ for (int i = 0; i < 4; i++)
+ {
+ Orientation orient = Orientation.fromJava(i*900, flipX, false);
+ NodeInst instanceNode = NodeInst.newInstance(myCell, ep, new Point2D.Double(i*100, iX*200), myWidth, myHeight, higherCell, orient, null);
+ database.addToNodes(nodesToExpand, instanceNode);
+ NodeInst instanceUNode = NodeInst.newInstance(myCell, ep, new Point2D.Double(i*100, iX*200 + 100), myWidth, myHeight, higherCell, orient, null);
+ if (iX == 0 && i == 0)
+ {
+ PortInst instance1Port = instanceNode.findPortInst("in");
+ PortInst instance2Port = instanceUNode.findPortInst("in");
+ ArcInst.makeInstance(m1Proto, ep, instance1Port, instance2Port);
+ }
+ }
+ }
+ System.out.println("Created " + higherCell);
+
+ // now a rotation test
+ Cell rotTestCell = Cell.makeInstance(ep, mainLib, "rotationTest{lay}");
+ TextDescriptor td = ep.getNodeTextDescriptor().withRelSize(10);
+ for (int iY = 0; iY < 2; iY++)
+ {
+ boolean flipY = iY != 0;
+ for (int iX = 0; iX < 2; iX++)
+ {
+ boolean flipX = iX != 0;
+ for (int i = 0; i < 4; i++)
+ {
+ int angle = i*900;
+ Orientation orient = Orientation.fromJava(angle, flipX, flipY);
+ int x = i*100;
+ int y = iX*100 + iY*200;
+ NodeInst ni = NodeInst.newInstance(myCell, ep, new Point2D.Double(x, y), myWidth, myHeight, rotTestCell, orient, null);
+ database.addToNodes(nodesToExpand, ni);
+ NodeInst nodeLabel = NodeInst.newInstance(invisiblePinProto, ep, new Point2D.Double(x, y - 35), 0, 0, rotTestCell);
+ String message = "Rotated " + (orient == Orientation.IDENT ? "0" : orient.toString());
+ nodeLabel.newVar(Artwork.ART_MESSAGE, message,td);
+ }
+ }
+ }
+ System.out.println("Created " + rotTestCell);
+
+ // now up the hierarchy even farther
+ Cell bigCell = Cell.makeInstance(ep, mainLib, "big{lay}");
+ int arraySize = 20;
+ for(int y=0; y<arraySize; y++)
+ {
+ for(int x=0; x<arraySize; x++)
+ {
+ String theName = "arr["+ x + "][" + y + "]";
+ NodeInst instanceNode = NodeInst.newInstance(myCell, ep, new Point2D.Double(x*(myWidth+2), y*(myHeight+2)),
+ myWidth, myHeight, bigCell, Orientation.IDENT, theName);
+ instanceNode.setOff(NodeInst.NODE_NAME, 0, 8);
+ if ((x%2) == (y%2)) database.addToNodes(nodesToExpand, instanceNode);
+ }
+ }
+ System.out.println("Created " + bigCell);
+ return myCell;
+ }
+}
diff --git a/com/sun/electric/tool/user/tests/NCCTest.java b/com/sun/electric/tool/user/tests/NCCTest.java
new file mode 100644
index 0000000..7e8169b
--- /dev/null
+++ b/com/sun/electric/tool/user/tests/NCCTest.java
@@ -0,0 +1,480 @@
+ /* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: NCCTest.java
+ *
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.user.tests;
+
+import com.sun.electric.database.EditingPreferences;
+import com.sun.electric.database.hierarchy.Cell;
+import com.sun.electric.database.hierarchy.Library;
+import com.sun.electric.database.variable.VarContext;
+import com.sun.electric.technology.TechPool;
+import com.sun.electric.tool.generator.layout.LayoutLib;
+import com.sun.electric.tool.ncc.Ncc;
+import com.sun.electric.tool.ncc.NccOptions;
+import com.sun.electric.tool.ncc.SchemNamesToLay;
+import com.sun.electric.tool.ncc.result.NccResult;
+import com.sun.electric.tool.ncc.result.NccResults;
+import com.sun.electric.tool.user.User;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Class to test the NCC tool.
+ */
+public class NCCTest extends AbstractTest
+{
+ public NCCTest(String name)
+ {
+ super(name);
+ }
+
+ public static List<AbstractTest> getTests()
+ {
+ List<AbstractTest> list = new ArrayList<AbstractTest>();
+ list.add(new NCCTest("Q0")); // qThree top (which fails)
+ list.add(new NCCTest("Q1"));
+ list.add(new NCCTest("Q2"));
+ list.add(new NCCTest("Q3"));
+ list.add(new NCCTest("Q4"));
+ list.add(new NCCTest("Q5"));
+ list.add(new NCCTest("M0")); // muddChip top (which fails)
+ list.add(new NCCTest("M1"));
+ list.add(new NCCTest("M2"));
+ list.add(new NCCTest("M3"));
+ list.add(new NCCTest("M4"));
+ list.add(new NCCTest("M5"));
+ list.add(new NCCTest("M6"));
+ list.add(new NCCTest("M7"));
+ list.add(new NCCTest("M8"));
+ return list;
+ }
+
+ public static String getOutputDirectory()
+ {
+ String rootPath = User.getRegressionPath();
+ if (rootPath == null) return null;
+ return rootPath + "/tools/NCC/output/";
+ }
+
+ /************************************* Q0 *********************************************************/
+
+ public boolean Q0()
+ {
+ createMessageOutput();
+ return NCCTestQ0Run(getRegressionPath());
+ }
+
+ public static boolean NCCTestQ0Run(String regressionDirPath)
+ {
+ RootCells rootCells = getRootCells(regressionDirPath, "data/qThree/qThreeTop.jelib", "qThreeTop");
+ NccResults results = compare(rootCells.sch, null, rootCells.lay, null, hierOptions());
+ return checkResults(results, 39, 0, 0, false, 139, 0, 0, 0, 0, new String[] {
+ "rowColScan:drivePass{sch} with: rowColScan:drivePass{lay}",
+ "rowColScan:scan2{sch} with: rowColScan:scan2{lay}",
+ "rowColScan:scanBoost5{sch} with: rowColScan:scanBoost5{lay}",
+ "group:fullGroupCap{sch} with: group:fullGroupCap{lay}",
+ "rowColScan:scan6{sch} with: rowColScan:scan6{lay}",
+ "jtag:IRdecode{sch} with: jtag:IRdecode{lay}",
+ "jtag:tsinv{sch} with: jtag:tsinv{lay}",
+ "jtag:jtagScanControl{sch} with: jtag:jtagScanControl{lay}",
+ "jtag:tapCtlJKL{sch} with: jtag:tapCtlJKL{lay}",
+ "jtag:jtagCentral{sch} with: jtag:jtagCentral{lay}",
+ "qThree_pads_180nm:padGnd{sch} with: qThree_pads_180nm:padGnd{lay}",
+ "padParts:bufStrength48{sch} with: padParts:bufStrength48{lay}",
+ "padParts:padpart_buf90{sch} with: padParts:padpart_buf90{lay}",
+ "qThree_pads_180nm:padInStrong{sch} with: qThree_pads_180nm:padInStrong{lay}",
+ "qThree_pads_180nm:padOut{sch} with: qThree_pads_180nm:padOut{lay}",
+ "qThree_pads_180nm:padRawESD{sch} with: qThree_pads_180nm:padRawESD{lay}",
+ "qThree_pads_180nm:padVdd{sch} with: qThree_pads_180nm:padVdd{lay}",
+ "qThreeTop:rectGroup{sch} with: qThreeTop:rectGroup{lay}",
+ "qThreeTop:qThreeTop{sch} with: qThreeTop:qThreeTop{lay}"
+ });
+ }
+
+ /************************************* Q1 *********************************************************/
+
+ public boolean Q1()
+ {
+ createMessageOutput();
+ return NCCTestQ1Run(getRegressionPath());
+ }
+
+ public static boolean NCCTestQ1Run(String regressionDirPath)
+ {
+ RootCells rootCells = getRootCells(regressionDirPath, "data/qThree/qThreeTop.jelib", "rectifier");
+ NccResults results = compare(rootCells.sch, null, rootCells.lay, null, hierOptions());
+ return checkResults(results, 3, 0, 0, false, 5, 0, 0, 0, 0, new String[] {});
+ }
+
+ /************************************* Q2 *********************************************************/
+
+ public boolean Q2()
+ {
+ createMessageOutput();
+ return NCCTestQ2Run(getRegressionPath());
+ }
+
+ public static boolean NCCTestQ2Run(String regressionDirPath)
+ {
+ RootCells rootCells = getRootCells(regressionDirPath, "data/qThree/rowColScan.jelib", "colScanCx1");
+ NccResults results = compare(rootCells.sch, null, rootCells.lay, null, hierOptions());
+ return checkResults(results, 2, 0, 0, true, 0, 0, 0, 0, 0, new String[] {});
+ }
+
+ /************************************* Q3 *********************************************************/
+
+ public boolean Q3()
+ {
+ createMessageOutput();
+ return NCCTestQ3Run(getRegressionPath());
+ }
+
+ public static boolean NCCTestQ3Run(String regressionDirPath)
+ {
+ RootCells rootCells = getRootCells(regressionDirPath, "data/qThree/rowColScan.jelib", "driveRow");
+ NccResults results = compare(rootCells.sch, null, rootCells.lay, null, hierOptions());
+ return checkResults(results, 1, 0, 0, true, 0, 0, 0, 0, 0, new String[] {});
+ }
+
+ /************************************* Q4 *********************************************************/
+
+ public boolean Q4()
+ {
+ createMessageOutput();
+ return NCCTestQ4Run(getRegressionPath());
+ }
+
+ public static boolean NCCTestQ4Run(String regressionDirPath)
+ {
+ RootCells rootCells = getRootCells(regressionDirPath, "data/qThree/scanFans.jelib", "scanAmp8w432");
+ NccResults results = compare(rootCells.sch, null, rootCells.lay, null, hierOptions());
+ return checkResults(results, 2, 0, 0, true, 0, 0, 0, 0, 0, new String[] {});
+ }
+
+ /************************************* Q5 *********************************************************/
+
+ public boolean Q5()
+ {
+ createMessageOutput();
+ return NCCTestQ5Run(getRegressionPath());
+ }
+
+ public static boolean NCCTestQ5Run(String regressionDirPath)
+ {
+ RootCells rootCells = getRootCells(regressionDirPath, "data/qThree/jtag.jelib", "jtagIRControl");
+ NccResults results = compare(rootCells.sch, null, rootCells.lay, null, hierOptions());
+ return checkResults(results, 5, 0, 0, true, 0, 0, 0, 0, 0, new String[] {});
+ }
+
+ /************************************* M0 *********************************************************/
+
+ public boolean M0()
+ {
+ createMessageOutput();
+ return NCCTestM0Run(getRegressionPath());
+ }
+
+ public static boolean NCCTestM0Run(String regressionDirPath)
+ {
+ RootCells rootCells = getRootCells(regressionDirPath, "data/muddChip/MIPS.jelib", "chip");
+ NccResults results = compare(rootCells.sch, null, rootCells.lay, null, hierOptions());
+ return checkResults(results, 135, 0, 600, false, 89, 6, 3, 0, 0, new String[] {
+ "DatapathDone:mdunit{sch} with: DatapathDone:mdunit{lay}",
+ "DatapathDone:nand3_1x{sch} with: DatapathDone:nand3_1x{lay}",
+ "DatapathDone:or3_1x{sch} with: DatapathDone:or3_1x{lay}",
+ "memsys_final:memsys{sch} with: memsys_final:memsys{lay}",
+ "MIPS:mips{sch} with: MIPS:mips{lay}",
+ "muddlib07:a22o2_1x{sch} with: muddlib07:a22o2_1x{lay}",
+ "muddlib07:nand3_1_5x{sch} with: muddlib07:nand3_1_5x{lay}",
+ "muddlib07:or3_1x{sch} with: muddlib07:or3_1x{lay}"
+ });
+ }
+
+ /************************************* M1 *********************************************************/
+
+ public boolean M1()
+ {
+ createMessageOutput();
+ return NCCTestM1Run(getRegressionPath());
+ }
+
+ public static boolean NCCTestM1Run(String regressionDirPath)
+ {
+ RootCells rootCells = getRootCells(regressionDirPath, "data/muddChip/DatapathDone.jelib", "Shifter_dp");
+ NccResults results = compare(rootCells.sch, null, rootCells.lay, null, hierOptions());
+ return checkResults(results, 7, 0, 0, false, 12, 0, 5, 0, 0, new String[] {});
+ }
+
+ /************************************* M2 *********************************************************/
+
+ public boolean M2()
+ {
+ createMessageOutput();
+ return NCCTestM2Run(getRegressionPath());
+ }
+
+ public static boolean NCCTestM2Run(String regressionDirPath)
+ {
+ RootCells rootCells = getRootCells(regressionDirPath, "data/muddChip/DatapathDone.jelib", "controlPLA");
+ NccResults results = compare(rootCells.sch, null, rootCells.lay, null, hierOptions());
+ return checkResults(results, 1, 0, 0, true, 0, 0, 0, 0, 0, new String[] {});
+ }
+
+ /************************************* M3 *********************************************************/
+
+ public boolean M3()
+ {
+ createMessageOutput();
+ return NCCTestM3Run(getRegressionPath());
+ }
+
+ public static boolean NCCTestM3Run(String regressionDirPath)
+ {
+ RootCells rootCells = getRootCells(regressionDirPath, "data/muddChip/DatapathDone.jelib", "regramarray_dp");
+ NccResults results = compare(rootCells.sch, null, rootCells.lay, null, hierOptions());
+ return checkResults(results, 3, 0, 0, false, 2, 0, 0, 0, 0, new String[] {});
+ }
+
+ /************************************* M4 *********************************************************/
+
+ public boolean M4()
+ {
+ createMessageOutput();
+ return NCCTestM4Run(getRegressionPath());
+ }
+
+ public static boolean NCCTestM4Run(String regressionDirPath)
+ {
+ RootCells rootCells = getRootCells(regressionDirPath, "data/muddChip/memsys_final.jelib", "cacheramarray");
+ NccResults results = compare(rootCells.sch, null, rootCells.lay, null, hierOptions());
+ return checkResults(results, 3, 0, 0, true, 0, 0, 0, 0, 0, new String[] {});
+ }
+
+ /************************************* M5 *********************************************************/
+
+ public boolean M5()
+ {
+ createMessageOutput();
+ return NCCTestM5Run(getRegressionPath());
+ }
+
+ public static boolean NCCTestM5Run(String regressionDirPath)
+ {
+ RootCells rootCells = getRootCells(regressionDirPath, "data/muddChip/memsys_final.jelib", "datapath");
+ NccResults results = compare(rootCells.sch, null, rootCells.lay, null, hierOptions());
+ return checkResults(results, 8, 0, 0, true, 0, 0, 0, 0, 0, new String[] {});
+ }
+
+ /************************************* M6 *********************************************************/
+
+ public boolean M6()
+ {
+ createMessageOutput();
+ return NCCTestM6Run(getRegressionPath());
+ }
+
+ public static boolean NCCTestM6Run(String regressionDirPath)
+ {
+ RootCells rootCells = getRootCells(regressionDirPath, "data/muddChip/new_controller.jelib", "alushpla");
+ NccResults results = compare(rootCells.sch, null, rootCells.lay, null, hierOptions());
+ return checkResults(results, 1, 0, 0, true, 0, 0, 0, 0, 0, new String[] {});
+ }
+
+ /************************************* M7 *********************************************************/
+
+ public boolean M7()
+ {
+ createMessageOutput();
+ return NCCTestM7Run(getRegressionPath());
+ }
+
+ public static boolean NCCTestM7Run(String regressionDirPath)
+ {
+ RootCells rootCells = getRootCells(regressionDirPath, "data/muddChip/new_controller.jelib", "maindec");
+ NccResults results = compare(rootCells.sch, null, rootCells.lay, null, hierOptions());
+ return checkResults(results, 3, 0, 0, true, 0, 0, 0, 0, 0, new String[] {});
+ }
+
+ /************************************* M8 *********************************************************/
+
+ public boolean M8()
+ {
+ createMessageOutput();
+ return NCCTestM8Run(getRegressionPath());
+ }
+
+ public static boolean NCCTestM8Run(String regressionDirPath)
+ {
+ RootCells rootCells = getRootCells(regressionDirPath, "data/muddChip/new_controller.jelib", "registers");
+ NccResults results = compare(rootCells.sch, null, rootCells.lay, null, hierOptions());
+ return checkResults(results, 4, 0, 0, false, 6, 1, 0, 0, 0, new String[] {});
+ }
+
+ /************************************* SUPPORT *********************************************/
+
+ private static NccOptions hierOptions()
+ {
+ NccOptions options = new NccOptions();
+ options.operation = NccOptions.HIER_EACH_CELL;
+ options.haltAfterFirstMismatch = false;
+ options.oneNamePerPort = false;
+ return options;
+ }
+
+ private static NccResults compare(Cell c1, VarContext v1, Cell c2, VarContext v2, NccOptions opt)
+ {
+ try
+ {
+ return Ncc.compare(c1, v1, c2, v2, opt);
+ } catch (Throwable t)
+ {
+ System.out.println("NCC throws Throwable: "+t);
+ t.printStackTrace();
+ return null;
+ }
+ }
+
+ private static class RootCells
+ {
+ public final Cell sch, lay;
+ RootCells(Cell s, Cell l) {sch=s; lay=l;}
+ }
+
+ private static String getRegressionDirPath(String regressionDirPath)
+ {
+ if (regressionDirPath != null) return regressionDirPath;
+ return "../..";
+ }
+
+ private static String getFailedCellPair(NccResult result)
+ {
+ String[] cellNms = result.getRootCellNames();
+ return cellNms[0] + " with: " + cellNms[1];
+ }
+
+ // Subtle: The new Java-based regression is "elegant" in that it removes the regression from the middle of NCC.
+ // It generates NccResults and then checks the results.
+ // A disadvantage of this approach is that keeping the entire NccResults for
+ // a FLAT_EACH_CELL can take a large amount of storage. So far, the place where
+ // this causes insufficient heap space problems is during the test of the renaming.
+ // Therefore I skip the renaming tests for certain FLAT_EACH_CELL runs.
+ private static boolean checkResults(NccResults results, int expectedTopologyPassed, int expectSzErrs, int expectedRegErrs,
+ boolean testRenaming, int numArcRenames, int numNodeRenames, int numArcManRenames,
+ int numNodeManRenames, int numNameConflicts, String[] failedCellPairs)
+ {
+ Set<String> setFailedPairs = new HashSet<String>();
+ List<String> unexpectedFailed = new ArrayList<String>();
+ for (int i=0; i<failedCellPairs.length; i++) setFailedPairs.add(failedCellPairs[i]);
+ int numPassed = 0;
+ int numSzErrs = 0;
+ int eqErrs = 0;
+ boolean ok = true;
+ for (NccResult result : results)
+ {
+ // Keep a global count for size mismatches
+ if (result.exportMatch() && result.topologyMatch())
+ {
+ numPassed++;
+ } else
+ {
+ String failedCellPair = getFailedCellPair(result);
+ if (!setFailedPairs.contains(failedCellPair)) unexpectedFailed.add(failedCellPair);
+ }
+ numSzErrs += result.getNccGuiInfo().getSizeMismatches().size();
+ Cell cell1 = result.getRootCells()[0];
+ Cell cell2 = result.getRootCells()[1];
+ eqErrs += result.getEquivalence().regressionTest(cell1, cell2);
+ }
+ EditingPreferences ep = new EditingPreferences(true, TechPool.getThreadTechPool());
+ SchemNamesToLay.RenameResult rr = SchemNamesToLay.copyNames(results, ep);
+
+ // Print all the regression failure results at end of log file
+ System.out.println("========================== Regression Results =============================");
+ for (String failedCellPair : unexpectedFailed)
+ {
+ System.out.println("Unexpected comparison failure: " + failedCellPair);
+ ok = false;
+ }
+ if (expectedTopologyPassed != numPassed)
+ {
+ System.out.println("Wrong number of comparisons passed: " + numPassed + " Expected: " + expectedTopologyPassed);
+ ok = false;
+ }
+ if (expectSzErrs != numSzErrs)
+ {
+ System.out.println("Wrong number of size errors: " + numSzErrs + " Expected: " + expectSzErrs);
+ ok = false;
+ }
+ if (eqErrs != expectedRegErrs)
+ {
+ System.out.println("Wrong number of NCC failures: " + eqErrs + " Expected: " + expectedRegErrs);
+ ok = false;
+ }
+
+ if ((rr.numArcRenames != numArcRenames && testRenaming) || rr.numArcRenames > numArcRenames)
+ {
+ System.out.println("Wrong number of arc renames: " + rr.numArcRenames + " Expected: " + numArcRenames);
+ ok = false;
+ }
+ if ((rr.numNodeRenames != numNodeRenames && testRenaming) || rr.numNodeRenames > numNodeRenames)
+ {
+ System.out.println("Wrong number of node renames: " + rr.numNodeRenames + " Expected: " + numNodeRenames);
+ ok = false;
+ }
+ if ((rr.numArcManRenames != numArcManRenames && testRenaming) || rr.numArcManRenames > numArcManRenames)
+ {
+ System.out.println("Wrong number of arc manual renames: " + rr.numArcManRenames + " Expected: " + numArcManRenames);
+ ok = false;
+ }
+ if ((rr.numNodeManRenames != numNodeManRenames && testRenaming) || rr.numNodeManRenames > numNodeManRenames)
+ {
+ System.out.println("Wrong number of node manual renames: " + rr.numNodeManRenames + " Expected: " + numNodeManRenames);
+ ok = false;
+ }
+ if ((rr.numNameConflicts != numNameConflicts && testRenaming) || rr.numNameConflicts > numNameConflicts)
+ {
+ System.out.println("Wrong number of renaming conflicts: " + rr.numNameConflicts + " Expected: " + numNameConflicts);
+ ok = false;
+ }
+ return ok;
+ }
+
+ /**
+ * @param regressionDirPath path to our "regression" directory. If null then
+ * assume that current directory is "regression/tool/NCC"
+ * @param libPath library file path relative to regressionDir
+ * @param cellNm the name of the schematic and layout Cells in library to compare
+ * @return the root cells.
+ */
+ private static RootCells getRootCells(String regressionDirPath, String libPath, String cellNm)
+ {
+ regressionDirPath = getRegressionDirPath(regressionDirPath);
+ EditingPreferences ep = new EditingPreferences(true, TechPool.getThreadTechPool());
+ Library rootLib = LayoutLib.openLibForRead(regressionDirPath+"/"+libPath, ep, true);
+ Library.repairAllLibraries(ep);
+ Cell sch = rootLib.findNodeProto(cellNm+"{sch}");
+ Cell lay = rootLib.findNodeProto(cellNm+"{lay}");
+ return new RootCells(sch, lay);
+ }
+}
diff --git a/com/sun/electric/tool/user/tests/PlacementParameterSetter.java b/com/sun/electric/tool/user/tests/PlacementParameterSetter.java
new file mode 100644
index 0000000..69a7e3e
--- /dev/null
+++ b/com/sun/electric/tool/user/tests/PlacementParameterSetter.java
@@ -0,0 +1,125 @@
+/* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: PlacementParameterSetter.java
+ *
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.user.tests;
+
+import com.sun.electric.tool.placement.Placement;
+import com.sun.electric.tool.placement.PlacementFrame;
+import com.sun.electric.tool.placement.PlacementFrame.PlacementParameter;
+import com.sun.electric.tool.placement.forceDirected1.PlacementForceDirectedTeam5;
+import com.sun.electric.tool.placement.forceDirected2.PlacementForceDirectedStaged;
+import com.sun.electric.tool.placement.genetic1.g1.GeneticPlacement;
+import com.sun.electric.tool.placement.genetic2.PlacementGenetic;
+import com.sun.electric.tool.placement.simulatedAnnealing1.SimulatedAnnealing;
+import com.sun.electric.tool.placement.simulatedAnnealing2.PlacementSimulatedAnnealing;
+import com.sun.electric.util.CollectionFactory;
+
+import java.util.Map;
+
+public abstract class PlacementParameterSetter
+{
+ public static Map<String, PlacementParameterSetter> algorithmMapping = CollectionFactory.createHashMap();
+
+ static
+ {
+ algorithmMapping.put("Simulated-Annealing-1", new SimulatedAnnealing1Setter());
+ algorithmMapping.put("Simulated-Annealing-2", new SimulatedAnnealing2Setter());
+ algorithmMapping.put("Genetic-1", new Genetic1Setter());
+ algorithmMapping.put("Genetic-2", new Genetic2Setter());
+ algorithmMapping.put("Force-Directed-1", new ForceDirected1Setter());
+ algorithmMapping.put("Force-Directed-2", new ForceDirected2Setter());
+ }
+
+ public abstract void setParameter(Placement.PlacementPreferences prefs, int numOfThreads, int runtime, PlacementFrame placement, boolean regression);
+
+ public static class SimulatedAnnealing1Setter extends PlacementParameterSetter
+ {
+ @Override
+ public void setParameter(Placement.PlacementPreferences prefs, int numOfThreads, int runtime, PlacementFrame placement, boolean regression)
+ {
+ SimulatedAnnealing tool = (SimulatedAnnealing) placement;
+ makeTempValuesReal(prefs, tool.maxThreadsParam, numOfThreads, regression);
+ }
+
+ }
+
+ public static class SimulatedAnnealing2Setter extends PlacementParameterSetter
+ {
+ @Override
+ public void setParameter(Placement.PlacementPreferences prefs, int numOfThreads, int runtime, PlacementFrame placement, boolean regression)
+ {
+ PlacementSimulatedAnnealing tool = (PlacementSimulatedAnnealing) placement;
+ makeTempValuesReal(prefs, tool.numThreadsParam, numOfThreads, regression);
+ makeTempValuesReal(prefs, tool.maxRuntimeParam, runtime, regression);
+ }
+ }
+
+ public static class Genetic1Setter extends PlacementParameterSetter
+ {
+ @Override
+ public void setParameter(Placement.PlacementPreferences prefs, int numOfThreads, int runtime, PlacementFrame placement, boolean regression)
+ {
+ GeneticPlacement tool = (GeneticPlacement) placement;
+ makeTempValuesReal(prefs, tool.maxThreadsParam, numOfThreads, regression);
+ makeTempValuesReal(prefs, tool.maxRuntimeParam, runtime, regression);
+ }
+ }
+
+ public static class Genetic2Setter extends PlacementParameterSetter
+ {
+ @Override
+ public void setParameter(Placement.PlacementPreferences prefs, int numOfThreads, int runtime, PlacementFrame placement, boolean regression)
+ {
+ PlacementGenetic tool = (PlacementGenetic) placement;
+ makeTempValuesReal(prefs, tool.maxThreadsParam, numOfThreads, regression);
+ makeTempValuesReal(prefs, tool.maxRuntimeParam, runtime, regression);
+
+ }
+ }
+
+ public static class ForceDirected1Setter extends PlacementParameterSetter
+ {
+ @Override
+ public void setParameter(Placement.PlacementPreferences prefs, int numOfThreads, int runtime, PlacementFrame placement, boolean regression)
+ {
+ PlacementForceDirectedTeam5 tool = (PlacementForceDirectedTeam5) placement;
+ makeTempValuesReal(prefs, tool.maxThreadsParam, numOfThreads, regression);
+ makeTempValuesReal(prefs, tool.maxRuntimeParam, runtime, regression);
+ }
+ }
+
+ public static class ForceDirected2Setter extends PlacementParameterSetter
+ {
+ @Override
+ public void setParameter(Placement.PlacementPreferences prefs, int numOfThreads, int runtime, PlacementFrame placement, boolean regression)
+ {
+ PlacementForceDirectedStaged tool = (PlacementForceDirectedStaged) placement;
+ makeTempValuesReal(prefs, tool.maxThreadsParam, numOfThreads, regression);
+ makeTempValuesReal(prefs, tool.maxRuntimeParam, runtime, regression);
+ }
+ }
+
+ private static void makeTempValuesReal(Placement.PlacementPreferences prefs, PlacementParameter param, int value, boolean regression)
+ {
+ prefs.setParameter(param, Integer.valueOf(value));
+ }
+
+}
diff --git a/com/sun/electric/tool/user/tests/PlacementTest.java b/com/sun/electric/tool/user/tests/PlacementTest.java
new file mode 100644
index 0000000..a205ab0
--- /dev/null
+++ b/com/sun/electric/tool/user/tests/PlacementTest.java
@@ -0,0 +1,199 @@
+ /* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: PlacementTest.java
+ *
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.user.tests;
+
+import com.sun.electric.database.EditingPreferences;
+import com.sun.electric.database.hierarchy.Cell;
+import com.sun.electric.database.hierarchy.Library;
+import com.sun.electric.technology.TechPool;
+import com.sun.electric.technology.Technology;
+import com.sun.electric.tool.io.FileType;
+import com.sun.electric.tool.io.input.LibraryFiles;
+import com.sun.electric.tool.io.output.Output;
+import com.sun.electric.tool.placement.Placement;
+import com.sun.electric.tool.placement.PlacementAdapter;
+import com.sun.electric.tool.placement.PlacementFrame;
+import com.sun.electric.tool.user.MessagesStream;
+import com.sun.electric.tool.user.User;
+import com.sun.electric.util.TextUtils;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Class to test the Placement tool.
+ */
+public class PlacementTest extends AbstractTest
+{
+ public PlacementTest(String name)
+ {
+ super(name);
+ }
+
+ public static List<AbstractTest> getTests()
+ {
+ List<AbstractTest> list = new ArrayList<AbstractTest>();
+ list.add(new PlacementTest("MinCut"));
+ list.add(new PlacementTest("ForceDirected1"));
+ list.add(new PlacementTest("ForceDirected2"));
+ list.add(new PlacementTest("Genetic1"));
+ list.add(new PlacementTest("Genetic2"));
+ list.add(new PlacementTest("SimulatedAnnealing1"));
+ list.add(new PlacementTest("SimulatedAnnealing2"));
+ return list;
+ }
+
+ public static String getOutputDirectory()
+ {
+ String rootPath = User.getRegressionPath();
+ if (rootPath == null) return null;
+ return rootPath + "/tools/Placement/output/";
+ }
+
+ /************************************* MinCut *********************************************************/
+
+ public Boolean MinCut()
+ {
+ return runParallelPlacementTestAlgorithm("Min-Cut", getRegressionPath(),
+ "placementTests.jelib", "PlacementTest4", 0, 0, true);
+ }
+
+ /************************************* ForceDirected1 *********************************************************/
+
+ public Boolean ForceDirected1()
+ {
+ return runParallelPlacementTestAlgorithm("Force-Directed-1", getRegressionPath(),
+ "placementTests.jelib", "PlacementTest4", 2, 10, false);
+ }
+
+ /************************************* ForceDirected2 *********************************************************/
+
+ public Boolean ForceDirected2()
+ {
+ return runParallelPlacementTestAlgorithm("Force-Directed-2", getRegressionPath(),
+ "placementTests.jelib", "PlacementTest4", 2, 10, false);
+ }
+
+ /************************************* Genetic1 *********************************************************/
+
+ public Boolean Genetic1()
+ {
+ return runParallelPlacementTestAlgorithm("Genetic-1", getRegressionPath(),
+ "placementTests.jelib", "PlacementTest4", 2, 10, false);
+ }
+
+ /************************************* Genetic2 *********************************************************/
+
+ public Boolean Genetic2()
+ {
+ return runParallelPlacementTestAlgorithm("Genetic-2", getRegressionPath(),
+ "placementTests.jelib", "PlacementTest4", 2, 10, false);
+ }
+
+ /************************************* SimulatedAnnealing1 *********************************************************/
+
+ public Boolean SimulatedAnnealing1()
+ {
+ return runParallelPlacementTestAlgorithm("Simulated-Annealing-1", getRegressionPath(),
+ "placementTests.jelib", "PlacementTest4", 2, 10, false);
+ }
+
+ /************************************* SimulatedAnnealing2 *********************************************************/
+
+ public Boolean SimulatedAnnealing2()
+ {
+ return runParallelPlacementTestAlgorithm("Simulated-Annealing-2", getRegressionPath(),
+ "placementTests.jelib", "PlacementTest4", 2, 10, false);
+ }
+
+ /************************************* SUPPORT *********************************************************/
+
+ /**
+ * Public function to call different placement algorithms applied to the
+ * same cell. Function must be public because it is used in the regression.
+ */
+ public static Boolean runParallelPlacementTestAlgorithm(String testName, String rootPath, String libName,
+ String cell, int numOfThreads, int runtime, boolean test)
+ {
+ PlacementFrame[] algorithms = PlacementAdapter.getPlacementAlgorithms();
+ PlacementFrame algorithm = null;
+ for (int i = 0; i < algorithms.length; i++)
+ {
+ if (algorithms[i].getAlgorithmName().equals(testName))
+ {
+ algorithm = algorithms[i];
+ break;
+ }
+ }
+ if (algorithm == null) return Boolean.FALSE;
+ return doPlacement(rootPath, libName, cell, algorithm, numOfThreads, runtime, test);
+ }
+
+ private static Boolean doPlacement(String rootPath, String libName, String cellName,
+ PlacementFrame algorithm, int numOfThreads, int runtime, boolean test)
+ {
+ String trueRootPath = (rootPath != null) ? (rootPath + "/tools/Placement/") : "";
+ String outputDir = trueRootPath + "output/";
+ ensureOutputDirectory(outputDir);
+ String testName = algorithm.getAlgorithmName() + "-" + runtime + "sec-" + numOfThreads + "thr";
+ MessagesStream.getMessagesStream().save(outputDir + testName + ".log");
+
+ // initialize
+ setFoundry(Technology.getMocmosTechnology());
+
+ EditingPreferences ep = new EditingPreferences(true, TechPool.getThreadTechPool());
+ Placement.PlacementPreferences prefs = new Placement.PlacementPreferences(true);
+ prefs.placementAlgorithm = algorithm.getAlgorithmName();
+ PlacementParameterSetter paramSetter = PlacementParameterSetter.algorithmMapping.get(algorithm.getAlgorithmName());
+ if (paramSetter != null)
+ {
+ paramSetter.setParameter(prefs, numOfThreads, runtime, algorithm, true);
+ }
+
+ // read library with test setup
+ Library rootLib = Library.findLibrary(libName);
+ if (rootLib == null)
+ {
+ // read the JELIB
+ URL fileURL = TextUtils.makeURLToFile(trueRootPath + "data/libs/" + libName);
+ rootLib = LibraryFiles.readLibrary(ep, fileURL, libName, FileType.JELIB, true);
+ if (rootLib == null)
+ {
+ System.out.println("Can't find library '" + libName + "'");
+ return Boolean.FALSE;
+ }
+ }
+
+ Cell cell = rootLib.findNodeProto(cellName + "{lay}");
+ PlacementFrame pf = Placement.getCurrentPlacementAlgorithm(prefs);
+ Cell newCell = Placement.placeCellNoJob(cell, ep, pf, prefs, false, null);
+ Output.saveJelib(outputDir + testName + ".jelib", newCell.getLibrary());
+
+ if (test)
+ {
+ return Boolean.valueOf(compareLibraryResults(trueRootPath, testName,
+ newCell.getLibrary(), new char[] { 'H', 'C', 'F', 'R', 'T', 'O', '#' }));
+ }
+ return Boolean.TRUE;
+ }
+}
diff --git a/com/sun/electric/tool/user/tests/PrefTest.java b/com/sun/electric/tool/user/tests/PrefTest.java
new file mode 100644
index 0000000..406c08d
--- /dev/null
+++ b/com/sun/electric/tool/user/tests/PrefTest.java
@@ -0,0 +1,266 @@
+ /* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: PrefTest.java
+ *
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.user.tests;
+
+import com.sun.electric.database.EditingPreferences;
+import com.sun.electric.database.text.Pref;
+import com.sun.electric.database.text.PrefPackage;
+import com.sun.electric.database.text.Setting;
+import com.sun.electric.technology.TechFactory;
+import com.sun.electric.technology.TechPool;
+import com.sun.electric.technology.Technology;
+import com.sun.electric.tool.Tool;
+import com.sun.electric.tool.drc.DRC;
+import com.sun.electric.tool.erc.ERCAntenna;
+import com.sun.electric.tool.erc.ERCWellCheck;
+import com.sun.electric.tool.extract.LayerCoverageTool;
+import com.sun.electric.tool.io.output.GenerateVHDL;
+import com.sun.electric.tool.placement.Placement;
+import com.sun.electric.tool.routing.RoutingFrame;
+import com.sun.electric.tool.sandbox.DummyPreferencesFactory;
+import com.sun.electric.tool.sc.SilComp;
+import com.sun.electric.tool.user.GraphicsPreferences;
+import com.sun.electric.tool.user.User;
+import com.sun.electric.tool.user.dialogs.ComponentMenu;
+import com.sun.electric.tool.user.ui.LayerVisibility;
+
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.prefs.BackingStoreException;
+import java.util.prefs.Preferences;
+
+/**
+ * Class to test the Preferences facility.
+ */
+public class PrefTest extends AbstractTest
+{
+ public PrefTest(String name)
+ {
+ super(name);
+ }
+
+ public static List<AbstractTest> getTests()
+ {
+ List<AbstractTest> list = new ArrayList<AbstractTest>();
+ list.add(new PrefTest("Preferences"));
+ list.add(new PrefTest("SettingsGroup"));
+ return list;
+ }
+
+ public static String getOutputDirectory()
+ {
+ String rootPath = User.getRegressionPath();
+ if (rootPath == null) return null;
+ return rootPath + "/tools/Database/output/";
+ }
+
+ /************************************* Preferences *********************************************************/
+
+ public Boolean Preferences()
+ {
+ Pref.forbidPreferences();
+ boolean result = basicPrefTest(getRegressionPath());
+ Pref.allowPreferences();
+ return Boolean.valueOf(result);
+ }
+
+ /**
+ * Method to run Preferences test. Must be public/static due to regressions.
+ * @param rootPath if rootPath is not null, then the data path includes tool path
+ * otherwise assume the regression is running locally
+ * @return true if test successfully run.
+ */
+ private static boolean basicPrefTest(String rootPath)
+ {
+ String trueRootPath = (rootPath != null) ? rootPath + "/tools/Database/" : "";
+ String outputDir = trueRootPath + "output/";
+ ensureOutputDirectory(outputDir);
+ boolean good = false;
+ try
+ {
+ Map<String,String> m = new TreeMap<String,String>();
+
+ // Preferences options
+ for (Pref.Group group: Pref.getAllGroups())
+ putPrefs(group, m);
+
+ // new style options
+ TechPool techPool = TechPool.getThreadTechPool();
+ putPrefs(new EditingPreferences(true, techPool), m, true);
+ putPrefs(new GraphicsPreferences(true, techPool), m, true);
+ putPrefs(new LayerVisibility(true), m, true);
+ putPrefs(new ComponentMenu.ComponentMenuPreferences(true), m, true);
+ putPrefs(new GenerateVHDL.VHDLPreferences(true), m, false);
+ putPrefs(new DRC.DRCPreferences(true), m, true);
+ putPrefs(new LayerCoverageTool.LayerCoveragePreferences(true), m, true);
+ putPrefs(new SilComp.SilCompPrefs(true), m, false);
+ putPrefs(new ERCWellCheck.WellCheckPreferences(true), m, false);
+ putPrefs(new ERCAntenna.AntennaPreferences(true, techPool), m, true);
+ putPrefs(new Placement.PlacementPreferences(true), m, false);
+ putPrefs(new RoutingFrame.RoutingPrefs(true), m, false);
+
+ String resultPrefs = outputDir + "AllPrefs.txt";
+ HashSet<String> excludeSet = new HashSet<String>();
+ excludeSet.addAll(Arrays.asList(
+ "tool/routing/AllNodesAsTargets",
+ "tool/routing/CutFile",
+ "tool/routing/MaxBadEdges",
+ "tool/routing/MaxLapCount",
+ "tool/routing/MaxPinCount",
+ "tool/user/WorkingDirectory"));
+ List<String> excludePrefix = new ArrayList<String>();
+ excludePrefix.addAll(Arrays.asList(
+ "plugins/menus",
+ "tool/io/FileTypeGroup"));
+ PrintWriter out = new PrintWriter(resultPrefs);
+ for (Map.Entry<String,String> e: m.entrySet())
+ {
+ String key = e.getKey();
+ if (excludeSet.contains(key)) continue;
+ if (key.startsWith("tool/user/ComponentMenuEntry")) continue;
+ boolean exclude = false;
+ for(String eKey : excludePrefix)
+ {
+ if (key.startsWith(eKey)) { exclude = true; break; }
+ }
+ if (exclude) continue;
+ out.println(e.toString());
+ }
+ out.close();
+ String expectedPrefs = trueRootPath + "data/expected/AllPrefs.txt";
+ good = compareResults(resultPrefs, expectedPrefs);
+ } catch (Exception e)
+ {
+ // Catching any time of exception!
+ e.printStackTrace();
+ }
+ return good;
+ }
+
+ private static void putPrefs(Pref.Group group, Map<String,String> m)
+ {
+ for (Pref pref: group.getPrefs())
+ {
+ String old = m.put(pref.getPrefPath(), pref.getFactoryValue().toString());
+ assert old == null;
+ }
+ }
+
+ private static void putPrefs(PrefPackage pp, Map<String,String> m, boolean skipNonstandardTechs)
+ throws BackingStoreException
+ {
+ Preferences root = new DummyPreferencesFactory().userRoot();
+ root.clear();
+ for (String child: root.childrenNames())
+ root.node(child).removeNode();
+ PrefPackage.lowLevelPutPrefs(pp, root, false);
+ putPrefs(root, m, skipNonstandardTechs);
+ }
+
+ private static void putPrefs(Preferences p, Map<String,String> m, boolean skipNonstandardTechs)
+ throws BackingStoreException
+ {
+ assert p.absolutePath().charAt(0) == '/';
+ String relativePath = p.absolutePath().substring(1) + "/";
+ for (String key: p.keys())
+ {
+ String entry = relativePath + key;
+ if (skipNonstandardTechs)
+ {
+ List<String> sensitiveTechNames = TechFactory.getSensitiveTechNames();
+ boolean sensitive = false;
+ for(String stn : sensitiveTechNames)
+ {
+ String poss1 = "In" + stn, poss2 = "IN" + stn;
+ String poss3 = "for" + stn, poss4 = "For" + stn;
+ if (entry.indexOf(poss1) >= 0 || entry.indexOf(poss2) >= 0 ||
+ entry.indexOf(poss3) >= 0 || entry.indexOf(poss4) >= 0)
+ {
+ sensitive = true;
+ break;
+ }
+ }
+ if (sensitive) continue;
+ }
+ String old = m.put(entry, p.get(key, null));
+ assert old == null;
+ }
+ for (String child: p.childrenNames())
+ putPrefs(p.node(child), m, skipNonstandardTechs);
+ }
+
+ /************************************* SettingsGroup *********************************************************/
+
+ public Boolean SettingsGroup()
+ {
+ for (Setting setting: getDatabase().getSettings().keySet())
+ {
+ String xmlPath = setting.getXmlPath();
+ int pos = xmlPath.indexOf('.');
+ String pathHead = xmlPath.substring(0, pos + 1);
+ String pathTail = xmlPath.substring(pos + 1);
+ int n = 0;
+ for (Iterator<Tool> it = Tool.getTools(); it.hasNext(); )
+ {
+ Tool tool = it.next();
+ if (!pathHead.equals(tool.getProjectSettings().getXmlPath())) continue;
+ Setting s = tool.getProjectSettings().getSetting(pathTail);
+ if (s != null)
+ {
+ if (s != setting)
+ {
+ System.out.println("ERROR: Setting duplicate: " + xmlPath);
+ return Boolean.FALSE;
+ }
+ n++;
+ }
+ }
+ for (Iterator<Technology> it = Technology.getTechnologies(); it.hasNext(); )
+ {
+ Technology tech = it.next();
+ if (!pathHead.equals(tech.getProjectSettings().getXmlPath())) continue;
+ Setting s = tech.getProjectSettings().getSetting(pathTail);
+ if (s != null)
+ {
+ if (s != setting)
+ {
+ System.out.println("ERROR: Setting duplicate: " + xmlPath);
+ return Boolean.FALSE;
+ }
+ n++;
+ }
+ }
+ if (n > 1)
+ {
+ System.out.println("ERROR: Setting count " + xmlPath + " is " + n);
+ return Boolean.FALSE;
+ }
+ }
+ return Boolean.TRUE;
+ }
+}
diff --git a/com/sun/electric/tool/user/tests/RoutingTest.java b/com/sun/electric/tool/user/tests/RoutingTest.java
new file mode 100644
index 0000000..b74c28b
--- /dev/null
+++ b/com/sun/electric/tool/user/tests/RoutingTest.java
@@ -0,0 +1,416 @@
+ /* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: RoutingTest.java
+ *
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.user.tests;
+
+import com.sun.electric.database.EditingPreferences;
+import com.sun.electric.database.hierarchy.Cell;
+import com.sun.electric.database.hierarchy.Library;
+import com.sun.electric.database.topology.ArcInst;
+import com.sun.electric.technology.TechPool;
+import com.sun.electric.technology.Technology;
+import com.sun.electric.tool.Job;
+import com.sun.electric.tool.io.FileType;
+import com.sun.electric.tool.io.input.LibraryFiles;
+import com.sun.electric.tool.io.output.Output;
+import com.sun.electric.tool.routing.AutoStitch;
+import com.sun.electric.tool.routing.AutoStitch.AutoOptions;
+import com.sun.electric.tool.routing.Maze;
+import com.sun.electric.tool.routing.MimicStitch;
+import com.sun.electric.tool.routing.MimicStitch.MimicOptions;
+import com.sun.electric.tool.routing.River;
+import com.sun.electric.tool.routing.Routing;
+import com.sun.electric.tool.routing.Routing.SoGContactsStrategy;
+import com.sun.electric.tool.routing.SeaOfGates;
+import com.sun.electric.tool.routing.metrics.WireQualityMetric;
+import com.sun.electric.tool.routing.seaOfGates.SeaOfGatesEngine;
+import com.sun.electric.tool.routing.seaOfGates.SeaOfGatesEngineFactory;
+import com.sun.electric.tool.routing.seaOfGates.SeaOfGatesEngineFactory.SeaOfGatesEngineType;
+import com.sun.electric.tool.routing.seaOfGates.SeaOfGatesHandlers;
+import com.sun.electric.tool.user.MessagesStream;
+import com.sun.electric.tool.user.User;
+import com.sun.electric.util.TextUtils;
+
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Class to test the routing tool.
+ */
+public class RoutingTest extends AbstractTest
+{
+ public RoutingTest(String name)
+ {
+ super(name);
+ }
+
+ public static List<AbstractTest> getTests()
+ {
+ List<AbstractTest> list = new ArrayList<AbstractTest>();
+ list.add(new RoutingTest("Auto"));
+ list.add(new RoutingTest("Maze1"));
+ list.add(new RoutingTest("Maze2"));
+ list.add(new RoutingTest("Mimic"));
+ list.add(new RoutingTest("River"));
+ list.add(new RoutingTest("CopyTopology1"));
+ list.add(new RoutingTest("CopyTopology2"));
+ list.add(new RoutingTest("CopyTopology3"));
+ list.add(new RoutingTest("SeaOfGates1"));
+ list.add(new RoutingTest("SeaOfGates2"));
+ list.add(new RoutingTest("SeaOfGates3"));
+ return list;
+ }
+
+ public static String getOutputDirectory()
+ {
+ String rootPath = User.getRegressionPath();
+ if (rootPath == null) return null;
+ return rootPath + "/tools/Routing/output/";
+ }
+
+ public static boolean runRoutingTest(String testName)
+ {
+ RoutingTest t = new RoutingTest(testName);
+ Class c = t.getClass();
+ boolean good = false;
+ try
+ {
+ Method method = c.getDeclaredMethod(testName, new Class[]{});
+ Object obj = method.invoke(t, new Object[]{});
+ if (obj instanceof Boolean)
+ good = ((Boolean)obj).booleanValue();
+ } catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ return good;
+ }
+
+ /**
+ * Run Auto-Stitching test 1.
+ * @return true if the test is successful.
+ */
+ public Boolean Auto()
+ {
+ String testParameter = createMessageOutput();
+ EditingPreferences ep = new EditingPreferences(true, TechPool.getThreadTechPool()).withFatWires(false);
+
+ // initialize
+ setFoundry(Technology.getMocmosTechnology());
+
+ // read library with test setup
+ URL fileURL = TextUtils.makeURLToFile(dataDir(getRegressionPath(), testParameter) + "routingTests.jelib");
+ String libName = "routingTests";
+ Library rootLib = Library.findLibrary(libName);
+ if (rootLib == null) rootLib = LibraryFiles.readLibrary(ep, fileURL, libName, FileType.JELIB, true);
+ String cellName = "AutoRoutingTest1";
+ Cell lay = rootLib.findNodeProto(cellName + "{lay}");
+ AutoOptions prefs = new AutoOptions(true);
+ prefs.createExports = false;
+
+ // do auto-routing
+ AutoStitch.runAutoStitch(lay, null, null, null, null, null, true, false, ep, prefs, false, null);
+ return Boolean.valueOf(compareCellResults(lay, getResultName()));
+ }
+
+ /**
+ * Run Maze-routing test 1.
+ * @return true if the test is successful.
+ */
+ public Boolean Maze1()
+ {
+ String testParameter = createMessageOutput();
+ EditingPreferences ep = new EditingPreferences(true, TechPool.getThreadTechPool());
+
+ // initialize
+ setFoundry(Technology.getMocmosTechnology());
+
+ // read library with test setup
+ URL fileURL = TextUtils.makeURLToFile(dataDir(getRegressionPath(), testParameter) + "routingTests.jelib");
+ String libName = "routingTests";
+ Library rootLib = Library.findLibrary(libName);
+ if (rootLib == null) rootLib = LibraryFiles.readLibrary(ep, fileURL, libName, FileType.JELIB, true);
+ String cellName = "MazeRoutingTest1";
+ Cell lay = rootLib.findNodeProto(cellName + "{sch}");
+
+ // do maze-routing
+ Maze router = new Maze(ep);
+ router.routeSelected(lay, new ArrayList<ArcInst>());
+ return Boolean.valueOf(compareCellResults(lay, getResultName()));
+ }
+
+ /**
+ * Run Maze-routing test 2.
+ * @return true if the test is successful.
+ */
+ public Boolean Maze2()
+ {
+ String testParameter = createMessageOutput();
+ EditingPreferences ep = new EditingPreferences(true, TechPool.getThreadTechPool());
+
+ // initialize
+ setFoundry(Technology.getMocmosTechnology());
+
+ // read library with test setup
+ URL fileURL = TextUtils.makeURLToFile(dataDir(getRegressionPath(), testParameter) + "routingTests.jelib");
+ String libName = "routingTests";
+ Library rootLib = Library.findLibrary(libName);
+ if (rootLib == null) rootLib = LibraryFiles.readLibrary(ep, fileURL, libName, FileType.JELIB, true);
+ String cellName = "MazeRoutingTest2";
+ Cell lay = rootLib.findNodeProto(cellName + "{lay}");
+
+ // do maze-routing
+ Maze router = new Maze(ep);
+ router.routeSelected(lay, new ArrayList<ArcInst>());
+ return Boolean.valueOf(compareCellResults(lay, getResultName()));
+ }
+
+ /**
+ * Run Mimic-Stitching test 1.
+ * @return true if the test is successful.
+ */
+ public Boolean Mimic()
+ {
+ String testParameter = createMessageOutput();
+
+ // initialize
+ setFoundry(Technology.getMocmosTechnology());
+ EditingPreferences ep = new EditingPreferences(true, TechPool.getThreadTechPool()).withFatWires(false);
+
+ // read library with test setup
+ URL fileURL = TextUtils.makeURLToFile(dataDir(getRegressionPath(), testParameter) + "routingTests.jelib");
+ String libName = "routingTests";
+ Library rootLib = Library.findLibrary(libName);
+ if (rootLib == null) rootLib = LibraryFiles.readLibrary(ep, fileURL, libName, FileType.JELIB, true);
+ String cellName = "MimicStitchTest1";
+ Cell cell = rootLib.findNodeProto(cellName + "{lay}");
+ ArcInst ai = cell.findArc("A");
+ boolean good = true;
+
+ // first test (strict mimicking, should connect 3 arcs)
+ MimicOptions prefs = new MimicOptions();
+ prefs.mimicInteractive = false;
+ prefs.matchPorts = true;
+ prefs.matchPortWidth = true;
+ prefs.matchArcCount = true;
+ prefs.matchNodeType = true;
+ prefs.matchNodeSize = true;
+ prefs.noOtherArcsThisDir = false;
+ prefs.notAlreadyConnected = true;
+ MimicStitch.mimicOneArc(ai, 0, ai, 1, ai.getLambdaBaseWidth(), ai.getProto(), 0, 0, true,
+ Job.Type.CHANGE, ep, prefs, null);
+ good = good && compareCellResults(cell, getFunctionName() + "aResult");
+
+ // second test (allow node type variation, should connect 1 more arc)
+ prefs.mimicInteractive = false;
+ prefs.matchPorts = true;
+ prefs.matchPortWidth = true;
+ prefs.matchArcCount = true;
+ prefs.matchNodeType = false;
+ prefs.matchNodeSize = true;
+ prefs.noOtherArcsThisDir = false;
+ prefs.notAlreadyConnected = true;
+ MimicStitch.mimicOneArc(ai, 0, ai, 1, ai.getLambdaBaseWidth(), ai.getProto(), 0, 0, true,
+ Job.Type.CHANGE, ep, prefs, null);
+ good = good && compareCellResults(cell, getFunctionName() + "bResult");
+
+ // third test (allow node size variation, should connect 1 more arc)
+ prefs.mimicInteractive = false;
+ prefs.matchPorts = true;
+ prefs.matchPortWidth = true;
+ prefs.matchArcCount = true;
+ prefs.matchNodeType = true;
+ prefs.matchNodeSize = false;
+ prefs.noOtherArcsThisDir = false;
+ prefs.notAlreadyConnected = true;
+ MimicStitch.mimicOneArc(ai, 0, ai, 1, ai.getLambdaBaseWidth(), ai.getProto(), 0, 0, true,
+ Job.Type.CHANGE, ep, prefs, null);
+ good = good && compareCellResults(cell, getFunctionName() + "cResult");
+
+ return Boolean.valueOf(good);
+ }
+
+ /**
+ * Run River-Routing test 1.
+ * @return true if the test is successful.
+ */
+ public Boolean River()
+ {
+ String testParameter = createMessageOutput();
+ EditingPreferences ep = new EditingPreferences(true, TechPool.getThreadTechPool());
+
+ // initialize
+ setFoundry(Technology.getMocmosTechnology());
+
+ // read library with test setup
+ URL fileURL = TextUtils.makeURLToFile(dataDir(getRegressionPath(), testParameter) + "routingTests.jelib");
+ String libName = "routingTests";
+ Library rootLib = Library.findLibrary(libName);
+ if (rootLib == null) rootLib = LibraryFiles.readLibrary(ep, fileURL, libName, FileType.JELIB, true);
+ String cellName = "RiverRoutingTest1";
+ Cell lay = rootLib.findNodeProto(cellName + "{lay}");
+
+ // do river-routing
+ River router = new River(ep);
+ List<ArcInst> allArcs = new ArrayList<ArcInst>();
+ for(Iterator<ArcInst> it = lay.getArcs(); it.hasNext(); ) allArcs.add(it.next());
+ router.river(lay, allArcs);
+ return Boolean.valueOf(compareCellResults(lay, getResultName()));
+ }
+
+ /**
+ * Run Copy-Routing-Topology test 1.
+ * @return true if the test is successful.
+ */
+ public Boolean CopyTopology1()
+ {
+ return CopyTopology("CopyTopologyTest1From{lay}", "CopyTopologyTest1To");
+ }
+
+ /**
+ * Run Copy-Routing-Topology test 2.
+ * @return true if the test is successful.
+ */
+ public Boolean CopyTopology2()
+ {
+ return CopyTopology("CopyTopologyTest2From{sch}", "CopyTopologyTest2To");
+ }
+
+ /**
+ * Run Copy-Routing-Topology test 3.
+ * @return true if the test is successful.
+ */
+ public Boolean CopyTopology3()
+ {
+ return CopyTopology("CopyTopologyTest3From{sch}", "CopyTopologyTest3To");
+ }
+
+ private Boolean CopyTopology(String fromCellName, String cellName)
+ {
+ String testParameter = createMessageOutput();
+ EditingPreferences ep = new EditingPreferences(true, TechPool.getThreadTechPool());
+
+ // initialize
+ setFoundry(Technology.getMocmosTechnology());
+
+ // read library with test setup
+ URL fileURL = TextUtils.makeURLToFile(dataDir(getRegressionPath(), testParameter) + "routingTests.jelib");
+ String libName = "routingTests";
+ Library rootLib = Library.findLibrary(libName);
+ if (rootLib == null) rootLib = LibraryFiles.readLibrary(ep, fileURL, libName, FileType.JELIB, true);
+ Cell fromCell = rootLib.findNodeProto(fromCellName);
+ Cell toCell = rootLib.findNodeProto(cellName + "{lay}");
+
+ // do topology copying
+ Routing.copyTopology(fromCell, toCell, ep);
+ return Boolean.valueOf(compareCellResults(toCell, getResultName()));
+ }
+
+ /**
+ * Run Sea-of-Gates Routing test 1.
+ * @return true if the test is successful.
+ */
+ public Boolean SeaOfGates1()
+ {
+ return SeaOfGates("SOGbug1334", "oneInput14");
+ }
+
+ /**
+ * Run Sea-of-Gates Routing test 2.
+ * @return true if the test is successful.
+ */
+ public Boolean SeaOfGates2()
+ {
+ return SeaOfGates("SOGParallelRoute", "infinityC");
+ }
+
+ /**
+ * Run Sea-of-Gates Routing test 3.
+ * @return true if the test is successful.
+ */
+ public Boolean SeaOfGates3()
+ {
+ return SeaOfGates("SOGPadFrame", "chip");
+ }
+
+ private Boolean SeaOfGates(String libName, String cellName)
+ {
+ String testParameter = createMessageOutput();
+ String pathLib = dataDir(getRegressionPath(), testParameter) + libName + ".jelib";
+ EditingPreferences ep = new EditingPreferences(true, TechPool.getThreadTechPool());
+ SeaOfGates.SeaOfGatesOptions prefs = prepareSeaOfGatesOptions(false, false, 1);
+ prefs.disableAdvancedSpineRouting = true;
+ Cell toCell = SeaOfGates(pathLib, libName, cellName, ep, prefs);
+ return compareCellResults(toCell, getResultName());
+ }
+
+ private static SeaOfGates.SeaOfGatesOptions prepareSeaOfGatesOptions(boolean useParallelFromToRoutes,
+ boolean useParallelRoutes, int userNumberOfThreads)
+ {
+ // initialize
+ setFoundry(Technology.getMocmosTechnology());
+ SeaOfGates.SeaOfGatesOptions prefs = new SeaOfGates.SeaOfGatesOptions();
+ prefs.useParallelFromToRoutes = useParallelFromToRoutes;
+ prefs.useParallelRoutes = useParallelRoutes;
+ if (useParallelRoutes && userNumberOfThreads > 1) prefs.forcedNumberOfThreads = userNumberOfThreads;
+ return prefs;
+ }
+
+ private static Cell SeaOfGates(String pathLib, String libName, String cellName, EditingPreferences ep, SeaOfGates.SeaOfGatesOptions prefs)
+ {
+ // read library with test setup
+ URL fileURL = TextUtils.makeURLToFile(pathLib);
+ Library rootLib = Library.findLibrary(libName);
+ if (rootLib == null) rootLib = LibraryFiles.readLibrary(ep, fileURL, libName, FileType.JELIB, true);
+ Cell toCell = rootLib.findNodeProto(cellName + "{lay}");
+ if (toCell == null) return null;
+
+ // do topology copying
+ SeaOfGatesEngine router = SeaOfGatesEngineFactory.createSeaOfGatesEngine(SeaOfGatesEngineType.defaultVersion);
+ router.setPrefs(prefs);
+ router.routeIt(SeaOfGatesHandlers.getDefault(toCell, null, SoGContactsStrategy.SOGCONTACTSATTOPLEVEL, Job.getRunningJob(), ep), toCell, false);
+ return toCell;
+ }
+
+ // Used in the JoinedPlacementRouting
+ public static Boolean runSeaOfGates(String rootPath, String libName, String cellName, boolean useParallelFromToRoutes,
+ int userNumberOfThreads)
+ {
+ String outputDir = "output/";
+ ensureOutputDirectory(outputDir);
+ String rootName = outputDir + libName + "-useFromTo=" + useParallelFromToRoutes + "-userNumberOfThreads=" + userNumberOfThreads;
+ MessagesStream.getMessagesStream().save(rootName + ".log");
+ String libPath = rootPath + libName;
+ EditingPreferences ep = new EditingPreferences(true, TechPool.getThreadTechPool());
+ SeaOfGates.SeaOfGatesOptions prefs = prepareSeaOfGatesOptions(useParallelFromToRoutes, true, userNumberOfThreads);
+ Cell toCell = SeaOfGates(libPath, libName, cellName, ep, prefs);
+ if (toCell == null) return Boolean.FALSE;
+ Output.saveJelib(rootName + ".jelib", toCell.getLibrary());
+
+ // Calculating metrics
+ new WireQualityMetric(rootName, prefs.theTimer).calculate(toCell);
+
+ return Boolean.TRUE;
+ }
+}
diff --git a/com/sun/electric/tool/user/tests/ScriptingTest.java b/com/sun/electric/tool/user/tests/ScriptingTest.java
new file mode 100644
index 0000000..3a33f00
--- /dev/null
+++ b/com/sun/electric/tool/user/tests/ScriptingTest.java
@@ -0,0 +1,111 @@
+ /* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: ScriptingTest.java
+ *
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.user.tests;
+
+import com.sun.electric.database.hierarchy.Cell;
+import com.sun.electric.database.hierarchy.Library;
+import com.sun.electric.tool.JobException;
+import com.sun.electric.tool.lang.EvalJavaBsh;
+import com.sun.electric.tool.lang.EvalJython;
+import com.sun.electric.tool.user.User;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Class to test the Scripting facilities.
+ */
+public class ScriptingTest extends AbstractTest
+{
+ public ScriptingTest(String name)
+ {
+ super(name);
+ }
+
+ public static List<AbstractTest> getTests()
+ {
+ List<AbstractTest> list = new ArrayList<AbstractTest>();
+ if (EvalJavaBsh.hasBeanShell())
+ list.add(new ScriptingTest("BeanShell"));
+ if (EvalJython.hasJython())
+ list.add(new ScriptingTest("Jython"));
+ return list;
+ }
+
+ public static String getOutputDirectory()
+ {
+ String rootPath = User.getRegressionPath();
+ if (rootPath == null) return null;
+ return rootPath + "/tools/Scripting/output/";
+ }
+
+ /************************************* BeanShell *********************************************************/
+
+ public Boolean BeanShell()
+ {
+ String testParameter = createMessageOutput();
+
+ // invoke the script
+ String fileName = dataDir(getRegressionPath(), testParameter) + "BSH_MakeInverter.bsh";
+ EvalJavaBsh evaluator = new EvalJavaBsh();
+ try
+ {
+ evaluator.doSource(fileName);
+ } catch (JobException e)
+ {
+ return Boolean.FALSE;
+ }
+
+ // do auto-routing
+ Cell lay = Library.findLibrary("BeanShellTest").findNodeProto("InverterJ{lay}");
+ if (lay == null)
+ {
+ System.out.println("InverterJ cell in BeanShellTest not found");
+ return Boolean.FALSE;
+ }
+ lay.lowLevelSetCreationDate(new Date(0));
+ return Boolean.valueOf(compareCellResults(lay, getResultName()));
+ }
+
+ /************************************* Jython *********************************************************/
+
+ public Boolean Jython()
+ {
+ String testParameter = createMessageOutput();
+
+ // invoke the script
+ String fileName = dataDir(getRegressionPath(), testParameter) + "JY_MakeInverter.jy";
+ EvalJython.runScriptNoJob(fileName);
+
+ // do auto-routing
+ Cell lay = Library.findLibrary("JythonTest").findNodeProto("InverterP{lay}");
+ if (lay == null)
+ {
+ System.out.println("InverterJ cell in JythonTest not found");
+ return Boolean.FALSE;
+ }
+ lay.lowLevelSetCreationDate(new Date(0));
+ return Boolean.valueOf(compareCellResults(lay, getResultName()));
+ }
+
+}
diff --git a/com/sun/electric/tool/user/tests/TechnologyEditTest.java b/com/sun/electric/tool/user/tests/TechnologyEditTest.java
new file mode 100644
index 0000000..67f31af
--- /dev/null
+++ b/com/sun/electric/tool/user/tests/TechnologyEditTest.java
@@ -0,0 +1,738 @@
+ /* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: TechnologyEditTest.java
+ *
+ * Copyright (c) 2007, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.user.tests;
+
+import com.sun.electric.database.EditingPreferences;
+import com.sun.electric.database.geometry.EGraphics;
+import com.sun.electric.database.hierarchy.Cell;
+import com.sun.electric.database.hierarchy.EDatabase;
+import com.sun.electric.database.hierarchy.Library;
+import com.sun.electric.database.text.Setting;
+import com.sun.electric.technology.ArcProto;
+import com.sun.electric.technology.EdgeH;
+import com.sun.electric.technology.EdgeV;
+import com.sun.electric.technology.Layer;
+import com.sun.electric.technology.PrimitiveNode;
+import com.sun.electric.technology.PrimitivePort;
+import com.sun.electric.technology.SizeOffset;
+import com.sun.electric.technology.Technology;
+import com.sun.electric.technology.Technology.NodeLayer;
+import com.sun.electric.technology.technologies.Generic;
+import com.sun.electric.technology.technologies.MoCMOS;
+import com.sun.electric.tool.user.GraphicsPreferences;
+import com.sun.electric.tool.user.MessagesStream;
+import com.sun.electric.tool.user.User;
+import com.sun.electric.tool.user.UserInterfaceMain;
+import com.sun.electric.tool.user.tecEdit.LibToTech;
+import com.sun.electric.tool.user.tecEdit.TechConversionResult;
+import com.sun.electric.tool.user.tecEdit.TechToLib;
+import com.sun.electric.util.math.MutableBoolean;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * Class to test the Technology Edit functions.
+ */
+public class TechnologyEditTest extends AbstractTest
+{
+ EditingPreferences ep = UserInterfaceMain.getEditingPreferences();
+ GraphicsPreferences gp = UserInterfaceMain.getGraphicsPreferences();
+
+ public TechnologyEditTest(String testName)
+ {
+ super(testName);
+ }
+
+ public static List<AbstractTest> getTests()
+ {
+ List<AbstractTest> list = new ArrayList<AbstractTest>();
+ list.add(new TechnologyEditTest("BICMOS"));
+ list.add(new TechnologyEditTest("CMOS"));
+ list.add(new TechnologyEditTest("MOCMOS"));
+ list.add(new TechnologyEditTest("MOCMOSOLD"));
+ list.add(new TechnologyEditTest("MOCMOSSUB"));
+ list.add(new TechnologyEditTest("NMOS"));
+ return list;
+ }
+
+ public static String getOutputDirectory()
+ {
+ String rootPath = User.getRegressionPath();
+ if (rootPath == null) return null;
+ return rootPath + "/tools/Database/output/";
+ }
+
+ public Boolean BICMOS() { return runTest("bicmos"); }
+ public Boolean CMOS() { return runTest("cmos"); }
+ public Boolean MOCMOS() { return runTest("mocmos"); }
+ public Boolean MOCMOSOLD() { return runTest("mocmosold"); }
+ public Boolean MOCMOSSUB() { return runTest("mocmossub"); }
+ public Boolean NMOS() { return runTest("nmos"); }
+
+ private Boolean runTest(String techName)
+ {
+ String trueRootPath = getValidRootPath(getRegressionPath(), "/tools/Database/", "");
+ String outputDir = trueRootPath + "output/";
+ ensureOutputDirectory(outputDir);
+ MessagesStream.getMessagesStream().save(outputDir + techName + ".log");
+
+ List<String> ignoreNodes = new ArrayList<String>();
+ Set<String> ignoreNodeSize = new HashSet<String>();
+ Set<String> ignoreTransistorFactors = new HashSet<String>();
+ if (techName.equals("mocmos"))
+ {
+ // mocmos must be set to submicron rules for this to work
+ Map<Setting,Object> originalContext = EDatabase.currentDatabase().getSettings();
+ Integer initialTechRules = (Integer)originalContext.get(Technology.getMocmosTechnology().getSetting("MOCMOS Rule Set"));
+ if (initialTechRules.intValue() != MoCMOS.SUBMRULES)
+ {
+ System.out.println("ERROR: Cannot test mocmos technology editing unless rules are set to Submicron");
+ return Boolean.FALSE;
+ }
+
+ // remove scalable transistors
+ ignoreNodes.add("P-Transistor-Scalable");
+ ignoreNodes.add("N-Transistor-Scalable");
+
+ // ignore inset sizes for contacts
+ ignoreNodeSize.add("Metal-1-Metal-2-Con");
+ ignoreNodeSize.add("Metal-2-Metal-3-Con");
+ ignoreNodeSize.add("Metal-3-Metal-4-Con");
+ ignoreNodeSize.add("Metal-4-Metal-5-Con");
+ ignoreNodeSize.add("Metal-5-Metal-6-Con");
+ ignoreNodeSize.add("Metal-1-P-Well-Con");
+ ignoreNodeSize.add("Metal-1-N-Well-Con");
+
+ // ignore serpentine factors for transistors
+ ignoreTransistorFactors.add("P-Transistor");
+ ignoreTransistorFactors.add("Thick-P-Transistor");
+ ignoreTransistorFactors.add("N-Transistor");
+ ignoreTransistorFactors.add("Thick-N-Transistor");
+
+ } else if (techName.equals("bicmos"))
+ {
+ // for bicmos, remove complex transistors
+ ignoreNodes.add("NPN1_transistor");
+ ignoreNodes.add("NPN2_transistor");
+ }
+ boolean good = true;
+ try
+ {
+ // convert the technology to a library
+ Technology tech = Technology.findTechnology(techName);
+ Library techLib = TechToLib.makeLibFromTech(tech, ep, gp);
+ if (techLib == null)
+ {
+ System.out.println("ERROR: Failed to create library for " + tech.getTechName() + " technology");
+ return Boolean.FALSE;
+ }
+
+ for(String ignoreName : ignoreNodes)
+ {
+ Cell ignore = techLib.findNodeProto("node-" + ignoreName + "{lay}");
+ if (ignore != null) ignore.kill();
+ }
+
+ // convert the library back to a technology
+ LibToTech ltt = new LibToTech();
+ TechConversionResult tcr = new TechConversionResult();
+ Technology libTech = ltt.makeTech(techLib, techName + "NEW", null, tcr, ep);
+ if (libTech == null || tcr.failed())
+ {
+ System.out.println("ERROR: " + tcr.getErrorMessage());
+ System.out.println("Failed to create technology from library");
+ return Boolean.FALSE;
+ }
+ good = compareTechnologies(tech, libTech, ignoreNodes, ignoreNodeSize, ignoreTransistorFactors, ep);
+ } catch (Exception e)
+ {
+ // Catching any type of exception
+ e.printStackTrace();
+ good = false;
+ }
+ return Boolean.valueOf(good);
+ }
+
+ private boolean compareTechnologies(Technology tech1, Technology tech2, List<String> ignoreNodes, Set<String> ignoreNodeSize,
+ Set<String> ignoreTransistorFactors, EditingPreferences ep)
+ {
+ String tech1Name = "technology " + tech1.getTechName();
+ String tech2Name = "technology " + tech2.getTechName();
+ MutableBoolean mGood = new MutableBoolean(true);
+
+ // compare general technology factors
+ doTest(tech1.getScaleSetting().getFactoryValue(), tech2.getScaleSetting().getFactoryValue(), mGood,
+ null, "scale", tech1Name, tech2Name);
+ doTest(tech1.getNumMetalsSetting().getFactoryValue(), tech2.getNumMetalsSetting().getFactoryValue(), mGood,
+ null, "num-metals", tech1Name, tech2Name);
+ doTest(tech1.getTechDesc(), tech2.getTechDesc(), mGood,
+ null, "description", tech1Name, tech2Name);
+ doTest(tech1.getMinResistanceSetting().getFactoryValue(), tech2.getMinResistanceSetting().getFactoryValue(), mGood,
+ null, "min-resistance", tech1Name, tech2Name);
+ doTest(tech1.getMinCapacitanceSetting().getFactoryValue(), tech2.getMinCapacitanceSetting().getFactoryValue(), mGood,
+ null, "min-capacitance", tech1Name, tech2Name);
+ doTest(tech1.getMaxSeriesResistanceSetting().getFactoryValue(), tech2.getMaxSeriesResistanceSetting().getFactoryValue(), mGood,
+ null, "min-series-resistance", tech1Name, tech2Name);
+ doTest(tech1.getGateLengthSubtractionSetting().getFactoryValue(), tech2.getGateLengthSubtractionSetting().getFactoryValue(), mGood,
+ null, "gate-shrinkage", tech1Name, tech2Name);
+ doTest(tech1.getGateIncludedSetting().getFactoryValue(), tech2.getGateIncludedSetting().getFactoryValue(), mGood,
+ null, "gate-inclusion", tech1Name, tech2Name);
+ doTest(Boolean.valueOf(tech1.isGroundNetIncluded()), Boolean.valueOf(tech2.isGroundNetIncluded()), mGood,
+ null, "parasitics-includes-ground", tech1Name, tech2Name);
+
+ // TODO: compare transparent colors
+
+ // compare layers
+ int maxLayers = Math.max(tech1.getNumLayers(), tech2.getNumLayers());
+ for(int i=0; i<maxLayers; i++)
+ {
+ if (i >= tech1.getNumLayers())
+ {
+ System.out.println("ERROR: Layer " + tech2.getLayer(i).getName() + " exists in technology " + tech2.getTechName() +
+ " but not in technology " + tech1.getTechName());
+ mGood.setValue(false);
+ continue;
+ }
+ if (i >= tech2.getNumLayers())
+ {
+ System.out.println("ERROR: Layer " + tech1.getLayer(i).getName() + " exists in technology " + tech1.getTechName() +
+ " but not in technology " + tech2.getTechName());
+ mGood.setValue(false);
+ continue;
+ }
+ Layer layer1 = tech1.getLayer(i);
+ Layer layer2 = tech2.getLayer(i);
+
+ // make sure the names match
+ doTest(layer1.getName(), layer2.getName(), mGood, "Layer " + i, "name", tech1Name, tech2Name);
+ String layerName = "Layer " + layer1.getName();
+
+ // make sure the functions match
+ doTest(layer1.getFunction(), layer2.getFunction(), mGood, layerName, "function", tech1Name, tech2Name);
+ doTest(Layer.Function.getExtraName(layer1.getFunctionExtras()),
+ Layer.Function.getExtraName(layer2.getFunctionExtras()), mGood,
+ layerName, "function-extra", tech1Name, tech2Name);
+
+ // make sure the foreign-file layer information matches
+ doTest(layer1.getCIFLayer(), layer2.getCIFLayer(), mGood, layerName, "CIF-layer", tech1Name, tech2Name);
+ doTest(layer1.getDXFLayer(), layer2.getDXFLayer(), mGood, layerName, "DXF-layer", tech1Name, tech2Name);
+
+ // make sure the parasitic information matches
+ doTest(new Double(layer1.getResistance()), new Double(layer2.getResistance()), mGood,
+ layerName, "resistance", tech1Name, tech2Name);
+ doTest(new Double(layer1.getCapacitance()), new Double(layer2.getCapacitance()), mGood,
+ layerName, "capacitance", tech1Name, tech2Name);
+ doTest(new Double(layer1.getEdgeCapacitance()), new Double(layer2.getEdgeCapacitance()), mGood,
+ layerName, "edge-capacitance", tech1Name, tech2Name);
+
+ // make sure the graphics matches
+ EGraphics gra1 = layer1.getFactoryGraphics();
+ EGraphics gra2 = layer2.getFactoryGraphics();
+ doTest(gra1.getColor(), gra2.getColor(), mGood,
+ layerName, "color", tech1Name, tech2Name);
+ doTest(Boolean.valueOf(gra1.getForeground()), Boolean.valueOf(gra2.getForeground()), mGood,
+ layerName, "foreground", tech1Name, tech2Name);
+ doTest(new Double(gra1.getOpacity()), new Double(gra2.getOpacity()), mGood,
+ layerName, "opacity", tech1Name, tech2Name);
+ doTest(gra1.getOutlined(), gra2.getOutlined(), mGood,
+ layerName, "outline", tech1Name, tech2Name);
+ doTest(new Integer(gra1.getTransparentLayer()), new Integer(gra2.getTransparentLayer()), mGood,
+ layerName, "transparency", tech1Name, tech2Name);
+ boolean patSame = true;
+ for(int j=0; j<16; j++) if (gra1.getPattern()[j] != gra2.getPattern()[j]) patSame = false;
+ if (!patSame)
+ {
+ System.out.println("ERROR: " + layerName + " has pattern " + gra1.getPattern() +
+ " in " + tech1Name + " but pattern " + gra2.getPattern() + " in " + tech2Name);
+ mGood.setValue(false);
+ }
+ doTest(Boolean.valueOf(gra1.isPatternedOnDisplay()), Boolean.valueOf(gra2.isPatternedOnDisplay()), mGood,
+ layerName, "display-pattern", tech1Name, tech2Name);
+ doTest(Boolean.valueOf(gra1.isPatternedOnPrinter()), Boolean.valueOf(gra2.isPatternedOnPrinter()), mGood,
+ layerName, "printer-pattern", tech1Name, tech2Name);
+
+ // make sure the pure-layer node matches
+ String pureName1 = "";
+ PrimitiveNode pure1 = layer1.getPureLayerNode();
+ if (pure1 != null) pureName1 = pure1.getName();
+ String pureName2 = "";
+ PrimitiveNode pure2 = layer2.getPureLayerNode();
+ if (pure2 != null) pureName2 = pure2.getName();
+ doTest(pureName1, pureName2, mGood, layerName, "pure-layer node", tech1Name, tech2Name);
+
+ // make sure the pure-layer node matches
+ doTest(Boolean.FALSE, Boolean.FALSE, mGood, layerName, "pseudo", tech1Name, tech2Name);
+ }
+
+ // compare arcs
+ List<ArcProto> arcs1 = new ArrayList<ArcProto>();
+ for(Iterator<ArcProto> it = tech1.getArcs(); it.hasNext(); )
+ {
+ ArcProto ap = it.next();
+ if (!ap.isNotUsed()) arcs1.add(ap);
+ }
+ List<ArcProto> arcs2 = new ArrayList<ArcProto>();
+ for(Iterator<ArcProto> it = tech2.getArcs(); it.hasNext(); )
+ {
+ ArcProto ap = it.next();
+ if (!ap.isNotUsed()) arcs2.add(ap);
+ }
+ int maxArcs = Math.max(arcs1.size(), arcs2.size());
+ for(int i=0; i<maxArcs; i++)
+ {
+ if (i >= arcs1.size())
+ {
+ System.out.println("ERROR: Arc " + arcs2.get(i).getName() + " exists in technology " + tech2.getTechName() +
+ " but not in technology " + tech1.getTechName());
+ mGood.setValue(false);
+ continue;
+ }
+ if (i >= arcs2.size())
+ {
+ System.out.println("ERROR: Arc " + arcs1.get(i).getName() + " exists in technology " + tech1.getTechName() +
+ " but not in technology " + tech2.getTechName());
+ mGood.setValue(false);
+ continue;
+ }
+
+ // make sure the names match
+ ArcProto ap1 = arcs1.get(i);
+ ArcProto ap2 = arcs2.get(i);
+ doTest(ap1.getName(), ap2.getName(), mGood, "Arc " + i, "name", tech1Name, tech2Name);
+ String arcName = "Arc " + ap1.getName();
+
+ // make sure the functions match
+ doTest(ap1.getFunction(), ap2.getFunction(), mGood, arcName, "function", tech1Name, tech2Name);
+
+ // make sure the other factors match
+ doTest(Boolean.valueOf(ap1.getFactoryDefaultInst().isFixedAngle()), Boolean.valueOf(ap2.getFactoryDefaultInst().isFixedAngle()), mGood,
+ arcName, "fixed-angle", tech1Name, tech2Name);
+ doTest(Boolean.valueOf(ap1.isWipable()), Boolean.valueOf(ap2.isWipable()), mGood,
+ arcName, "wipable", tech1Name, tech2Name);
+ doTest(Boolean.valueOf(ap1.getFactoryDefaultInst().isTailExtended()), Boolean.valueOf(ap2.getFactoryDefaultInst().isTailExtended()), mGood,
+ arcName, "extended", tech1Name, tech2Name);
+ doTest(new Integer(ap1.getFactoryAngleIncrement()), new Integer(ap2.getFactoryAngleIncrement()), mGood,
+ arcName, "angle-increment", tech1Name, tech2Name);
+ doTest(new Double(ap1.getFactoryAntennaRatio()), new Double(ap2.getFactoryAntennaRatio()), mGood,
+ arcName, "angle-increment", tech1Name, tech2Name);
+
+ // make sure the layers match
+ int al1 = ap1.getNumArcLayers();
+ int [] cross1to2 = new int[al1];
+ for(int j=0; j<al1; j++) cross1to2[j] = -1;
+ int al2 = ap2.getNumArcLayers();
+ int [] cross2to1 = new int[al2];
+ for(int j=0; j<al2; j++) cross2to1[j] = -1;
+ boolean matched = true;
+ if (al1 != al2) matched = false; else
+ {
+ for(int ai1=0; ai1<al2; ai1++)
+ {
+ String ai1Name = ap1.getLayer(ai1).getName();
+ for(int ai2=0; ai2<al2; ai2++)
+ {
+ if (cross2to1[ai2] >= 0) continue;
+ if (ai1Name.equals(ap2.getLayer(ai2).getName()))
+ {
+ cross1to2[ai1] = ai2;
+ cross2to1[ai2] = ai1;
+ }
+ }
+ }
+ for(int j=0; j<al2; j++) if (cross1to2[j] < 0 || cross2to1[j] < 0) matched = false;
+ }
+ if (!matched)
+ {
+ String errMsg = "ERROR: " + arcName + " has layers";
+ for(int j=0; j<al1; j++) errMsg += " " + ap1.getLayer(j).getName();
+ errMsg += " in technology " + tech2.getTechName() + " but layers";
+ for(int j=0; j<al2; j++) errMsg += " " + ap2.getLayer(j).getName();
+ errMsg += " in technology " + tech1.getTechName();
+ System.out.println(errMsg);
+ mGood.setValue(false);
+ } else for(int ai1=0; ai1<al1; ai1++)
+ {
+ int ai2 = cross1to2[ai1];
+ String arcLayerName = arcName + " layer " + ap1.getLayer(ai1).getName();
+ doTest(ap1.getLayerStyle(ai1), ap2.getLayerStyle(ai2), mGood,
+ arcLayerName, "layer-style", tech1Name, tech2Name);
+ doTest(new Double(ap1.getLayerExtend(ai1).getLambda()), new Double(ap2.getLayerExtend(ai2).getLambda()), mGood,
+ arcLayerName, "layer-extension", tech1Name, tech2Name);
+ }
+ }
+
+ // compare nodes
+ List<PrimitiveNode> nodes1 = new ArrayList<PrimitiveNode>();
+ for(Iterator<PrimitiveNode> it = tech1.getNodes(); it.hasNext(); )
+ {
+ PrimitiveNode np = it.next();
+ boolean ignoreIt = false;
+ for(String ignoreName : ignoreNodes)
+ if (np.getName().equalsIgnoreCase(ignoreName)) ignoreIt = true;
+ if (ignoreIt) continue;
+ if (!np.isNotUsed()) nodes1.add(np);
+ }
+ List<PrimitiveNode> nodes2 = new ArrayList<PrimitiveNode>();
+ for(Iterator<PrimitiveNode> it = tech2.getNodes(); it.hasNext(); )
+ {
+ PrimitiveNode np = it.next();
+ boolean ignoreIt = false;
+ for(String ignoreName : ignoreNodes)
+ if (np.getName().equalsIgnoreCase(ignoreName)) ignoreIt = true;
+ if (ignoreIt) continue;
+ if (!np.isNotUsed()) nodes2.add(np);
+ }
+ int maxNodes = Math.max(nodes1.size(), nodes2.size());
+ for(int i=0; i<maxNodes; i++)
+ {
+ if (i >= nodes1.size())
+ {
+ System.out.println("ERROR: Node " + nodes2.get(i).getName() + " exists in technology " + tech2.getTechName() +
+ " but not in technology " + tech1.getTechName());
+ mGood.setValue(false);
+ continue;
+ }
+ if (i >= nodes2.size())
+ {
+ System.out.println("ERROR: Node " + nodes1.get(i).getName() + " exists in technology " + tech1.getTechName() +
+ " but not in technology " + tech2.getTechName());
+ mGood.setValue(false);
+ continue;
+ }
+
+ // make sure the names match
+ PrimitiveNode np1 = nodes1.get(i);
+ PrimitiveNode np2 = nodes2.get(i);
+ doTest(np1.getName(), np2.getName(), mGood,
+ "Node " + i, "name", tech1Name, tech2Name);
+ String nodeName = "Node " + np1.getName();
+
+ // make sure the functions match
+ doTest(np1.getFunction(), np2.getFunction(), mGood,
+ nodeName, "function", tech1Name, tech2Name);
+
+ // make sure the other factors match
+ doTest(Boolean.valueOf(np1.isSquare()), Boolean.valueOf(np2.isSquare()), mGood,
+ nodeName, "square", tech1Name, tech2Name);
+ doTest(Boolean.valueOf(np1.isWipeOn1or2()), Boolean.valueOf(np2.isWipeOn1or2()), mGood,
+ nodeName, "wipes-1-or-2", tech1Name, tech2Name);
+ doTest(Boolean.valueOf(np1.isLockedPrim()), Boolean.valueOf(np2.isLockedPrim()), mGood,
+ nodeName, "lockable", tech1Name, tech2Name);
+ doTest(PrimitiveNode.getSpecialTypeName(np1.getSpecialType()), PrimitiveNode.getSpecialTypeName(np2.getSpecialType()), mGood,
+ nodeName, "special-type", tech1Name, tech2Name);
+ boolean isSerpentine = np1.getSpecialType() == PrimitiveNode.SERPTRANS && np2.getSpecialType() == PrimitiveNode.SERPTRANS;
+ if (isSerpentine) {
+ if (!ignoreTransistorFactors.contains(np1.getName()))
+ {
+ doTest(new Double(np1.getSpecialValues()[0]), new Double(np2.getSpecialValues()[0]), mGood,
+ nodeName, "serpentine layer count", tech1Name, tech2Name);
+ }
+ doTest(new Double(np1.getSpecialValues()[1]), new Double(np2.getSpecialValues()[1]), mGood,
+ nodeName, "serpentine active port inset from end of serpentine path", tech1Name, tech2Name);
+ doTest(new Double(np1.getSpecialValues()[2]), new Double(np2.getSpecialValues()[2]), mGood,
+ nodeName, "serpentine active port inset from poly edge", tech1Name, tech2Name);
+ doTest(new Double(np1.getSpecialValues()[3]), new Double(np2.getSpecialValues()[3]), mGood,
+ nodeName, "serpentine poly width", tech1Name, tech2Name);
+ doTest(new Double(np1.getSpecialValues()[4]), new Double(np2.getSpecialValues()[4]), mGood,
+ nodeName, "serpentine poly port inset from poly edge", tech1Name, tech2Name);
+ doTest(new Double(np1.getSpecialValues()[5]), new Double(np2.getSpecialValues()[5]), mGood,
+ nodeName, "serpentine poly port instet from active edge", tech1Name, tech2Name);
+ }
+ SizeOffset so1 = np1.getProtoSizeOffset();
+ SizeOffset so2 = np2.getProtoSizeOffset();
+ doTest(new Double(np1.getDefWidth(ep)-so1.getLowXOffset()-so1.getHighXOffset()), new Double(np2.getDefWidth(ep)-so2.getLowXOffset()-so2.getHighXOffset()), mGood,
+ nodeName, "default-width", tech1Name, tech2Name);
+ doTest(new Double(np1.getDefHeight(ep)-so1.getLowYOffset()-so1.getHighYOffset()), new Double(np2.getDefHeight(ep)-so2.getLowYOffset()-so2.getHighYOffset()), mGood,
+ nodeName, "default-height", tech1Name, tech2Name);
+ double sizeX1 = np1.getDefSize(ep).getLambdaX();
+ double sizeY1 = np1.getDefSize(ep).getLambdaY();
+ double sizeX2 = np2.getDefSize(ep).getLambdaX();
+ double sizeY2 = np2.getDefSize(ep).getLambdaY();
+ boolean adjustSize = sizeX1 != sizeX2 || sizeY1 != sizeY2;
+ if (!adjustSize)
+ {
+ if (!ignoreNodeSize.contains(np1.getName()) && !ignoreTransistorFactors.contains(np1.getName()))
+ {
+ doTest(new Double(so1.getLowXOffset()), new Double(so2.getLowXOffset()), mGood,
+ nodeName, "low-X-offset", tech1Name, tech2Name);
+ doTest(new Double(so1.getHighXOffset()), new Double(so2.getHighXOffset()), mGood,
+ nodeName, "high-X-offset", tech1Name, tech2Name);
+ doTest(new Double(so1.getLowYOffset()), new Double(so2.getLowYOffset()), mGood,
+ nodeName, "low-Y-offset", tech1Name, tech2Name);
+ doTest(new Double(so1.getHighYOffset()), new Double(so2.getHighYOffset()), mGood,
+ nodeName, "high-Y-offset", tech1Name, tech2Name);
+ }
+ }
+
+ // make sure the layers match
+ Technology.NodeLayer [] nlays1 = np1.getNodeLayers();
+ int nl1 = nlays1.length;
+ int [] cross1to2 = new int[nl1];
+ for(int j=0; j<nl1; j++) cross1to2[j] = -1;
+ Technology.NodeLayer [] nlays2 = np2.getNodeLayers();
+ int nl2 = nlays2.length;
+ int [] cross2to1 = new int[nl2];
+ for(int j=0; j<nl2; j++) cross2to1[j] = -1;
+ boolean matched = true;
+ if (nl1 != nl2) matched = false; else
+ {
+ for(int ni1=0; ni1<nl2; ni1++)
+ {
+ String ni1Name = nlays1[ni1].getLayer().getName();
+ for(int ni2=0; ni2<nl2; ni2++)
+ {
+ if (cross2to1[ni2] >= 0) continue;
+ if (ni1Name.equals(nlays2[ni2].getLayer().getName()))
+ {
+ cross1to2[ni1] = ni2;
+ cross2to1[ni2] = ni1;
+ }
+ }
+ }
+ for(int j=0; j<nl2; j++) if (cross1to2[j] < 0 || cross2to1[j] < 0) matched = false;
+ }
+ if (!matched)
+ {
+ String errMsg = "ERROR: " + nodeName + " has layers";
+ for(int j=0; j<nl1; j++) errMsg += " " + nlays1[j].getLayer().getName();
+ errMsg += " in technology " + tech2.getTechName() + " but layers";
+ for(int j=0; j<nl2; j++) errMsg += " " + nlays2[j].getLayer().getName();
+ errMsg += " in technology " + tech1.getTechName();
+ System.out.println(errMsg);
+ mGood.setValue(false);
+ } else for(int ni1=0; ni1<nl1; ni1++)
+ {
+ int ni2 = cross1to2[ni1];
+ String nodeLayerName = nodeName + " layer " + nlays1[ni1].getLayer().getName();
+ doTest(nlays1[ni1].getStyle(), nlays2[ni2].getStyle(), mGood,
+ nodeLayerName, "layer-style", tech1Name, tech2Name);
+ if (!ignoreTransistorFactors.contains(np1.getName()))
+ {
+ doTest(new Integer(nlays1[ni1].getPortNum()), new Integer(nlays2[ni2].getPortNum()), mGood,
+ nodeLayerName, "port-num", tech1Name, tech2Name);
+ }
+ int r1 = nlays1[ni1].getRepresentation();
+ int r2 = nlays2[ni2].getRepresentation();
+ doTest(Technology.NodeLayer.getRepresentationName(r1), Technology.NodeLayer.getRepresentationName(r2), mGood,
+ nodeLayerName, "layer-representation", tech1Name, tech2Name);
+ if (adjustSize)
+ {
+ EdgeV botEdge1 = nlays1[ni1].getBottomEdge();
+ EdgeV botEdge2 = nlays2[ni2].getBottomEdge();
+ doTest(new Double(botEdge1.getMultiplier() * sizeY1 + botEdge1.getAdder().getLambda()),
+ new Double(botEdge2.getMultiplier() * sizeY2 + botEdge2.getAdder().getLambda()), mGood,
+ nodeLayerName, "bottom-edge", tech1Name, tech2Name);
+ EdgeV topEdge1 = nlays1[ni1].getTopEdge();
+ EdgeV topEdge2 = nlays2[ni2].getTopEdge();
+ doTest(new Double(topEdge1.getMultiplier() * sizeY1 + topEdge1.getAdder().getLambda()),
+ new Double(topEdge2.getMultiplier() * sizeY2 + topEdge2.getAdder().getLambda()), mGood,
+ nodeLayerName, "top-edge", tech1Name, tech2Name);
+
+ EdgeH lftEdge1 = nlays1[ni1].getLeftEdge();
+ EdgeH lftEdge2 = nlays2[ni2].getLeftEdge();
+ doTest(new Double(lftEdge1.getMultiplier() * sizeX1 + lftEdge1.getAdder().getLambda()),
+ new Double(lftEdge2.getMultiplier() * sizeX2 + lftEdge2.getAdder().getLambda()), mGood,
+ nodeLayerName, "left-edge", tech1Name, tech2Name);
+ EdgeH rgtEdge1 = nlays1[ni1].getRightEdge();
+ EdgeH rgtEdge2 = nlays2[ni2].getRightEdge();
+ doTest(new Double(rgtEdge1.getMultiplier() * sizeX1 + rgtEdge1.getAdder().getLambda()),
+ new Double(rgtEdge2.getMultiplier() * sizeX2 + rgtEdge2.getAdder().getLambda()), mGood,
+ nodeLayerName, "right-edge", tech1Name, tech2Name);
+ } else
+ {
+ doTest(nlays1[ni1].getBottomEdge(), nlays2[ni2].getBottomEdge(), mGood,
+ nodeLayerName, "bottom-edge", tech1Name, tech2Name);
+ doTest(nlays1[ni1].getTopEdge(), nlays2[ni2].getTopEdge(), mGood,
+ nodeLayerName, "top-edge", tech1Name, tech2Name);
+ doTest(nlays1[ni1].getLeftEdge(), nlays2[ni2].getLeftEdge(), mGood,
+ nodeLayerName, "left-edge", tech1Name, tech2Name);
+ doTest(nlays1[ni1].getRightEdge(), nlays2[ni2].getRightEdge(), mGood,
+ nodeLayerName, "right-edge", tech1Name, tech2Name);
+ }
+
+ // special case for multi-cut layers
+ if (nlays1[ni1].getRepresentation() == NodeLayer.MULTICUTBOX)
+ {
+ doTest(nlays1[ni1].getMulticutSep1D(), nlays2[ni2].getMulticutSep1D(), mGood,
+ nodeLayerName, "multicut-X-separation", tech1Name, tech2Name);
+ doTest(nlays1[ni1].getMulticutSep2D(), nlays2[ni2].getMulticutSep2D(), mGood,
+ nodeLayerName, "multicut-Y-separation", tech1Name, tech2Name);
+ doTest(nlays1[ni1].getMulticutSizeX(), nlays2[ni2].getMulticutSizeX(), mGood,
+ nodeLayerName, "multicut-X-size", tech1Name, tech2Name);
+ doTest(nlays1[ni1].getMulticutSizeY(), nlays2[ni2].getMulticutSizeY(), mGood,
+ nodeLayerName, "multicut-Y-size", tech1Name, tech2Name);
+ }
+ if (isSerpentine) {
+ doTest(nlays1[ni1].getSerpentineExtentB(), nlays2[ni2].getSerpentineExtentB(), mGood,
+ nodeLayerName, "serpentine bottom extend", tech1Name, tech2Name);
+ doTest(nlays1[ni1].getSerpentineExtentT(), nlays2[ni2].getSerpentineExtentT(), mGood,
+ nodeLayerName, "serpentine top extend", tech1Name, tech2Name);
+ doTest(nlays1[ni1].getSerpentineLWidth(), nlays2[ni2].getSerpentineLWidth(), mGood,
+ nodeLayerName, "serpentine left width", tech1Name, tech2Name);
+ doTest(nlays1[ni1].getSerpentineRWidth(), nlays2[ni2].getSerpentineRWidth(), mGood,
+ nodeLayerName, "serpentine right width", tech1Name, tech2Name);
+ }
+ }
+
+ // make sure the ports match
+ int npTot1 = np1.getNumPorts();
+ cross1to2 = new int[npTot1];
+ for(int j=0; j<npTot1; j++) cross1to2[j] = -1;
+ int npTot2 = np2.getNumPorts();
+ cross2to1 = new int[npTot2];
+ for(int j=0; j<npTot2; j++) cross2to1[j] = -1;
+ matched = true;
+ if (npTot1 != npTot2) matched = false; else
+ {
+ for(int ni1=0; ni1<npTot2; ni1++)
+ {
+ String ni1Name = np1.getPort(ni1).getName();
+ for(int ni2=0; ni2<npTot2; ni2++)
+ {
+ if (cross2to1[ni2] >= 0) continue;
+ if (ni1Name.equals(np2.getPort(ni2).getName()))
+ {
+ cross1to2[ni1] = ni2;
+ cross2to1[ni2] = ni1;
+ }
+ }
+ }
+ for(int j=0; j<npTot2; j++) if (cross1to2[j] < 0 || cross2to1[j] < 0) matched = false;
+ }
+ if (!matched)
+ {
+ String errMsg = "ERROR: " + nodeName + " has ports";
+ for(int j=0; j<npTot1; j++) errMsg += " " + np1.getPort(j).getName();
+ errMsg += " in technology " + tech2.getTechName() + " but ports";
+ for(int j=0; j<npTot2; j++) errMsg += " " + np2.getPort(j).getName();
+ errMsg += " in technology " + tech1.getTechName();
+ System.out.println(errMsg);
+ mGood.setValue(false);
+ } else for(int ni1=0; ni1<npTot1; ni1++)
+ {
+ int ni2 = cross1to2[ni1];
+ PrimitivePort pp1 = np1.getPort(ni1);
+ PrimitivePort pp2 = np2.getPort(ni2);
+ String nodePortName = nodeName + " port " + pp1.getName();
+ if (adjustSize)
+ {
+ EdgeV botEdge1 = pp1.getBottom();
+ EdgeV botEdge2 = pp2.getBottom();
+ doTest(new Double(botEdge1.getMultiplier() * sizeY1 + botEdge1.getAdder().getLambda()),
+ new Double(botEdge2.getMultiplier() * sizeY2 + botEdge2.getAdder().getLambda()), mGood,
+ nodePortName, "bottom-edge", tech1Name, tech2Name);
+ EdgeV topEdge1 = pp1.getTop();
+ EdgeV topEdge2 = pp2.getTop();
+ doTest(new Double(topEdge1.getMultiplier() * sizeY1 + topEdge1.getAdder().getLambda()),
+ new Double(topEdge2.getMultiplier() * sizeY2 + topEdge2.getAdder().getLambda()), mGood,
+ nodePortName, "top-edge", tech1Name, tech2Name);
+
+ EdgeH lftEdge1 = pp1.getLeft();
+ EdgeH lftEdge2 = pp2.getLeft();
+ doTest(new Double(lftEdge1.getMultiplier() * sizeX1 + lftEdge1.getAdder().getLambda()),
+ new Double(lftEdge2.getMultiplier() * sizeX2 + lftEdge2.getAdder().getLambda()), mGood,
+ nodePortName, "left-edge", tech1Name, tech2Name);
+ EdgeH rgtEdge1 = pp1.getRight();
+ EdgeH rgtEdge2 = pp2.getRight();
+ doTest(new Double(rgtEdge1.getMultiplier() * sizeX1 + rgtEdge1.getAdder().getLambda()),
+ new Double(rgtEdge2.getMultiplier() * sizeX2 + rgtEdge2.getAdder().getLambda()), mGood,
+ nodePortName, "right-edge", tech1Name, tech2Name);
+ } else
+ {
+ doTest(pp1.getBottom(), pp2.getBottom(), mGood,
+ nodePortName, "bottom-edge", tech1Name, tech2Name);
+ doTest(pp1.getTop(), pp2.getTop(), mGood,
+ nodePortName, "top-edge", tech1Name, tech2Name);
+ doTest(pp1.getLeft(), pp2.getLeft(), mGood,
+ nodePortName, "left-edge", tech1Name, tech2Name);
+ doTest(pp1.getRight(), pp2.getRight(), mGood,
+ nodePortName, "right-edge", tech1Name, tech2Name);
+ }
+ if (!ignoreTransistorFactors.contains(np1.getName()))
+ {
+ doTest(new Integer(pp1.getTopology()), new Integer(pp2.getTopology()), mGood,
+ nodePortName, "topology", tech1Name, tech2Name);
+ }
+ doTest(new Integer(pp1.getAngle()), new Integer(pp2.getAngle()), mGood,
+ nodePortName, "angle", tech1Name, tech2Name);
+ doTest(new Integer(pp1.getAngleRange()), new Integer(pp2.getAngleRange()), mGood,
+ nodePortName, "angle", tech1Name, tech2Name);
+
+ // compare connectivity
+ ArcProto [] pp1Conn = pp1.getConnections();
+ ArcProto [] pp2Conn = pp2.getConnections();
+ boolean connSame = true;
+ for(int i1 = 0; i1 < pp1Conn.length; i1++)
+ {
+ if (pp1Conn[i1].getTechnology() == Generic.tech()) continue;
+ if (pp1Conn[i1].isNotUsed()) continue;
+ boolean found = false;
+ for(int i2=0; i2<pp2Conn.length; i2++)
+ if (pp1Conn[i1].getName().equals(pp2Conn[i2].getName())) found = true;
+ if (!found) connSame = false;
+ }
+ for(int i2 = 0; i2 < pp2Conn.length; i2++)
+ {
+ if (pp2Conn[i2].isNotUsed()) continue;
+ if (pp2Conn[i2].getTechnology() == Generic.tech()) continue;
+ boolean found = false;
+ for(int i1=0; i1<pp2Conn.length; i1++)
+ if (pp2Conn[i2].getName().equals(pp1Conn[i1].getName())) found = true;
+ if (!found) connSame = false;
+ }
+ if (!connSame)
+ {
+ String errMsg = "ERROR: " + nodePortName + " connects to";
+ for(int j=0; j<pp1Conn.length; j++) if (pp1Conn[j].getTechnology() != Generic.tech())
+ errMsg += " " + pp1Conn[j].getName();
+ errMsg += " in technology " + tech2.getTechName() + " but connects to";
+ for(int j=0; j<pp2Conn.length; j++) if (pp2Conn[j].getTechnology() != Generic.tech())
+ errMsg += " " + pp2Conn[j].getName();
+ errMsg += " in technology " + tech1.getTechName();
+ System.out.println(errMsg);
+ mGood.setValue(false);
+ }
+ }
+ }
+ return mGood.booleanValue();
+ }
+
+ private void doTest(Object obj1, Object obj2, MutableBoolean good, String objectName, String attrName,
+ String obj1Name, String obj2Name)
+ {
+ if (!obj1.equals(obj2))
+ {
+ String errMsg = "ERROR: ";
+ if (objectName == null) errMsg += "found"; else
+ errMsg += objectName + " has ";
+ errMsg += attrName + " '" + obj1 + "' in " + obj1Name +
+ " but " + attrName + " '" + obj2 + "' in " + obj2Name;
+ System.out.println(errMsg);
+ good.setValue(false);
+ }
+ }
+}
diff --git a/com/sun/electric/tool/user/tests/TechnologyTest.java b/com/sun/electric/tool/user/tests/TechnologyTest.java
new file mode 100644
index 0000000..ca71c65
--- /dev/null
+++ b/com/sun/electric/tool/user/tests/TechnologyTest.java
@@ -0,0 +1,333 @@
+ /* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: TechnologyTest.java
+ *
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.user.tests;
+
+import com.sun.electric.database.Environment;
+import com.sun.electric.database.id.IdManager;
+import com.sun.electric.database.text.Setting;
+import com.sun.electric.technology.TechFactory;
+import com.sun.electric.technology.Technology;
+import com.sun.electric.technology.Xml;
+import com.sun.electric.technology.technologies.Generic;
+import com.sun.electric.tool.user.User;
+import com.sun.electric.tool.user.projectSettings.ProjSettings;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * class to test the technologies.
+ */
+public class TechnologyTest extends AbstractTest
+{
+ public TechnologyTest(String testName)
+ {
+ super(testName);
+ }
+
+ public static List<AbstractTest> getTests()
+ {
+ List<AbstractTest> list = new ArrayList<AbstractTest>();
+ list.add(new TechnologyTest("artwork"));
+ list.add(new TechnologyTest("bicmos"));
+ list.add(new TechnologyTest("bipolar"));
+ list.add(new TechnologyTest("cmos"));
+ list.add(new TechnologyTest("efido"));
+ list.add(new TechnologyTest("fpga"));
+ list.add(new TechnologyTest("gem"));
+ list.add(new TechnologyTest("mocmos_deep_5_1"));
+ list.add(new TechnologyTest("mocmos_deep_5_1_a"));
+ list.add(new TechnologyTest("mocmos_deep_5_2"));
+ list.add(new TechnologyTest("mocmos_deep_6_1"));
+ list.add(new TechnologyTest("mocmos_deep_6_2"));
+ list.add(new TechnologyTest("mocmos_deep_6_2_s"));
+ list.add(new TechnologyTest("mocmos_scmos_2_1"));
+ list.add(new TechnologyTest("mocmos_scmos_2_1_a"));
+ list.add(new TechnologyTest("mocmos_scmos_2_2"));
+ list.add(new TechnologyTest("mocmos_scmos_3_1"));
+ list.add(new TechnologyTest("mocmos_scmos_3_2"));
+ list.add(new TechnologyTest("mocmos_scmos_4_1"));
+ list.add(new TechnologyTest("mocmos_scmos_4_2"));
+ list.add(new TechnologyTest("mocmos_scmos_4_2_s"));
+ list.add(new TechnologyTest("mocmos_sub_2_1"));
+ list.add(new TechnologyTest("mocmos_sub_2_1_a"));
+ list.add(new TechnologyTest("mocmos_sub_2_2"));
+ list.add(new TechnologyTest("mocmos_sub_3_1"));
+ list.add(new TechnologyTest("mocmos_sub_3_2"));
+ list.add(new TechnologyTest("mocmos_sub_4_1"));
+ list.add(new TechnologyTest("mocmos_sub_4_2"));
+ list.add(new TechnologyTest("mocmos_sub_5_1"));
+ list.add(new TechnologyTest("mocmos_sub_5_2"));
+ list.add(new TechnologyTest("mocmos_sub_6_1"));
+ list.add(new TechnologyTest("mocmos_sub_6_1_a"));
+ list.add(new TechnologyTest("mocmos_sub_6_2"));
+ list.add(new TechnologyTest("mocmos_sub_6_2_s"));
+ list.add(new TechnologyTest("mocmos_scna"));
+ list.add(new TechnologyTest("mocmosold"));
+ list.add(new TechnologyTest("mocmossub"));
+ list.add(new TechnologyTest("nmos"));
+ list.add(new TechnologyTest("pcb"));
+ list.add(new TechnologyTest("rcmos"));
+ list.add(new TechnologyTest("schematic"));
+ list.add(new TechnologyTest("tft"));
+ return list;
+ }
+
+ public static String getOutputDirectory()
+ {
+ String rootPath = User.getRegressionPath();
+ if (rootPath == null) return null;
+ return rootPath + "/tools/Database/output/";
+ }
+
+ public Boolean artwork() { return basicTest(getRegressionPath(), "artwork", "artwork"); }
+
+ public Boolean bicmos() { return basicTest(getRegressionPath(), "bicmos", "bicmos"); }
+
+ public Boolean bipolar() { return basicTest(getRegressionPath(), "bipolar", "bipolar"); }
+
+ public Boolean cmos() { return basicTest(getRegressionPath(), "cmos", "cmos"); }
+
+ public Boolean efido() { return basicTest(getRegressionPath(), "efido", "efido"); }
+
+ public Boolean fpga() { return basicTest(getRegressionPath(), "fpga", "fpga"); }
+
+ public Boolean gem() { return basicTest(getRegressionPath(), "gem", "gem"); }
+
+ public Boolean mocmos_deep_5_1() { return basicTest(getRegressionPath(), "mocmos", "mocmos_deep_5_1_sf_af"); }
+
+ public Boolean mocmos_deep_5_1_a() { return basicTest(getRegressionPath(), "mocmos", "mocmos_deep_5_1_sf_at"); }
+
+ public Boolean mocmos_deep_5_2() { return basicTest(getRegressionPath(), "mocmos", "mocmos_deep_5_2_sf_af"); }
+
+ public Boolean mocmos_deep_6_1() { return basicTest(getRegressionPath(), "mocmos", "mocmos_deep_6_1_sf_af"); }
+
+ public Boolean mocmos_deep_6_2() { return basicTest(getRegressionPath(), "mocmos", "mocmos_deep_6_2_sf_af"); }
+
+ public Boolean mocmos_deep_6_2_s() { return basicTest(getRegressionPath(), "mocmos", "mocmos_deep_6_2_st_af"); }
+
+ public Boolean mocmos_scmos_2_1() { return basicTest(getRegressionPath(), "mocmos", "mocmos_scmos_2_1_sf_af"); }
+
+ public Boolean mocmos_scmos_2_1_a() { return basicTest(getRegressionPath(), "mocmos", "mocmos_scmos_2_1_sf_at"); }
+
+ public Boolean mocmos_scmos_2_2() { return basicTest(getRegressionPath(), "mocmos", "mocmos_scmos_2_2_sf_af"); }
+
+ public Boolean mocmos_scmos_3_1() { return basicTest(getRegressionPath(), "mocmos", "mocmos_scmos_3_1_sf_af"); }
+
+ public Boolean mocmos_scmos_3_2() { return basicTest(getRegressionPath(), "mocmos", "mocmos_scmos_3_2_sf_af"); }
+
+ public Boolean mocmos_scmos_4_1() { return basicTest(getRegressionPath(), "mocmos", "mocmos_scmos_4_1_sf_af"); }
+
+ public Boolean mocmos_scmos_4_2() { return basicTest(getRegressionPath(), "mocmos", "mocmos_scmos_4_2_sf_af"); }
+
+ public Boolean mocmos_scmos_4_2_s() { return basicTest(getRegressionPath(), "mocmos", "mocmos_scmos_4_2_st_af"); }
+
+ public Boolean mocmos_sub_2_1() { return basicTest(getRegressionPath(), "mocmos", "mocmos_sub_2_1_sf_af"); }
+
+ public Boolean mocmos_sub_2_1_a() { return basicTest(getRegressionPath(), "mocmos", "mocmos_sub_2_1_sf_at"); }
+
+ public Boolean mocmos_sub_2_2() { return basicTest(getRegressionPath(), "mocmos", "mocmos_sub_2_2_sf_af"); }
+
+ public Boolean mocmos_sub_3_1() { return basicTest(getRegressionPath(), "mocmos", "mocmos_sub_3_1_sf_af"); }
+
+ public Boolean mocmos_sub_3_2() { return basicTest(getRegressionPath(), "mocmos", "mocmos_sub_3_2_sf_af"); }
+
+ public Boolean mocmos_sub_4_1() { return basicTest(getRegressionPath(), "mocmos", "mocmos_sub_4_1_sf_af"); }
+
+ public Boolean mocmos_sub_4_2() { return basicTest(getRegressionPath(), "mocmos", "mocmos_sub_4_2_sf_af"); }
+
+ public Boolean mocmos_sub_5_1() { return basicTest(getRegressionPath(), "mocmos", "mocmos_sub_5_1_sf_af"); }
+
+ public Boolean mocmos_sub_5_2() { return basicTest(getRegressionPath(), "mocmos", "mocmos_sub_5_2_sf_af"); }
+
+ public Boolean mocmos_sub_6_1() { return basicTest(getRegressionPath(), "mocmos", "mocmos_sub_6_1_sf_af"); }
+
+ public Boolean mocmos_sub_6_1_a() { return basicTest(getRegressionPath(), "mocmos", "mocmos_sub_6_1_sf_at"); }
+
+ public Boolean mocmos_sub_6_2() { return basicTest(getRegressionPath(), "mocmos", "mocmos_sub_6_2_sf_af"); }
+
+ public Boolean mocmos_sub_6_2_s() { return basicTest(getRegressionPath(), "mocmos", "mocmos_sub_6_2_st_af"); }
+
+ public Boolean mocmos_scna() { return basicTest(getRegressionPath(), "mocmos", "mocmos_scna"); }
+
+ public Boolean mocmosold() { return basicTest(getRegressionPath(), "mocmosold", "mocmosold"); }
+
+ public Boolean mocmossub() { return basicTest(getRegressionPath(), "mocmossub", "mocmossub"); }
+
+ public Boolean nmos() { return basicTest(getRegressionPath(), "nmos", "nmos"); }
+
+ public Boolean pcb() { return basicTest(getRegressionPath(), "pcb", "pcb"); }
+
+ public Boolean rcmos() { return basicTest(getRegressionPath(), "rcmos", "rcmos"); }
+
+ public Boolean schematic() { return basicTest(getRegressionPath(), "schematic", "schematic"); }
+
+ public Boolean tft() { return basicTest(getRegressionPath(), "tft", "tft"); }
+
+ /************************************* SUPPORT *********************************************************/
+
+ public Boolean basicTest(String rootPath, String techName, String testName)
+ {
+ Environment savedEnvironment = Environment.setThreadEnvironment(null);
+ try
+ {
+ return Boolean.valueOf(basicTechnologyTest(rootPath, techName, testName));
+ } finally
+ {
+ Environment.setThreadEnvironment(savedEnvironment);
+ }
+ }
+
+ /**
+ * Method to run basic technology test. Must be public/static due to regressions.
+ * @param rootPath the top level of the regressions data.
+ * @return true if test successfully run.
+ */
+ private static boolean basicTechnologyTest(String rootPath, String techName, String testName)
+ {
+ String trueRootPath = getValidRootPath(rootPath, "/tools/Database/", "");
+ String outputDir = trueRootPath + "output/";
+ ensureOutputDirectory(outputDir);
+
+ try
+ {
+ // initialize
+ String fileName = trueRootPath + "data/projsettings_" + testName + ".xml";
+ final ProjSettings projSettings = ProjSettings.read(new File(fileName));
+
+ if (projSettings == null)
+ {
+ System.out.println("Error: can't open '" + fileName + "'");
+ return false;
+ }
+ TechFactory techFactory = TechFactory.getKnownTechs().get(techName);
+ if (techFactory == null)
+ {
+ System.out.println("Error: no factory for technology " + techName);
+ return false;
+ }
+
+ Map<TechFactory.Param, Object> paramValues = new HashMap<TechFactory.Param, Object>();
+ for (TechFactory.Param param : techFactory.getTechParams())
+ {
+ Object value = projSettings.getValue(param.xmlPath);
+ if (value != null) paramValues.put(param, value);
+ }
+ Map<Object,Map<String,Object>> additionalAttributes = new HashMap<Object,Map<String,Object>>();
+ Xml.Technology xmlTech = techFactory.getXml(paramValues, additionalAttributes);
+ if (!checkXml(trueRootPath, testName, xmlTech, additionalAttributes)) return false;
+
+ IdManager idManager = new IdManager();
+ Generic generic = Generic.newInstance(idManager);
+
+ Technology tech0 = techFactory.newInstance(generic, paramValues);
+ if (!checkSettings(trueRootPath, techName, tech0)) return false;
+ if (!checkDump(trueRootPath, testName, tech0, projSettings)) return false;
+ if (!checkXml(trueRootPath, testName, tech0)) return false;
+
+ Technology tech1 = techFactory.newInstance(generic);
+ Technology tech2 = tech1.withTechParams(paramValues);
+ if (!checkSettings(trueRootPath, techName, tech1)) return false;
+ if (!checkSettings(trueRootPath, techName, tech2)) return false;
+ if (!checkDump(trueRootPath, testName, tech2, projSettings)) return false;
+ if (!checkXml(trueRootPath, testName, tech2)) return false;
+
+ // check tech dump
+ return true;
+ } catch (Exception e)
+ {
+ // Catching any type of exception
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ private static boolean checkDump(String rootPath, String testName, Technology tech, ProjSettings projSettings)
+ throws IOException
+ {
+ HashMap<Setting, Object> settingValues = new HashMap<Setting, Object>();
+ for (Setting setting : tech.getProjectSettings().getSettings())
+ {
+ Object value = projSettings.getValue(setting.getXmlPath());
+ if (value == null) value = setting.getFactoryValue();
+ settingValues.put(setting, value);
+ }
+
+ String fileName = testName + ".txt";
+ File dumpFile = new File(rootPath + "output/" + fileName);
+ dumpFile.delete();
+ PrintWriter out = new PrintWriter(dumpFile);
+ tech.dump(out, settingValues);
+ out.close();
+ System.out.println("Wrote tech dump to " + dumpFile);
+ return equal(rootPath, fileName);
+ }
+
+ private static boolean checkXml(String rootPath, String testName, Technology tech)
+ throws IOException
+ {
+ Map<Object, Map<String, Object>> additionalAttributes = new HashMap<Object, Map<String, Object>>();
+ Xml.Technology techXml = tech.makeXml(additionalAttributes);
+ return checkXml(rootPath, testName, techXml, additionalAttributes);
+ }
+
+ private static boolean checkXml(String rootPath, String testName, Xml.Technology techXml, Map<Object, Map<String, Object>> additionalAttributes)
+ {
+ String fileName = testName + ".xml";
+ File dumpFile = new File(rootPath + "output/" + fileName);
+ dumpFile.delete();
+ techXml.writeXml(dumpFile.getPath(), false, null, additionalAttributes);
+ System.out.println("Wrote Xml tech dump to " + dumpFile);
+ return equal(rootPath, fileName);
+ }
+
+ private static boolean checkSettings(String rootPath, String techName, Technology tech)
+ throws IOException
+ {
+ ProjSettings ps = new ProjSettings();
+ for (Setting setting : tech.getProjectSettings().getSettings())
+ {
+ ps.putValue(setting.getXmlPath(), setting.getFactoryValue());
+ }
+ return check(rootPath, techName + ".set", ps);
+ }
+
+ private static boolean check(String rootPath, String fileName, ProjSettings ps)
+ {
+ File prefFile = new File(rootPath + "output/" + fileName);
+ prefFile.delete();
+ ps.write(prefFile.toString());
+ return equal(rootPath, fileName);
+ }
+
+ private static boolean equal(String rootPath, String fileName)
+ {
+ String resultFile = rootPath + "output/" + fileName;
+ String expectedFile = rootPath + "data/expected/" + fileName;
+ return compareResults(resultFile, expectedFile);
+ }
+}
diff --git a/com/sun/electric/tool/user/tests/TestMenu.java b/com/sun/electric/tool/user/tests/TestMenu.java
new file mode 100644
index 0000000..a0a05b0
--- /dev/null
+++ b/com/sun/electric/tool/user/tests/TestMenu.java
@@ -0,0 +1,196 @@
+ /* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: TestMenu.java
+ *
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.user.tests;
+
+import com.sun.electric.tool.lang.EvalJavaBsh;
+import com.sun.electric.tool.lang.EvalJython;
+import com.sun.electric.tool.simulation.irsim.IRSIM;
+import com.sun.electric.tool.user.menus.EMenu;
+import com.sun.electric.tool.user.menus.EMenuItem;
+import com.sun.electric.util.ClientOS;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Class to collect all tests available for Electric organized by tools.
+ */
+public class TestMenu
+{
+ static List<AbstractTest> totalList = new ArrayList<AbstractTest>();
+ static Set<String> outputDirectories = new HashSet<String>();
+
+ public static EMenu makeMenu()
+ {
+ List<EMenuItem> items = new ArrayList<EMenuItem>();
+ items.add(new EveryTestMenuItem());
+ items.add(new CleanTestMenuItem());
+ items.add(EMenuItem.SEPARATOR);
+
+// if (CommonSignalAnalysisTest.hasCSA())
+// items.add(testSubMenu("Common Signal Analysis", CommonSignalAnalysisTest.getTests(), CommonSignalAnalysisTest.getOutputDirectory()));
+ items.add(testSubMenu("Compaction", CompactionTest.getTests(), CompactionTest.getOutputDirectory()));
+ items.add(testSubMenu("DRC", DRCTest.getTests(), DRCTest.getOutputDirectory()));
+ items.add(testSubMenu("ERC", ERCTest.getTests(), ERCTest.getOutputDirectory()));
+ items.add(testSubMenu("Export", ExportForeignTest.getTests(), ExportForeignTest.getOutputDirectory()));
+ items.add(testSubMenu("Extraction", ExtractionTest.getTests(), ExtractionTest.getOutputDirectory()));
+ items.add(testSubMenu("Generation", GenerationTest.getTests(), GenerationTest.getOutputDirectory()));
+ items.add(testSubMenu("I-O", IOTest.getTests(), IOTest.getOutputDirectory()));
+ items.add(testSubMenu("Import", ImportForeignTest.getTests(), ImportForeignTest.getOutputDirectory()));
+ items.add(testSubMenu("Jobs", JobsTest.getTests(), JobsTest.getOutputDirectory()));
+ items.add(testSubMenu("Layer Coverage", LayerCoverageToolTest.getTests(), LayerCoverageToolTest.getOutputDirectory()));
+ items.add(testSubMenu("Logical Effort", LogicalEffortTest.getTests(), LogicalEffortTest.getOutputDirectory()));
+ items.add(testSubMenu("NCC", NCCTest.getTests(), NCCTest.getOutputDirectory()));
+ items.add(testSubMenu("Placement", PlacementTest.getTests(), PlacementTest.getOutputDirectory()));
+ items.add(testSubMenu("Preferences", PrefTest.getTests(), PrefTest.getOutputDirectory()));
+ items.add(testSubMenu("Routing", RoutingTest.getTests(), RoutingTest.getOutputDirectory()));
+ items.add(testSubMenu("Scripting", ScriptingTest.getTests(), ScriptingTest.getOutputDirectory()));
+ items.add(testSubMenu("Technology", TechnologyTest.getTests(), TechnologyTest.getOutputDirectory()));
+ items.add(testSubMenu("Technology Edit", TechnologyEditTest.getTests(), TechnologyEditTest.getOutputDirectory()));
+// if (TimingAnalysisTest.hasOyster())
+// items.add(testSubMenu("Timing Analysis", TimingAnalysisTest.getTests(), TimingAnalysisTest.getOutputDirectory()));
+ if (ClientOS.isOSWindows())
+ items.add(testSubMenu("Waveform Window", WaveformTest.getTests(), WaveformTest.getOutputDirectory()));
+ return new EMenu("Test", items);
+ }
+
+ private static EMenu testSubMenu(String menuName, List<AbstractTest> list, String outputDir)
+ {
+ for(AbstractTest at : list)
+ {
+ at.setGroupName(menuName);
+ if (!at.isInteractive()) totalList.add(at);
+ }
+ if (outputDir != null) outputDirectories.add(outputDir);
+ int testSize = list.size() + 2;
+ EMenuItem[] tests = new EMenuItem[testSize];
+ int fill = 0;
+ tests[fill++] = new AllMenuItems(list);
+ tests[fill++] = EMenuItem.SEPARATOR;
+ for (AbstractTest t : list)
+ {
+ tests[fill++] = new TestMenuItem(t);
+ }
+ return new EMenu(menuName, tests);
+ }
+
+ /**
+ * Class to define the first entry in each Tests sub-menu to run every one of its tests.
+ */
+ private static class AllMenuItems extends EMenuItem
+ {
+ private final List<AbstractTest> list;
+
+ AllMenuItems(List<AbstractTest> list)
+ {
+ super("Run All Tests");
+ this.list = list;
+ }
+
+ public void run()
+ {
+ new FakeTestJob(list);
+ }
+ }
+
+ /**
+ * Class to define the first entry in the "Tests" menu
+ * that runs every test.
+ */
+ private static class EveryTestMenuItem extends EMenuItem
+ {
+ EveryTestMenuItem()
+ {
+ super("Run Every Test");
+ }
+
+ public void run()
+ {
+ if (!EvalJavaBsh.hasBeanShell())
+ System.out.println("WARNING: Bean Shell is not installed, so some tests will not be run");
+ if (!EvalJython.hasJython())
+ System.out.println("WARNING: Jython is not installed, so some tests will not be run");
+ if (!IRSIM.hasIRSIM())
+ System.out.println("WARNING: IRSIM is not installed, so some tests will not be run");
+ new FakeTestJob(totalList);
+ }
+ }
+
+ private static class TestMenuItem extends EMenuItem
+ {
+ final AbstractTest t;
+
+ TestMenuItem(AbstractTest t)
+ {
+ super(t.getFullTestName());
+ this.t = t;
+ }
+
+ public void run()
+ {
+ new FakeTestJob(t);
+ }
+ }
+
+ /**
+ * Class to define the second entry in the "Tests" menu
+ * that cleans up after tests.
+ */
+ private static class CleanTestMenuItem extends EMenuItem
+ {
+ CleanTestMenuItem()
+ {
+ super("Clean Test Menu Directory");
+ }
+
+ public void run()
+ {
+ System.out.println("Cleaning up test area");
+ for(String dir : outputDirectories)
+ {
+ File f = new File(dir);
+ if (!f.exists()) continue;
+ String[] subFiles = f.list();
+ int deletedFiles = 0;
+ for(int i=0; i<subFiles.length; i++)
+ {
+ File sf = new File(dir + File.separator + subFiles[i]);
+ if (sf.exists())
+ {
+ if (sf.delete())
+ deletedFiles++;
+ }
+ }
+ if (f.delete())
+ {
+ System.out.println("Deleted directory " + dir + " (" + deletedFiles + " files)");
+ } else
+ {
+ System.out.println("ERROR deleting directory " + dir + " (did delete " + deletedFiles + " files)");
+ }
+ }
+ }
+ }
+}
diff --git a/com/sun/electric/tool/user/tests/TestTab.form b/com/sun/electric/tool/user/tests/TestTab.form
new file mode 100644
index 0000000..b1f3bdc
--- /dev/null
+++ b/com/sun/electric/tool/user/tests/TestTab.form
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+
+<Form version="1.0" type="org.netbeans.modules.form.forminfo.JFrameFormInfo">
+ <Properties>
+ <Property name="defaultCloseOperation" type="int" value="2"/>
+ </Properties>
+ <SyntheticProperties>
+ <SyntheticProperty name="formSizePolicy" type="int" value="1"/>
+ </SyntheticProperties>
+ <AuxValues>
+ <AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/>
+ <AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
+ <AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
+ <AuxValue name="designerSize" type="java.awt.Dimension" value="-84,-19,0,5,115,114,0,18,106,97,118,97,46,97,119,116,46,68,105,109,101,110,115,105,111,110,65,-114,-39,-41,-84,95,68,20,2,0,2,73,0,6,104,101,105,103,104,116,73,0,5,119,105,100,116,104,120,112,0,0,1,44,0,0,1,-112"/>
+ </AuxValues>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+ <SubComponents>
+ <Container class="javax.swing.JPanel" name="testPanel">
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="1" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="1.0" weightY="1.0"/>
+ </Constraint>
+ </Constraints>
+
+ <Layout class="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout"/>
+ <SubComponents>
+ <Component class="javax.swing.JLabel" name="testRegressionLabel">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Regression Path: "/>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="2" insetsLeft="2" insetsBottom="2" insetsRight="2" anchor="17" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Component class="javax.swing.JButton" name="browser">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="Set"/>
+ <Property name="horizontalAlignment" type="int" value="11"/>
+ </Properties>
+ <Events>
+ <EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parameters="java.awt.event.ActionEvent" handler="browserActionPerformed"/>
+ </Events>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="1" gridY="1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="13" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ <Component class="javax.swing.JLabel" name="testRegressionText">
+ <Properties>
+ <Property name="text" type="java.lang.String" value="<set me up>"/>
+ </Properties>
+ <Constraints>
+ <Constraint layoutClass="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout" value="org.netbeans.modules.form.compat2.layouts.DesignGridBagLayout$GridBagConstraintsDescription">
+ <GridBagConstraints gridX="-1" gridY="-1" gridWidth="1" gridHeight="1" fill="0" ipadX="0" ipadY="0" insetsTop="0" insetsLeft="0" insetsBottom="0" insetsRight="0" anchor="10" weightX="0.0" weightY="0.0"/>
+ </Constraint>
+ </Constraints>
+ </Component>
+ </SubComponents>
+ </Container>
+ </SubComponents>
+</Form>
diff --git a/com/sun/electric/tool/user/tests/TestTab.java b/com/sun/electric/tool/user/tests/TestTab.java
new file mode 100644
index 0000000..ff755ba
--- /dev/null
+++ b/com/sun/electric/tool/user/tests/TestTab.java
@@ -0,0 +1,121 @@
+ /* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: TestTab.java
+ *
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.user.tests;
+
+import com.sun.electric.tool.user.User;
+import com.sun.electric.tool.user.dialogs.OpenFile;
+import com.sun.electric.tool.user.dialogs.PreferencesFrame;
+import com.sun.electric.tool.user.dialogs.options.PreferencePanel;
+
+import javax.swing.JPanel;
+
+public class TestTab extends PreferencePanel
+{
+ /** Creates new form TestTab */
+ public TestTab(PreferencesFrame parent, Boolean modal)
+ {
+ super(parent, modal.booleanValue());
+ initComponents();
+ }
+
+ /** return the panel to use for user preferences. */
+ public JPanel getUserPreferencesPanel() { return testPanel; }
+
+ /** return the name of this preferences tab. */
+ public String getName() { return "Tests"; }
+
+ /**
+ * Method called at the start of the dialog.
+ * Caches current values and displays them in the CDL tab.
+ */
+ public void init() { testRegressionText.setText(User.getRegressionPath()); }
+
+ /**
+ * Method called when the "OK" panel is hit.
+ * Updates any changed fields in the CDL tab.
+ */
+ public void term() { User.setRegressionPath(testRegressionText.getText()); }
+
+ /** This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
+ private void initComponents() {
+ java.awt.GridBagConstraints gridBagConstraints;
+
+ testPanel = new javax.swing.JPanel();
+ testRegressionLabel = new javax.swing.JLabel();
+ browser = new javax.swing.JButton();
+ testRegressionText = new javax.swing.JLabel();
+
+ getContentPane().setLayout(new java.awt.GridBagLayout());
+
+ setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE);
+ testPanel.setLayout(new java.awt.GridBagLayout());
+
+ testRegressionLabel.setText("Regression Path: ");
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
+ gridBagConstraints.insets = new java.awt.Insets(2, 2, 2, 2);
+ testPanel.add(testRegressionLabel, gridBagConstraints);
+
+ browser.setText("Set");
+ browser.setHorizontalAlignment(javax.swing.SwingConstants.TRAILING);
+ browser.addActionListener(new java.awt.event.ActionListener() {
+ public void actionPerformed(java.awt.event.ActionEvent evt) {
+ browserActionPerformed(evt);
+ }
+ });
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.gridx = 1;
+ gridBagConstraints.gridy = 1;
+ gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
+ testPanel.add(browser, gridBagConstraints);
+
+ testRegressionText.setText("<set me up>");
+ testPanel.add(testRegressionText, new java.awt.GridBagConstraints());
+
+ gridBagConstraints = new java.awt.GridBagConstraints();
+ gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
+ gridBagConstraints.weightx = 1.0;
+ gridBagConstraints.weighty = 1.0;
+ getContentPane().add(testPanel, gridBagConstraints);
+
+ pack();
+ }// </editor-fold>//GEN-END:initComponents
+
+ private void browserActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_browserActionPerformed
+ String dirName = OpenFile.chooseDirectory("Regression Root Directory");
+ if (dirName == null) return;
+ testRegressionText.setText(dirName);
+ }//GEN-LAST:event_browserActionPerformed
+
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JButton browser;
+ private javax.swing.JPanel testPanel;
+ private javax.swing.JLabel testRegressionLabel;
+ private javax.swing.JLabel testRegressionText;
+ // End of variables declaration//GEN-END:variables
+}
diff --git a/com/sun/electric/tool/user/tests/TimingAnalysisTest.java b/com/sun/electric/tool/user/tests/TimingAnalysisTest.java
new file mode 100644
index 0000000..44734bb
--- /dev/null
+++ b/com/sun/electric/tool/user/tests/TimingAnalysisTest.java
@@ -0,0 +1,207 @@
+ /* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: TimingAnalysisTest.java
+ *
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.user.tests;
+
+import com.sun.electric.tool.user.User;
+
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.StringTokenizer;
+
+public class TimingAnalysisTest extends AbstractTest
+{
+ private String name, functionName, dspfFile, cmdFile, gcfFile, sdcFile, oysterNodesFile, oysterReportFile;
+ private List<String> libFiles, vlFiles;
+ private Boolean splitNodes;
+
+ /** Creates a new instance of TimingAnalysisTest */
+ public TimingAnalysisTest(String name)
+ {
+ super(name);
+ functionName = name;
+ }
+
+ public TimingAnalysisTest(String name, String functionName, String vlFiles, String libFiles, String dspfFile,
+ String cmdFile, String gcfFile, String sdcFile,
+ String oysterOriginal, String reportFile, Boolean split)
+ {
+ super(name);
+ this.name = name;
+ this.functionName = functionName;
+ this.vlFiles = new ArrayList<String>();
+ this.libFiles = new ArrayList<String>();
+ this.dspfFile = dspfFile;
+ this.cmdFile = cmdFile;
+ this.gcfFile = gcfFile;
+ this.sdcFile = sdcFile;
+ this.oysterNodesFile = oysterOriginal;
+ this.oysterReportFile = reportFile;
+ this.splitNodes = split;
+
+ if (vlFiles != null)
+ {
+ StringTokenizer parse = new StringTokenizer(vlFiles, "{, }", false); // extracting lib names
+ while (parse.hasMoreTokens())
+ {
+ this.vlFiles.add(parse.nextToken());
+ }
+ }
+ if (libFiles != null)
+ {
+ StringTokenizer parse = new StringTokenizer(libFiles, "{, }", false); // extracting lib names
+ while (parse.hasMoreTokens())
+ {
+ this.libFiles.add(parse.nextToken());
+ }
+ }
+ }
+
+ public static List<AbstractTest> getTests()
+ {
+ List<AbstractTest> list = new ArrayList<AbstractTest>();
+ // Tests not available due to privacy issues
+ list.add(new TimingAnalysisTest("controlblock with no split", "controlblock", "rk_cb_dsu_cms.vL", "data/u1.lib, data/u1fib.lib", "data/rk_cb_dsu_cms.dspf",
+ "rk_cb_dsu_cms.cmd", null, "rk_cb_dsu_cms.sdc", "report.graph", "nodereport", false));
+ list.add(new TimingAnalysisTest("controlblock with split", "controlblock", "rk_cb_dsu_cms.vL", "data/u1.lib, data/u1fib.lib", "data/rk_cb_dsu_cms.dspf",
+ "rk_cb_dsu_cms.cmd", null, "rk_cb_dsu_cms.sdc", "report.graph", "nodereport", true));
+
+ list.add(new TimingAnalysisTest("rk_m_stadd64 with no split", "rk_m_stadd64", "rk_m_stadd64.vL", "data/u1.lib, ", "rk_m_stadd64.dspf",
+ "rk_m_stadd64.cmd", null, "rk_m_stadd64.sdc", "report.graph", "nodereport", false));
+ list.add(new TimingAnalysisTest("rk_m_stadd64 with split", "rk_m_stadd64", "rk_m_stadd64.vL", "data/u1.lib, ", "rk_m_stadd64.dspf",
+ "rk_m_stadd64.cmd", null, "rk_m_stadd64.sdc", "report.graph", "nodereport", true));
+ // Tests in CVS
+ list.add(new TimingAnalysisTest("fastProx with no split", "fastProx", "input/testFlops.v", "input/flops.MAX.lib,input/sclibTSMC90.MAX.lib",
+ "input/testFlops.dspf", "fastProx.cmd", null, "fastProx.sdc", "oysterData/report.graph", "oysterData/node-report", false));
+ list.add(new TimingAnalysisTest("fastProx with split", "fastProx", "input/testFlops.v", "input/flops.MAX.lib,input/sclibTSMC90.MAX.lib",
+ "input/testFlops.dspf", "fastProx.cmd", null, "fastProx.sdc", "oysterData/report.graph", "oysterData/node-report", true));
+
+ list.add(new TimingAnalysisTest("main_t1 with no split", "main_t1", "{input/main.v}", "input/sc.lib", "input/main.dspf", "main_t1.cmd", null,
+ "main_t1.sdc", "oysterData/report.graph", "oysterData/node-report", false)); // node-report.full.regression.MINMAX
+ list.add(new TimingAnalysisTest("main_t1 with split", "main_t1", "{input/main.v}", "input/sc.lib", "input/main.dspf", "main_t1.cmd", null,
+ "main_t1.sdc", "oysterData/report.graph", "oysterData/node-report", true)); // node-report.full.regression.MINMAX
+
+ list.add(new TimingAnalysisTest("multithread_example with no split", "multithread_example", "input/multithread_example.vL", "input/multithread_example_lib.SynT",
+ "input/multithread_example.dspf", "simple.cmd", null, "simple.sdc", "oysterData/report.graph", "oysterData/node-report", false));
+ list.add(new TimingAnalysisTest("multithread_example with split", "multithread_example", "input/multithread_example.vL", "input/multithread_example_lib.SynT",
+ "input/multithread_example.dspf", "simple.cmd", null, "simple.sdc", "oysterData/report.graph", "oysterData/node-report", true));
+ return list;
+ }
+
+ public static String getOutputDirectory()
+ {
+ return null;
+ }
+
+ public Boolean controlblock() { return doIt(); }
+ public Boolean fastProx() { return doIt(); }
+ public Boolean main_t1() { return doIt(); }
+ public Boolean multithread_example() { return doIt(); }
+ public Boolean noise_ch_cq_ctl() { return doIt(); }
+ public Boolean rk_m_stadd64() { return doIt(); }
+ public Boolean timingmodel_case1() { return doIt(); }
+ public String getFunctionName() { return functionName; }
+
+ public Boolean doIt()
+ {
+ if (!hasOyster()) return false;
+
+ String testParameter = createMessageOutput();
+
+ String path = workingDir(getRegressionPath(), testParameter) + getFunctionName();
+ List<String> fileNamesVerilog = new ArrayList<String>(vlFiles.size());
+ for (String n : vlFiles)
+ fileNamesVerilog.add(path + "/" + n);
+ List<String> fileNameLibs = new ArrayList<String>(libFiles.size());
+ for (String n : libFiles)
+ fileNameLibs.add(path + "/" + n);
+ String fileDspf = (dspfFile != null) ? path + "/" + dspfFile : null;
+ String fileCmd = (cmdFile != null) ? path + "/" + cmdFile : null;
+ String fileGcf = (gcfFile != null) ? path + "/" + gcfFile : null;
+ String fileSdc = (sdcFile != null) ? path + "/" + sdcFile : null;
+ String fileOysterGraph = (oysterNodesFile != null) ? path + "/" + oysterNodesFile : null;
+ String fileOysterReport = (oysterReportFile != null) ? path + "/" + oysterReportFile : null;
+
+ Boolean good = false;
+ try
+ {
+ Object obj = oysterTestInputMethod.invoke(oysterTestClass, fileNameLibs, fileNamesVerilog,
+ fileDspf, fileCmd, fileGcf, fileSdc, fileOysterGraph, fileOysterReport, name, splitNodes);
+ if (obj instanceof Boolean)
+ {
+ good = (Boolean)obj;
+ }
+ } catch (Exception e)
+ {
+ System.out.println("Unable to run the Oyster test module (" + name + ")");
+ e.printStackTrace(System.out);
+ good = false;
+ }
+ return good;
+ }
+
+ /****************************** REFLECTION INTERFACE ******************************/
+
+ private static boolean oysterTestChecked = false;
+ private static Class<?> oysterTestClass = null;
+ private static Method oysterTestInputMethod;
+
+ /**
+ * Method to tell whether CSA is available.
+ * CSA is part of the Oyster timing analyzer.
+ * This method dynamically figures out whether the CSA module is present by using reflection.
+ * @return true if the CSA module is available.
+ */
+ public static boolean hasOyster()
+ {
+ if (!oysterTestChecked)
+ {
+ oysterTestChecked = true;
+
+ // find the CSA class
+ try
+ {
+ oysterTestClass = Class.forName("com.sun.electric.plugins.oyster.OysterMain");
+ } catch (ClassNotFoundException e)
+ {
+ oysterTestClass = null;
+ return false;
+ }
+
+ // find the necessary method on the CSA class
+ try
+ {
+ oysterTestInputMethod = oysterTestClass.getMethod("oyster_regression",
+ List.class, List.class, String.class, String.class, String.class, String.class,
+ String.class, String.class, String.class, Boolean.class);
+ } catch (NoSuchMethodException e)
+ {
+ oysterTestClass = null;
+ e.printStackTrace();
+ return false;
+ }
+ }
+
+ // if already initialized, return
+ return (oysterTestClass != null);
+ }
+}
diff --git a/com/sun/electric/tool/user/tests/WaveformTest.java b/com/sun/electric/tool/user/tests/WaveformTest.java
new file mode 100644
index 0000000..479dfcb
--- /dev/null
+++ b/com/sun/electric/tool/user/tests/WaveformTest.java
@@ -0,0 +1,616 @@
+ /* -*- tab-width: 4 -*-
+ *
+ * Electric(tm) VLSI Design System
+ *
+ * File: WaveformTest.java
+ *
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
+ *
+ * Electric(tm) is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Electric(tm) is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.sun.electric.tool.user.tests;
+
+import com.sun.electric.database.EditingPreferences;
+import com.sun.electric.database.hierarchy.Cell;
+import com.sun.electric.database.hierarchy.Library;
+import com.sun.electric.database.hierarchy.View;
+import com.sun.electric.technology.TechPool;
+import com.sun.electric.tool.Job;
+import com.sun.electric.tool.io.FileType;
+import com.sun.electric.tool.io.input.LibraryFiles;
+import com.sun.electric.tool.io.input.SimulationData;
+import com.sun.electric.tool.io.output.PNG;
+import com.sun.electric.tool.simulation.Engine;
+import com.sun.electric.tool.simulation.Sample;
+import com.sun.electric.tool.simulation.ScalarSample;
+import com.sun.electric.tool.simulation.Signal;
+import com.sun.electric.tool.simulation.SignalCollection;
+import com.sun.electric.tool.simulation.SimulationTool;
+import com.sun.electric.tool.simulation.Stimuli;
+import com.sun.electric.tool.simulation.SweptSample;
+import com.sun.electric.tool.simulation.als.ALS;
+import com.sun.electric.tool.simulation.irsim.IRSIM;
+import com.sun.electric.tool.user.MessagesStream;
+import com.sun.electric.tool.user.User;
+import com.sun.electric.tool.user.ui.WindowFrame;
+import com.sun.electric.tool.user.waveform.Panel;
+import com.sun.electric.tool.user.waveform.WaveSignal;
+import com.sun.electric.tool.user.waveform.WaveformWindow;
+import com.sun.electric.util.ClientOS;
+import com.sun.electric.util.TextUtils;
+
+import java.awt.Graphics2D;
+import java.awt.Image;
+import java.awt.Rectangle;
+import java.awt.image.BufferedImage;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.io.Serializable;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+/**
+ * Class to test the waveform window.
+ *
+ * Notes on the tests:
+ * H01: Transient
+ * H02: Transient (19 sweeps), Measurements
+ * H03: Transient (30 sweeps), DC (sweeps), Measurements
+ * H04: Transient (7 sweeps), DC, AC (sweeps), Measurements
+ * H05: Transient
+ * H06: Transient
+ * H07: Transient (25 sweeps), Measurements
+ * H08: Transient (3 sweeps), AC, Measurements, early EOF
+ * H09: Transient (3 sweeps), AC (sweeps)
+ * H10: Transient (4 sweeps), AC (sweeps)
+ * H11: Transient, AC
+ * H12:
+ * H13: ? (sweeps), multi-file
+ * LT: DC (6 sweeps)
+ */
+public class WaveformTest extends AbstractGUITest
+{
+ private final String testName;
+ private final String cellName;
+ private final String stimuliExtension;
+ private final String cmdFileExtension;
+ private final int engine;
+ private final PanelSpec[] panelSpecs;
+ private final boolean locked;
+
+ private transient Panel[] panels;
+
+ public WaveformTest(String commandName, String testName, String cellName,
+ String stimuliExtension, boolean locked, int engine, String cmdFileExtension,
+ PanelSpec spec1)
+ {
+ this(commandName, testName, cellName, stimuliExtension, locked, engine, cmdFileExtension,
+ new PanelSpec[] {spec1});
+ }
+
+ public WaveformTest(String commandName, String testName, String cellName,
+ String stimuliExtension, boolean locked, int engine, String cmdFileExtension,
+ PanelSpec spec1, PanelSpec spec2)
+ {
+ this(commandName, testName, cellName, stimuliExtension, locked, engine, cmdFileExtension,
+ new PanelSpec[] {spec1, spec2});
+ }
+
+ public WaveformTest(String commandName, String testName, String cellName,
+ String stimuliExtension, boolean locked, int engine, String cmdFileExtension,
+ PanelSpec spec1, PanelSpec spec2, PanelSpec spec3)
+ {
+ this(commandName, testName, cellName, stimuliExtension, locked, engine, cmdFileExtension,
+ new PanelSpec[] {spec1, spec2, spec3});
+ }
+
+ public WaveformTest(String commandName, String testName, String cellName,
+ String stimuliExtension, boolean locked, int engine, String cmdFileExtension,
+ PanelSpec spec1, PanelSpec spec2, PanelSpec spec3, PanelSpec spec4)
+ {
+ this(commandName, testName, cellName, stimuliExtension, locked, engine, cmdFileExtension,
+ new PanelSpec[] {spec1, spec2, spec3, spec4});
+ }
+
+ public WaveformTest(String commandName, String testName, String cellName,
+ String stimuliExtension, boolean locked, int engine, String cmdFileExtension,
+ PanelSpec... panelSpecs)
+ {
+ super(commandName);
+ this.testName = testName;
+ this.cellName = cellName;
+ this.stimuliExtension = stimuliExtension;
+ this.locked = locked;
+ this.engine = engine;
+ this.cmdFileExtension = cmdFileExtension;
+ this.panelSpecs = panelSpecs;
+ }
+
+ public static List<AbstractTest> getTests()
+ {
+ List<AbstractTest> list = new ArrayList<AbstractTest>();
+ list.add(new WaveformTest("ALS1", "ALS-1", "ALS-1{sch}", null, true, SimulationTool.ALS_ENGINE, ".vec",
+ new PanelSpec(null, "a"),
+ new PanelSpec(null, "b"),
+ new PanelSpec(null, "c")));
+ if (IRSIM.hasIRSIM())
+ {
+ list.add(new WaveformTest("IRSIM1", "IRSIM-1", "IRSIM-1{lay}", null, true, SimulationTool.IRSIM_ENGINE, ".cmd"));
+ list.add(new WaveformTest("IRSIM2", "IRSIM-2", "IRSIM-2{lay}", null, true, SimulationTool.IRSIM_ENGINE, ".cmd"));
+ list.add(new WaveformTest("IRSIM3", "IRSIM-3", "IRSIM-3{lay}", ".sim", true, SimulationTool.IRSIM_ENGINE, ".cmd"));
+ }
+ list.add(new WaveformTest("Spice2", "Spice2-1", "Spice2-1{sch}", ".spo", true, -1, null,
+ new PanelSpec(null, "signal 1", "signal 2")));
+ list.add(new WaveformTest("HSpice1", "SpiceH-1", "SpiceH-1{sch}", ".tr0", true, -1, null,
+ new PanelSpec(null, "5:net_16_"),
+ new PanelSpec(null, "1:net_198_", "3:net_198_")));
+ list.add(new WaveformTest("HSpice2", "SpiceH-2", "SpiceH-2{sch}", ".tr0", true, -1, null,
+ new PanelSpec("MEASUREMENTS", "n10d0", "n10d150")));
+ list.add(new WaveformTest("HSpice3", "SpiceH-3", "SpiceH-3{sch}", ".tr0", false, -1, null,
+ new PanelSpec("DC SIGNALS", "a5.rp1.rrp_sub at 1.v(1,39:3_"),
+ new PanelSpec("DC SIGNALS", "rshortc"),
+ new PanelSpec("TRANS SIGNALS", "v(c1,ref")));
+ list.add(new WaveformTest("HSpice4", "SpiceH-4", "SpiceH-4{sch}", ".tr0", false, -1, null,
+ new PanelSpec("TRANS SIGNALS", "aa", "bb"),
+ new PanelSpec("DC SIGNALS", "cat"),
+ new PanelSpec("MEASUREMENTS", "temper")));
+ list.add(new WaveformTest("HSpice5", "SpiceH-5", "SpiceH-5{sch}", ".tr0", true, -1, null,
+ new PanelSpec(null, "net at 4", "net at 3"),
+ new PanelSpec(null, "i(vpulse at 0", "i(vvdd")));
+ list.add(new WaveformTest("HSpice6", "SpiceH-6", "SpiceH-6{sch}", ".tr0", true, -1, null,
+ new PanelSpec(null, "txclk", "clk_path_test.invclk[3]_out_"),
+ new PanelSpec(null, "i(vvdd", "i(vclk")));
+ list.add(new WaveformTest("HSpice7", "SpiceH-7", "SpiceH-7{lay}", ".tr0", false, -1, null,
+ new PanelSpec("TRANS SIGNALS", "in0", "out"),
+ new PanelSpec("MEASUREMENTS", "inbufstr", "index", "outloadstr")));
+ list.add(new WaveformTest("HSpice8", "SpiceH-8", "SpiceH-8{sch}", ".tr0", false, -1, null,
+ new PanelSpec("TRANS SIGNALS", "v(inn"),
+ new PanelSpec("AC SIGNALS", "gain1"),
+ new PanelSpec("MEASUREMENTS", "index", "alter")));
+ list.add(new WaveformTest("HSpice9", "SpiceH-9", "SpiceH-9{sch}", ".tr0", false, -1, null,
+ new PanelSpec("TRANS SIGNALS", "1"),
+ new PanelSpec("AC SIGNALS", "1", "i(v2")));
+ list.add(new WaveformTest("HSpice10", "SpiceH-10", "SpiceH-10{sch}", ".tr0", false, -1, null,
+ new PanelSpec("TRANS SIGNALS", "1"),
+ new PanelSpec("AC SIGNALS", "1", "i(v2")));
+ list.add(new WaveformTest("HSpice11", "SpiceH-11", "SpiceH-11{sch}", ".tr0", false, -1, null,
+ new PanelSpec("TRANS SIGNALS", "out"),
+ new PanelSpec("AC SIGNALS", "net at 5", "out")));
+ list.add(new WaveformTest("HSpice12", "SpiceH-12", "SpiceH-12{sch}", ".tr0", false, -1, null,
+ new PanelSpec("TRANS SIGNALS", "a_b_", "a_bn_", "an_b_", "an_bn_")));
+ list.add(new WaveformTest("HSpice13", "SpiceH-13", "SpiceH-13{sch}", ".tr0", false, -1, null,
+ new PanelSpec("TRANS SIGNALS", "1", "2")));
+ list.add(new WaveformTest("EpicSpice1", "SpiceEpic-1", "SpiceEpic-1{sch}", ".out", true, -1, null,
+ new PanelSpec(null, "in", "out")));
+ list.add(new WaveformTest("EpicSpice2", "SpiceEpic-2", "SpiceEpic-2{sch}", ".out", true, -1, null,
+ new PanelSpec(null, "1", "2")));
+ list.add(new WaveformTest("LTSpice1", "SpiceLT-1", "SpiceLT-1{sch}", ".raw", true, -1, null,
+ new PanelSpec(null, "net at 1", "net at 23"),
+ new PanelSpec(null, "i(vvsd)")));
+ list.add(new WaveformTest("PSpice1", "SpiceP-1", "SpiceP-1{lay}", ".txt", true, -1, null,
+ new PanelSpec(null, "i(c1)", "ib(q3)", "ic(q3)"),
+ new PanelSpec(null, "w(rc1)", "w(rc2)")));
+ list.add(new WaveformTest("SmartSpice1", "SpiceSmart-1", "SpiceSmart-1{lay}", ".raw", true, -1, null,
+ new PanelSpec(null, "in", "out"),
+ new PanelSpec(null, "m:node3:node13#internal#source")));
+ list.add(new WaveformTest("SpiceOpus1", "SpiceOpus-1", "SpiceOpus-1{sch}", ".raw", true, -1, null,
+ new PanelSpec(null, "vin", "vout")));
+ list.add(new WaveformTest("SpiceOpus2", "SpiceOpus-2", "SpiceOpus-2{sch}", ".raw", true, -1, null,
+ new PanelSpec(null, "lind0#branch", "vout")));
+ list.add(new WaveformTest("SpiceOpus3", "SpiceOpus-3", "SpiceOpus-3{sch}", ".raw", true, -1, null,
+ new PanelSpec(null, "mm1#body", "mm1#dbody"),
+ new PanelSpec(null, "mm1#gate", "sweep"),
+ new PanelSpec(null, "vgnd#branch", "vds#branch")));
+ list.add(new WaveformTest("Verilog-1", "Verilog-1", "Verilog-1{sch}", ".dump", true, -1, null,
+ new PanelSpec(null, "test_bench.extest_"),
+ new PanelSpec(null, "test_bench.tdi_"),
+ new PanelSpec(null, "test_bench.instruction[0:7]_"),
+ new PanelSpec(null, "test_bench.j.tms_")));
+ return list;
+ }
+
+ public static String getOutputDirectory()
+ {
+ String rootPath = User.getRegressionPath();
+ if (rootPath == null) return null;
+ return rootPath + "/tools/Waveform/output/";
+ }
+
+ public static class PanelSpec implements Serializable
+ {
+ private String[] signalNames;
+ private String collectionName;
+
+ public PanelSpec(String colName, String sig1)
+ {
+ collectionName = colName;
+ signalNames = new String[] {sig1};
+ }
+
+ public PanelSpec(String colName, String sig1, String sig2)
+ {
+ collectionName = colName;
+ signalNames = new String[] {sig1, sig2};
+ }
+
+ public PanelSpec(String colName, String sig1, String sig2, String sig3)
+ {
+ collectionName = colName;
+ signalNames = new String[] {sig1, sig2, sig3};
+ }
+
+ public PanelSpec(String colName, String sig1, String sig2, String sig3, String sig4)
+ {
+ collectionName = colName;
+ signalNames = new String[] {sig1, sig2, sig3, sig4};
+ }
+ }
+
+ /**
+ * This is run in a change Job.
+ */
+ @Override
+ protected Collection<URL> getRequiredLibraries(String regressionPath)
+ {
+ if (Library.findLibrary(testName) != null) return super.getRequiredLibraries(regressionPath);
+
+ String trueRootPath = regressionPath;
+ String libPath = trueRootPath + "data/libs/";
+ String libFileName = libPath + testName + ".jelib";
+ URL libFileURL = TextUtils.makeURLToFile(libFileName);
+ return Collections.singleton(libFileURL);
+ }
+
+ /**
+ * Phase 1 is run in the actual Job after libraries are read.
+ */
+ protected boolean phase1()
+ {
+ if (engine == SimulationTool.ALS_ENGINE)
+ {
+ Library lib = Library.findLibrary(testName);
+ if (lib == null)
+ {
+ System.out.println("Error reading library '" + testName + "'");
+ return false;
+ }
+ Cell cell = lib.findNodeProto(cellName);
+ SimulationTool.startSimulation(engine, null, cell, null, true);
+ }
+ return true;
+ }
+
+ /**
+ * Phase 2 is run in the terminateOK phase of the Job.
+ */
+ protected boolean phase2()
+ {
+ String trueRootPath = workingDir();
+ String libPath = trueRootPath + "data/libs/";
+
+ User.setWaveformDigitalPanelHeight(100);
+ User.setWaveformAnalogPanelHeight(100);
+
+ Library lib = Library.findLibrary(testName);
+ if (lib == null)
+ {
+ System.out.println("Error reading library '" + testName + "'");
+ return false;
+ }
+ Cell cell = lib.findNodeProto(cellName);
+ if (engine == SimulationTool.ALS_ENGINE)
+ {
+ Cell nlCell = cell.otherView(View.NETLISTALS);
+ ALS.simulateNetlist(nlCell, cell, new Stimuli());
+ } else
+ {
+ // close all previous waveform windows
+ List<WindowFrame> openWWs = new ArrayList<WindowFrame>();
+ for (Iterator<WindowFrame> it = WindowFrame.getWindows(); it.hasNext();)
+ {
+ WindowFrame wf = it.next();
+ if (wf.getContent() instanceof WaveformWindow) openWWs.add(wf);
+ }
+ for (WindowFrame wf : openWWs)
+ wf.finished();
+
+ if (engine < 0)
+ {
+ // read the simulation output
+ String waveFile = libPath + testName + stimuliExtension;
+ URL url = TextUtils.makeURLToFile(waveFile);
+ String netDelimeter = SimulationTool.getSpiceExtractedNetDelimiter();
+ Stimuli stimuli = SimulationData.processInput(cell, url, netDelimeter);
+ WaveformWindow.showSimulationDataInNewWindow(stimuli);
+ } else
+ {
+ Job.getUserInterface().displayCell(cell);
+ String stimFile = null;
+ if (stimuliExtension != null) stimFile = libPath + testName + stimuliExtension;
+ SimulationTool.startSimulation(engine, stimFile, null, null, true);
+ }
+ }
+
+ // look for a waveform window
+ WindowFrame waveFrame = null;
+ for (Iterator<WindowFrame> it = WindowFrame.getWindows(); it.hasNext();)
+ {
+ WindowFrame wf = it.next();
+ if (wf.getContent() instanceof WaveformWindow)
+ {
+ waveFrame = wf;
+ break;
+ }
+ }
+ if (waveFrame == null)
+ {
+ System.out.println("ERROR: No waveform window was created");
+ return false;
+ }
+
+ // force waveform window to be a fixed size
+ WaveformWindow ww = (WaveformWindow)waveFrame.getContent();
+ Rectangle waveLoc = new Rectangle(20, 20, 1000, 500);
+ waveFrame.setWindowSize(waveLoc);
+
+ // remove all existing panels
+ ww.clearAllPanels();
+ if (!locked) ww.togglePanelXAxisLock();
+
+ // make the requested panels
+ panels = new Panel[panelSpecs.length];
+ for (int p = 0; p < panelSpecs.length; p++)
+ {
+ // find the SignalCollection that will be used in this panel
+ String collectionName = panelSpecs[p].collectionName;
+ SignalCollection sc = null;
+ for (Iterator<SignalCollection> it = ww.getSimData().getSignalCollections(); it.hasNext();)
+ {
+ SignalCollection oneSC = it.next();
+ if (collectionName == null || collectionName.equals(oneSC.getName()))
+ {
+ sc = oneSC;
+ break;
+ }
+ }
+ if (sc == null)
+ {
+ System.out.println("Could not find SignalCollection in waveform data");
+ return false;
+ }
+
+ // make the waveform window panel
+ Panel wp = ww.makeNewPanel(100);
+ panels[p] = wp;
+
+ // add signals to the panel
+ String[] signals = panelSpecs[p].signalNames;
+ for (int i = 0; i < signals.length; i++)
+ {
+ Signal<?> sig = sc.findSignal(signals[i]);
+ if (sig == null)
+ {
+ System.out.println("Could not find Signal '" + signals[i] + "' in waveform data");
+ return false;
+ }
+ if (sig != null) new WaveSignal(wp, sig);
+ }
+
+ // make the panel fill the screen
+ ww.fillScreen();
+ }
+
+ // run command file if requested
+ if (cmdFileExtension != null)
+ {
+ Engine e = ww.getSimData().getEngine();
+ String stimFile = libPath + testName + cmdFileExtension;
+ try
+ {
+ e.restoreStimuli(TextUtils.makeURLToFile(stimFile));
+ } catch (IOException ex)
+ {
+ ex.printStackTrace();
+ return false;
+ }
+
+ // make the panels fill the screen
+ ww.fillScreen();
+ }
+ return true;
+ }
+
+ /**
+ * Phase 3 is run in a new Swing thread.
+ */
+ protected boolean phase3()
+ {
+ String trueRootPath = workingDir();
+ String outputPath = trueRootPath + "output/";
+ String expectedPath = trueRootPath + "data/expected/";
+ String osPrefix = ClientOS.getOSPrefix();
+ if (osPrefix.equals("Win"))
+ {
+ double version = ClientOS.getOSVersion();
+ if (version == 7) osPrefix += "7"; else
+ if (version > 7) osPrefix += "8";
+ }
+
+ boolean passed = true;
+ try
+ {
+ for (int p = 0; p < panels.length; p++)
+ {
+ Panel wp = panels[p];
+
+ // dump the waveform panel data to disk and check it
+ char suffix = (char)('a' + p);
+ String testPanelName = testName + suffix;
+ String csvFileName = outputPath + testPanelName + ".csv";
+ PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(csvFileName)));
+ wp.dumpDataCSV(pw);
+ pw.close();
+ String expectedCSVFileName = expectedPath + testPanelName + ".csv";
+ boolean same = compareResults(csvFileName, expectedCSVFileName);
+ if (!same)
+ {
+ passed = false;
+ continue;
+ }
+
+ // now dump the waveform panel image to disk
+ String imageFileName = outputPath + testPanelName + ".png";
+ Image img = wp.getWaveImage();
+ int wid = img.getWidth(null);
+ int hei = img.getHeight(null);
+ int leftEdge = Math.max(0, wp.getVertAxisPos() - 10);
+ BufferedImage bi = new BufferedImage(wid - leftEdge, hei, BufferedImage.TYPE_INT_RGB);
+ Graphics2D g = bi.createGraphics();
+ g.drawImage(img, 0, 0, wid - leftEdge, hei, leftEdge, 0, wid, hei, null);
+ PNG.writeImage(bi, imageFileName);
+
+ // check the images
+ String expectedImageFileName = expectedPath + testPanelName + osPrefix + ".png";
+ same = compareImages(p + 1, imageFileName, expectedImageFileName);
+ if (!same)
+ {
+ passed = false;
+ continue;
+ }
+ }
+ } catch (Exception e)
+ {
+ System.out.println("Exception: " + e);
+ e.printStackTrace();
+ passed = false;
+ }
+ return passed;
+ }
+
+ public boolean runWaveformTestBatch()
+ {
+ String trueRootPath = workingDir();
+ String libPath = trueRootPath + "data/libs/";
+ String outputPath = trueRootPath + "output/";
+ String expectedPath = trueRootPath + "data/expected/";
+
+ boolean passed = true;
+ try
+ {
+ // setup test
+ ensureOutputDirectory(outputPath);
+ MessagesStream.getMessagesStream().save(outputPath + testName + ".log");
+
+ // read the test library
+ String libFileName = libPath + testName + ".jelib";
+ URL libFileURL = TextUtils.makeURLToFile(libFileName);
+ Library lib = Library.findLibrary(testName);
+ EditingPreferences ep = new EditingPreferences(true, TechPool.getThreadTechPool());
+ if (lib == null) lib = LibraryFiles.readLibrary(ep, libFileURL, null, FileType.JELIB, false);
+ if (lib == null)
+ {
+ System.out.println("WaveformTest.runWaveformTest can't open '" + libFileURL.getFile() + "'");
+ return false;
+ }
+
+ // read the simulation output
+ Cell cell = lib.findNodeProto(cellName);
+ String waveFile = libPath + testName + stimuliExtension;
+ URL url = TextUtils.makeURLToFile(waveFile);
+ String netDelimeter = SimulationTool.getFactorySpiceExtractedNetDelimiter();
+ Stimuli stimuli = SimulationData.processInput(cell, url, netDelimeter);
+
+ // make the requested panels
+ for (int p = 0; p < panelSpecs.length; p++)
+ {
+ // find the SignalCollection that will be used in this panel
+ String collectionName = panelSpecs[p].collectionName;
+ SignalCollection sc = null;
+ for (Iterator<SignalCollection> it = stimuli.getSignalCollections(); it.hasNext();)
+ {
+ SignalCollection oneSC = it.next();
+ if (collectionName == null || collectionName.equals(oneSC.getName()))
+ {
+ sc = oneSC;
+ break;
+ }
+ }
+ if (sc == null)
+ {
+ System.out.println("Could not find SignalCollection in waveform data");
+ return false;
+ }
+
+ // add signals to the panel
+ String[] signals = panelSpecs[p].signalNames;
+
+ // dump the waveform panel data to disk and check it
+ char suffix = (char)('a' + p);
+ String testPanelName = testName + suffix;
+ String csvFileName = outputPath + testPanelName + ".csv";
+ PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream(csvFileName)));
+ for (int k = 0; k < signals.length; k++)
+ {
+ Signal<?> as = sc.findSignal(signals[k]);
+ if (as == null)
+ {
+ System.out.println("Could not find Signal '" + signals[k] + "' in waveform data");
+ pw.close();
+ return false;
+ }
+ Signal.View<?> waveform = ((Signal<?>)as).getExactView();
+ int numEvents = waveform.getNumEvents();
+ for (int i = 0; i < numEvents; i++)
+ {
+ Sample samp = waveform.getSample(i);
+ double time = waveform.getTime(i);
+ if (samp instanceof SweptSample<?>)
+ {
+ SweptSample<?> sws = (SweptSample<?>)samp;
+ for (int s = 0; s < sws.getWidth(); s++)
+ {
+ Sample ss = sws.getSweep(s);
+ pw.println("\"" + time + "\",\"" + s + "\",\"" + ((ScalarSample)ss).getValue() + "\"");
+ }
+ } else
+ {
+ ScalarSample ss = (ScalarSample)samp;
+ pw.println("\"" + time + "\",\"" + ss.getValue() + "\"");
+ }
+ }
+ pw.println();
+ }
+ pw.close();
+ String expectedCSVFileName = expectedPath + testPanelName + ".csv";
+ boolean same = compareResults(csvFileName, expectedCSVFileName);
+ if (!same)
+ {
+ passed = false;
+ }
+ }
+ } catch (Exception e)
+ {
+ System.out.println("Exception: " + e);
+ e.printStackTrace();
+ passed = false;
+ }
+ return passed;
+ }
+}
diff --git a/com/sun/electric/tool/user/ui/ClickZoomWireListener.java b/com/sun/electric/tool/user/ui/ClickZoomWireListener.java
index 82660c6..2a016d9 100644
--- a/com/sun/electric/tool/user/ui/ClickZoomWireListener.java
+++ b/com/sun/electric/tool/user/ui/ClickZoomWireListener.java
@@ -4,7 +4,7 @@
*
* File: ClickDragZoomListener.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ui/CurveListener.java b/com/sun/electric/tool/user/ui/CurveListener.java
index f98b199..63adde1 100644
--- a/com/sun/electric/tool/user/ui/CurveListener.java
+++ b/com/sun/electric/tool/user/ui/CurveListener.java
@@ -4,7 +4,7 @@
*
* File: CurveListener.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ui/EditWindow.java b/com/sun/electric/tool/user/ui/EditWindow.java
index afe95ec..879f311 100644
--- a/com/sun/electric/tool/user/ui/EditWindow.java
+++ b/com/sun/electric/tool/user/ui/EditWindow.java
@@ -4,7 +4,7 @@
*
* File: EditWindow.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -3983,7 +3983,7 @@ for(Geometric g : examineThis) System.out.println(" "+g.describe(false));
if (getCell() == null) return null;
Rectangle2D cellBounds = ep.getRenderArea();
if (cellBounds == null) cellBounds = getBoundsInWindow();
- return getPrintImageFromData(ep, this, cellBounds, getCell(), getVarContext(), lv);
+ return getPrintImageFromData(ep, this, cellBounds, getCell(), getVarContext(), lv, false);
}
/**
@@ -3991,7 +3991,8 @@ for(Geometric g : examineThis) System.out.println(" "+g.describe(false));
* @param ep printable object.
* @return the image to print (null on error).
*/
- public static BufferedImage getPrintImageFromData(ElectricPrinter ep, EditWindow wnd, Rectangle2D cellBounds, Cell cell, VarContext vc, LayerVisibility lv)
+ public static BufferedImage getPrintImageFromData(ElectricPrinter ep, EditWindow wnd,
+ Rectangle2D cellBounds, Cell cell, VarContext vc, LayerVisibility lv, boolean isDisplay)
{
int scaleFactor = ep.getDesiredDPI() / 72;
if (scaleFactor > 2) scaleFactor = 2; else
@@ -4022,6 +4023,7 @@ for(Geometric g : examineThis) System.out.println(" "+g.describe(false));
ColorSupported cs = ps.getAttribute(ColorSupported.class);
int printMode = 1;
if (cs == null || cs.getValue() == 0) printMode = 2;
+ if (isDisplay) printMode = 0;
offscreen.setPrintingMode(printMode);
offscreen.setBackgroundColor(Color.WHITE);
// don't set User color here otherwise it generates an assertion in UserInterfaceMain.java:910
diff --git a/com/sun/electric/tool/user/ui/EditWindowFocusBrowser.java b/com/sun/electric/tool/user/ui/EditWindowFocusBrowser.java
index 7cea1ca..395fdfb 100644
--- a/com/sun/electric/tool/user/ui/EditWindowFocusBrowser.java
+++ b/com/sun/electric/tool/user/ui/EditWindowFocusBrowser.java
@@ -4,7 +4,7 @@
*
* File: EditWindowFocusBrowser.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ui/ElectricPrinter.java b/com/sun/electric/tool/user/ui/ElectricPrinter.java
index b57f45e..3bbaaf0 100644
--- a/com/sun/electric/tool/user/ui/ElectricPrinter.java
+++ b/com/sun/electric/tool/user/ui/ElectricPrinter.java
@@ -5,7 +5,7 @@
* File: ElectricPrinter.java
* Written by: Gilda Garreton
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ui/ErrorLoggerTree.java b/com/sun/electric/tool/user/ui/ErrorLoggerTree.java
index 8ed9632..7e576ec 100644
--- a/com/sun/electric/tool/user/ui/ErrorLoggerTree.java
+++ b/com/sun/electric/tool/user/ui/ErrorLoggerTree.java
@@ -4,7 +4,7 @@
*
* File: ErrorLoggerTree.java
*
- * Copyright (c) 2006, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2006, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -166,9 +166,9 @@ public class ErrorLoggerTree {
if (logger.getNumLogs() > 0) {
System.out.println("Type > and < to step through " + extraMsg + ", or open the ERRORS view in the explorer");
}
- if (logger.getNumErrors() > 0) {
+ if (logger.getNumErrors() > 0 && !logger.isPopupsDisabled()) {
JOptionPane.showMessageDialog(TopLevel.getCurrentJFrame(), msg,
- logger.getSystem() + " finished with Errors", JOptionPane.INFORMATION_MESSAGE);
+ logger.getSystem() + " finished with Errors", JOptionPane.INFORMATION_MESSAGE);
}
}
diff --git a/com/sun/electric/tool/user/ui/ExplorerTree.java b/com/sun/electric/tool/user/ui/ExplorerTree.java
index 6a97506..9c9bc39 100644
--- a/com/sun/electric/tool/user/ui/ExplorerTree.java
+++ b/com/sun/electric/tool/user/ui/ExplorerTree.java
@@ -4,7 +4,7 @@
*
* File: ExplorerTree.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -329,7 +329,7 @@ public class ExplorerTree extends JTree implements DragSourceListener // , DragG
* @param path
* @param node
* @param count
- * @return
+ * @return the number of children.
*/
private int countChildrenAndExpandInPath(Cell cell, TreeModel treeModel, TreePath path, Object node, int count)
{
diff --git a/com/sun/electric/tool/user/ui/ExplorerTreeModel.java b/com/sun/electric/tool/user/ui/ExplorerTreeModel.java
index 5bd41e5..3e74576 100644
--- a/com/sun/electric/tool/user/ui/ExplorerTreeModel.java
+++ b/com/sun/electric/tool/user/ui/ExplorerTreeModel.java
@@ -4,7 +4,7 @@
*
* File: ExplorerTreeModel.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ui/ExternalEditing.java b/com/sun/electric/tool/user/ui/ExternalEditing.java
index 159f8d3..38de40c 100644
--- a/com/sun/electric/tool/user/ui/ExternalEditing.java
+++ b/com/sun/electric/tool/user/ui/ExternalEditing.java
@@ -4,7 +4,7 @@
*
* File: ExternalEditing.java
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -169,11 +169,15 @@ public class ExternalEditing
// save the text cell to the temporary file
fileName = f.getPath();
String[] lines = cell.getTextViewContents();
+
try
{
PrintWriter printWriter = new PrintWriter(new BufferedWriter(new FileWriter(f)));
- for(int i=0; i<lines.length; i++)
- printWriter.println(lines[i]);
+ if (lines != null)
+ {
+ for(int i=0; i<lines.length; i++)
+ printWriter.println(lines[i]);
+ }
printWriter.close();
} catch (IOException e)
{
diff --git a/com/sun/electric/tool/user/ui/InvisibleLayerConfiguration.java b/com/sun/electric/tool/user/ui/InvisibleLayerConfiguration.java
index 3da6b5d..6ca4437 100644
--- a/com/sun/electric/tool/user/ui/InvisibleLayerConfiguration.java
+++ b/com/sun/electric/tool/user/ui/InvisibleLayerConfiguration.java
@@ -4,7 +4,7 @@
*
* File: InvisibleLayerConfiguration.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ui/JobTree.java b/com/sun/electric/tool/user/ui/JobTree.java
index 3157a4c..eac6ea6 100644
--- a/com/sun/electric/tool/user/ui/JobTree.java
+++ b/com/sun/electric/tool/user/ui/JobTree.java
@@ -4,7 +4,7 @@
*
* File: JobTree.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ui/KeyBindings.java b/com/sun/electric/tool/user/ui/KeyBindings.java
index 6a8d932..ba47ace 100644
--- a/com/sun/electric/tool/user/ui/KeyBindings.java
+++ b/com/sun/electric/tool/user/ui/KeyBindings.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: KeyBindings.java
- * Written by: Jonathan Gainsley, Sun Microsystems.
+ * Written by: Jonathan Gainsley.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ui/KeyStrokePair.java b/com/sun/electric/tool/user/ui/KeyStrokePair.java
index 9cc4549..cfdd184 100644
--- a/com/sun/electric/tool/user/ui/KeyStrokePair.java
+++ b/com/sun/electric/tool/user/ui/KeyStrokePair.java
@@ -4,7 +4,7 @@
*
* File: KeyStrokePair.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ui/LayerTab.java b/com/sun/electric/tool/user/ui/LayerTab.java
index de28050..11530c3 100644
--- a/com/sun/electric/tool/user/ui/LayerTab.java
+++ b/com/sun/electric/tool/user/ui/LayerTab.java
@@ -4,7 +4,7 @@
*
* File: LayerTab.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ui/LayerVisibility.java b/com/sun/electric/tool/user/ui/LayerVisibility.java
index b308033..8363efb 100644
--- a/com/sun/electric/tool/user/ui/LayerVisibility.java
+++ b/com/sun/electric/tool/user/ui/LayerVisibility.java
@@ -4,7 +4,7 @@
*
* File: LayerVisibility.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ui/LibraryPalette.java b/com/sun/electric/tool/user/ui/LibraryPalette.java
index 1d7a11b..f4279ab 100644
--- a/com/sun/electric/tool/user/ui/LibraryPalette.java
+++ b/com/sun/electric/tool/user/ui/LibraryPalette.java
@@ -4,7 +4,7 @@
*
* File: LibraryPalette.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ui/MeasureListener.java b/com/sun/electric/tool/user/ui/MeasureListener.java
index 4249148..d768942 100644
--- a/com/sun/electric/tool/user/ui/MeasureListener.java
+++ b/com/sun/electric/tool/user/ui/MeasureListener.java
@@ -4,7 +4,7 @@
*
* File: MeasureListener.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -23,10 +23,23 @@ package com.sun.electric.tool.user.ui;
import com.sun.electric.database.change.DatabaseChangeEvent;
import com.sun.electric.database.geometry.EPoint;
+import com.sun.electric.database.geometry.ERectangle;
+import com.sun.electric.database.geometry.Poly;
import com.sun.electric.database.geometry.ScreenPoint;
import com.sun.electric.database.hierarchy.Cell;
+import com.sun.electric.database.hierarchy.Nodable;
+import com.sun.electric.database.hierarchy.HierarchyEnumerator;
+import com.sun.electric.database.text.Name;
import com.sun.electric.database.text.TextUtils;
+import com.sun.electric.database.topology.ArcInst;
+import com.sun.electric.database.topology.Geometric;
+import com.sun.electric.database.topology.NodeInst;
+import com.sun.electric.database.variable.VarContext;
+import com.sun.electric.technology.ArcProto;
+import com.sun.electric.technology.PrimitiveNode;
import com.sun.electric.technology.Technology;
+import com.sun.electric.tool.extract.GeometrySearch;
+import com.sun.electric.tool.user.GraphicsPreferences;
import com.sun.electric.tool.user.Highlight;
import com.sun.electric.tool.user.Highlighter;
import com.sun.electric.tool.user.User;
@@ -34,6 +47,7 @@ import com.sun.electric.tool.user.waveform.Panel;
import com.sun.electric.tool.user.waveform.WaveformWindow;
import com.sun.electric.util.ClientOS;
import com.sun.electric.util.math.DBMath;
+import com.sun.electric.util.math.FixpTransform;
import java.awt.AWTException;
import java.awt.Point;
@@ -41,7 +55,9 @@ import java.awt.Robot;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseWheelEvent;
+import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
+import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
@@ -60,7 +76,6 @@ public class MeasureListener implements WindowFrame.ElectricEventListener
private static boolean measuring = false; // true if drawing measure line
private static List<Highlight> lastHighlights = new ArrayList<Highlight>();
private Point2D dbStart; // start of measure in database units
-// private static final boolean CADENCEMODE = false;
private MeasureListener() {}
@@ -74,13 +89,6 @@ public class MeasureListener implements WindowFrame.ElectricEventListener
return lastValidMeasuredDistanceY;
}
-// public static EDimension getLastMeasuredDistance()
-// {
-// EDimension dim = new EDimension(lastValidMeasuredDistanceX,
-// lastValidMeasuredDistanceY);
-// return dim;
-// }
-
private void startMeasure(Point2D dbStart)
{
lastValidMeasuredDistanceX = lastMeasuredDistanceX;
@@ -245,7 +253,7 @@ public class MeasureListener implements WindowFrame.ElectricEventListener
int newY = evt.getY();
EditWindow wnd = (EditWindow)evt.getSource();
Point2D dbMouse = wnd.screenToDatabase(newX, newY);
- EditWindow.gridAlign(dbMouse);
+ doGridding(wnd, evt, dbMouse);
if (isLeftMouse(evt))
{
if (measuring && ctrl && dbStart != null)
@@ -286,7 +294,7 @@ public class MeasureListener implements WindowFrame.ElectricEventListener
{
dbMouse = convertToOrthogonal(dbStart, dbMouse);
}
- EditWindow.gridAlign(dbMouse);
+ doGridding(wnd, evt, dbMouse);
dragOutMeasure(wnd, dbMouse);
}
}
@@ -299,29 +307,6 @@ public class MeasureListener implements WindowFrame.ElectricEventListener
mouseDragged(evt);
}
- private void gridMouse(MouseEvent evt)
- {
- // snap the cursor to the grid
- if (User.isGridAlignMeasurementCursor() && evt.getSource() instanceof EditWindow)
- {
- EditWindow wnd = (EditWindow)evt.getSource();
- long mouseX = evt.getX() + gridOffX;
- long mouseY = evt.getY() + gridOffY;
- Point2D dbMouse = wnd.screenToDatabase(mouseX, mouseY);
- Point2D align = new Point2D.Double(dbMouse.getX(), dbMouse.getY());
- EditWindow.gridAlign(align);
- ScreenPoint newPos = wnd.databaseToScreen(align);
- gridOffX = mouseX - newPos.getX();
- gridOffY = mouseY - newPos.getY();
- try {
- if (robot == null) robot = new Robot();
- } catch (AWTException e) {}
- Point newPosPt = new Point(newPos.getIntX(), newPos.getIntY());
- SwingUtilities.convertPointToScreen(newPosPt, wnd);
- if (robot != null) robot.mouseMove(newPosPt.x, newPosPt.y);
- }
- }
-
public void mouseClicked(MouseEvent evt) {}
public void mouseEntered(MouseEvent evt) {}
public void mouseExited(MouseEvent evt) {}
@@ -381,4 +366,238 @@ public class MeasureListener implements WindowFrame.ElectricEventListener
return new Point2D.Double(mousePoint.getX(), startPoint.getY());
}
+ /**
+ * Method to grid align the screen units of the mouse.
+ * @param evt
+ */
+ private void gridMouse(MouseEvent evt)
+ {
+ // snap the cursor to the grid
+ if (User.isGridAlignMeasurementCursor() && evt.getSource() instanceof EditWindow)
+ {
+ EditWindow wnd = (EditWindow)evt.getSource();
+ long mouseX = evt.getX() + gridOffX;
+ long mouseY = evt.getY() + gridOffY;
+ Point2D dbMouse = wnd.screenToDatabase(mouseX, mouseY);
+ Point2D align = new Point2D.Double(dbMouse.getX(), dbMouse.getY());
+ EditWindow.gridAlign(align);
+ ScreenPoint newPos = wnd.databaseToScreen(align);
+ gridOffX = mouseX - newPos.getX();
+ gridOffY = mouseY - newPos.getY();
+ try {
+ if (robot == null) robot = new Robot();
+ } catch (AWTException e) {}
+ Point newPosPt = new Point(newPos.getIntX(), newPos.getIntY());
+ SwingUtilities.convertPointToScreen(newPosPt, wnd);
+ if (robot != null) robot.mouseMove(newPosPt.x, newPosPt.y);
+ }
+ }
+
+ /**
+ * Method to grid align the database units of the mouse coordinates
+ * @param dbMouse the database units to align.
+ */
+ private void doGridding(EditWindow wnd, MouseEvent evt, Point2D dbMouse)
+ {
+ boolean shift = (evt.getModifiersEx() & MouseEvent.SHIFT_DOWN_MASK) != 0;
+ if (shift)
+ {
+ // snap to nearest geometry
+ if (wnd != null && wnd.getCell() != null)
+ {
+ Point2D snapDist = wnd.screenToDatabase(0, 15);
+ double snapDistance = Math.sqrt(snapDist.getX()*snapDist.getX() + snapDist.getY()*snapDist.getY());
+ GeometrySearch search = new GeometrySearch(wnd, snapDistance);
+ List<Line2D> possibleLines = new ArrayList<Line2D>();
+ List<Point2D> possiblePoints = new ArrayList<Point2D>();
+ search.searchGeometries(wnd.getCell(), dbMouse, possibleLines, possiblePoints);
+ Point2D closest = new Point2D.Double();
+ double closestDist = Double.MAX_VALUE;
+ for(Line2D line : possibleLines)
+ {
+ Point2D hitPoint = DBMath.closestPointToSegment(line.getP1(), line.getP2(), dbMouse);
+ if (hitPoint == null) continue;
+ double dist = hitPoint.distance(dbMouse);
+ if (dist < closestDist)
+ {
+ closestDist = dist;
+ closest = hitPoint;
+ }
+ }
+ for(Point2D point : possiblePoints)
+ {
+ double dist = point.distance(dbMouse) / 2;
+ if (dist < closestDist)
+ {
+ closestDist = dist;
+ closest = point;
+ }
+ }
+ if (closestDist < snapDistance)
+ {
+ dbMouse.setLocation(closest);
+ return;
+ }
+ }
+ }
+ EditWindow.gridAlign(dbMouse);
+ }
+
+ /**
+ * Class to search hierarchically near a point and return all visible rectangles found.
+ */
+ public class GeometrySearch extends HierarchyEnumerator.Visitor
+ {
+ private double searchDist;
+ private List<Line2D> closeLines;
+ private List<Point2D> closePoints;
+ private ERectangle geomBBnd;
+ private final LayerVisibility lv;
+
+ public GeometrySearch(EditWindow wnd, double snapDistance)
+ {
+ lv = wnd.getLayerVisibility();
+ searchDist = snapDistance;
+ }
+
+ /**
+ * Find a Primitive Node or Arc at a point in a cell. The geometric found may exist down
+ * the hierarchy from the given cell.
+ * @param cell the cell in which the point resides
+ * @param point a point to search under
+ * @param lines a List of lines that are in the vicinity
+ * @param points a List of points that are in the vicinity
+ */
+ public void searchGeometries(Cell cell, Point2D point, List<Line2D> lines, List<Point2D> points)
+ {
+ closeLines = lines;
+ closePoints = points;
+ geomBBnd = ERectangle.fromLambda(point.getX()-searchDist, point.getY()-searchDist, searchDist*2, searchDist*2);
+ HierarchyEnumerator.enumerateCell(cell, VarContext.globalContext, this);
+ }
+
+ public boolean enterCell(HierarchyEnumerator.CellInfo info)
+ {
+ Cell cell = info.getCell();
+ FixpTransform xformToRoot = info.getTransformToRoot();
+ FixpTransform xformFromRoot = null;
+ try
+ {
+ xformFromRoot = xformToRoot.createInverse();
+ } catch (Exception e) { e.printStackTrace(); }
+ assert(xformFromRoot != null);
+ Rectangle2D rect = new Rectangle2D.Double();
+ rect.setRect(geomBBnd);
+ DBMath.transformRect(rect, xformFromRoot);
+
+ boolean continueDown = false;
+ for(Iterator<Geometric> it = cell.searchIterator(rect, true); it.hasNext(); )
+ {
+ Geometric geom = it.next();
+ if (geom instanceof NodeInst)
+ {
+ NodeInst oNi = (NodeInst)geom;
+ if (oNi.isCellInstance())
+ {
+ if (!oNi.getNodeInst().isExpanded())
+ {
+ // instance not expanded: check bounds
+ Rectangle2D rectDst = new Rectangle2D.Double();
+ xformToRoot.transform(geom.getBounds(), rectDst);
+ addRect(rectDst);
+ } else
+ {
+ // instance is expanded, keep searching
+ continueDown = true;
+ }
+ } else
+ {
+ // primitive found, check all polygons
+ Poly [] polys = oNi.getProto().getTechnology().getShapeOfNode(oNi);
+ for(int box=0; box<polys.length; box++)
+ {
+ Poly poly = polys[box];
+ if (!lv.isVisible(poly.getLayer())) continue;
+ poly.transform(oNi.rotateOut());
+ double dist = poly.polyDistance(rect);
+ if (dist <= searchDist)
+ addPoly(poly, xformToRoot);
+ }
+ }
+ } else
+ {
+ // arc, ignore arcs that and fully invisible
+ ArcInst ai = (ArcInst)geom;
+ Poly [] polys = ai.getProto().getTechnology().getShapeOfArc(ai);
+ for(int box=0; box<polys.length; box++)
+ {
+ Poly poly = polys[box];
+ if (!lv.isVisible(poly.getLayer())) continue;
+ double dist = poly.polyDistance(rect);
+ if (dist <= searchDist)
+ addPoly(poly, xformToRoot);
+ }
+ }
+ }
+ return continueDown;
+ }
+
+ private void addPoly(Poly poly, FixpTransform xformToRoot)
+ {
+ poly.transform(xformToRoot);
+ Point2D[] pts = poly.getPoints();
+ if (pts == null)
+ {
+ // just a rectangle
+ addRect(poly.getBounds2D());
+ return;
+ }
+
+ if (poly.getStyle() == Poly.Type.OPENED || poly.getStyle() == Poly.Type.OPENEDT1 ||
+ poly.getStyle() == Poly.Type.OPENEDT2 || poly.getStyle() == Poly.Type.OPENEDT3)
+ {
+ for (int i = 1; i < pts.length; i++)
+ closeLines.add(new Line2D.Double(pts[i-1], pts[i]));
+ for (int i = 0; i < pts.length; i++)
+ closePoints.add(pts[i]);
+ return;
+ }
+
+ // filled polygon
+ for (int i = 0; i < pts.length; i++)
+ {
+ closePoints.add(pts[i]);
+ Point2D lastPt = (i == 0 ? pts[pts.length-1] : pts[i-1]);
+ closeLines.add(new Line2D.Double(lastPt, pts[i]));
+ }
+ }
+
+ private void addRect(Rectangle2D rect)
+ {
+ Point2D p1 = new Point2D.Double(rect.getMinX(), rect.getMinY());
+ Point2D p2 = new Point2D.Double(rect.getMinX(), rect.getMaxY());
+ Point2D p3 = new Point2D.Double(rect.getMaxX(), rect.getMaxY());
+ Point2D p4 = new Point2D.Double(rect.getMaxX(), rect.getMinY());
+ Line2D l1 = new Line2D.Double(p1, p2);
+ Line2D l2 = new Line2D.Double(p2, p3);
+ Line2D l3 = new Line2D.Double(p3, p4);
+ Line2D l4 = new Line2D.Double(p4, p1);
+ closeLines.add(l1);
+ closeLines.add(l2);
+ closeLines.add(l3);
+ closeLines.add(l4);
+ closePoints.add(p1);
+ closePoints.add(p2);
+ closePoints.add(p3);
+ closePoints.add(p4);
+ }
+
+ public void exitCell(HierarchyEnumerator.CellInfo info) {}
+
+ public boolean visitNodeInst(Nodable no, HierarchyEnumerator.CellInfo info)
+ {
+ if (!no.getNodeInst().isExpanded()) return false;
+ return true;
+ }
+ }
}
diff --git a/com/sun/electric/tool/user/ui/MessagesWindow.java b/com/sun/electric/tool/user/ui/MessagesWindow.java
index 4b596a3..47e1f29 100644
--- a/com/sun/electric/tool/user/ui/MessagesWindow.java
+++ b/com/sun/electric/tool/user/ui/MessagesWindow.java
@@ -4,7 +4,7 @@
*
* File: MessagesWindow.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ui/OutlineListener.java b/com/sun/electric/tool/user/ui/OutlineListener.java
index cc7636f..ed97894 100644
--- a/com/sun/electric/tool/user/ui/OutlineListener.java
+++ b/com/sun/electric/tool/user/ui/OutlineListener.java
@@ -4,7 +4,7 @@
*
* File: OutlineListener.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ui/PaletteFrame.java b/com/sun/electric/tool/user/ui/PaletteFrame.java
index 54f673d..ef9c2e8 100644
--- a/com/sun/electric/tool/user/ui/PaletteFrame.java
+++ b/com/sun/electric/tool/user/ui/PaletteFrame.java
@@ -4,7 +4,7 @@
*
* File: PaletteFrame.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ui/RoutingDebug.java b/com/sun/electric/tool/user/ui/RoutingDebug.java
index 20546d6..3ef69c9 100644
--- a/com/sun/electric/tool/user/ui/RoutingDebug.java
+++ b/com/sun/electric/tool/user/ui/RoutingDebug.java
@@ -4,7 +4,7 @@
*
* File: RoutingDebug.java
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -21,14 +21,17 @@
*/
package com.sun.electric.tool.user.ui;
+import com.sun.electric.database.EditingPreferences;
import com.sun.electric.database.geometry.EPoint;
import com.sun.electric.database.geometry.ERectangle;
+import com.sun.electric.database.geometry.Poly;
import com.sun.electric.database.geometry.PolyBase;
import com.sun.electric.database.geometry.PolyBase.Point;
import com.sun.electric.database.hierarchy.Cell;
import com.sun.electric.database.text.TextUtils;
import com.sun.electric.database.topology.ArcInst;
import com.sun.electric.database.topology.PortInst;
+import com.sun.electric.database.topology.SteinerTree.SteinerTreePortPair;
import com.sun.electric.technology.ArcProto;
import com.sun.electric.technology.Layer;
import com.sun.electric.technology.Technology;
@@ -44,6 +47,9 @@ import com.sun.electric.tool.routing.seaOfGates.SeaOfGatesEngine.GRNet;
import com.sun.electric.tool.routing.seaOfGates.SeaOfGatesEngine.GRWire;
import com.sun.electric.tool.routing.seaOfGates.SeaOfGatesEngine.GlobalRouter;
import com.sun.electric.tool.routing.seaOfGates.SeaOfGatesEngine.NeededRoute;
+import com.sun.electric.tool.routing.seaOfGates.SeaOfGatesEngine.PossibleEndpoint;
+import com.sun.electric.tool.routing.seaOfGates.SeaOfGatesEngine.PossibleEndpoints;
+import com.sun.electric.tool.routing.seaOfGates.SeaOfGatesEngine.RoutesOnNetwork;
import com.sun.electric.tool.routing.seaOfGates.SeaOfGatesEngine.SOGBound;
import com.sun.electric.tool.routing.seaOfGates.SeaOfGatesEngine.SOGPoly;
import com.sun.electric.tool.routing.seaOfGates.SeaOfGatesEngine.SearchVertex;
@@ -51,7 +57,6 @@ import com.sun.electric.tool.routing.seaOfGates.SeaOfGatesEngine.Wavefront;
import com.sun.electric.tool.routing.seaOfGates.SeaOfGatesEngineFactory;
import com.sun.electric.tool.routing.seaOfGates.SeaOfGatesEngineFactory.SeaOfGatesEngineType;
import com.sun.electric.tool.routing.seaOfGates.SeaOfGatesHandlers;
-import com.sun.electric.tool.routing.seaOfGates.SeaOfGatesHandlers.Save;
import com.sun.electric.tool.user.Highlight;
import com.sun.electric.tool.user.Highlighter;
import com.sun.electric.tool.user.User;
@@ -62,12 +67,14 @@ import com.sun.electric.tool.user.ui.ToolBar.CursorMode;
import com.sun.electric.util.math.MutableInteger;
import java.awt.Color;
+import java.awt.Component;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
+import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
@@ -81,14 +88,17 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
+import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
+import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
+import javax.swing.KeyStroke;
import javax.swing.UIManager;
/**
@@ -98,6 +108,7 @@ public class RoutingDebug
{
private static final double goalWidth = 0.005;
private static final double layerOffset = 0.04;
+ private static final double possibleGoalOffset = 3;
private static RoutingDialog debugDialog = null;
private static Set<SearchVertex> onPath = new HashSet<SearchVertex>();
@@ -110,7 +121,7 @@ public class RoutingDebug
private static Map<Integer,String> netNames;
private static int colorAssigned;
private static DebugType debuggingType;
- private static enum DebugType {NONE, DISPLAYROUTING, REWIRENETS, RUNGLOBALROUTING};
+ private static enum DebugType {NONE, DISPLAYROUTING, REWIRENETS, SHOWSPINES, RUNGLOBALROUTING};
private static Color[] allColors = new Color[] {
new Color(65535>>8, 16385>>8, 16385>>8), // Red
@@ -230,8 +241,8 @@ public class RoutingDebug
Point2D p2 = new Point2D.Double(nr.getBX(), nr.getBY());
highlighter.addLine(p1, p2, cell, true, Color.GREEN, false);
- // show goal
- debugDialog.showPathToGoal(result, cell, highlighter);
+ // show goal(s)
+ debugDialog.showPathToGoal(nr, result, cell, highlighter);
// remember path to goal
onPath.clear();
@@ -586,23 +597,186 @@ public class RoutingDebug
/************************************* REWIRE NETWORKS *************************************/
+ private static List<RoutesOnNetwork> allSpineRoutes = null;
+
+ private static void showSpines()
+ {
+ EditWindow wnd = EditWindow.getCurrent();
+ Cell cell = wnd.getCell();
+ if (cell == null) return;
+ highlighter = wnd.getRulerHighlighter();
+ allSpineRoutes = null;
+ String routeName = debugDialog.whichOne.getText().trim();
+ if (routeName.length() == 0)
+ {
+ Job.getUserInterface().showErrorMessage("Must set name of route first in 'Route to Debug' field.", "Missing Information");
+ return;
+ }
+ new ShowSpineNets(cell, routeName);
+ }
+
+ public static class ShowSpineNets extends Job
+ {
+ private Cell cell;
+ private EditingPreferences ep;
+ private String routeName;
+
+ public ShowSpineNets(Cell c, String rn)
+ {
+ super("Show Spines", User.getUserTool(), Job.Type.CHANGE, null, null, Job.Priority.USER);
+ cell = c;
+ routeName = rn;
+ ep = UserInterfaceMain.getEditingPreferences();
+ startJob();
+ }
+
+ public boolean doIt() throws JobException
+ {
+ debuggingType = DebugType.SHOWSPINES;
+ debugDialog.router = SeaOfGatesEngineFactory.createSeaOfGatesEngine(SeaOfGatesEngineType.defaultVersion);
+ SeaOfGatesOptions prefs = new SeaOfGatesOptions();
+ prefs.getOptionsFromPreferences(false);
+ debugDialog.router.setPrefs(prefs);
+ debugDialog.svInfo = new HashMap<SearchVertex,SVState>();
+ netNames = new HashMap<Integer,String>();
+ svOrder = 1;
+
+ Job job = Job.getRunningJob();
+ debugDialog.router.routeIt(SeaOfGatesHandlers.getDefault(cell, debugDialog.router.getPrefs().resultCellName,
+ debugDialog.router.getPrefs().contactPlacementAction, job, ep), cell, false, null);
+ return true;
+ }
+
+ private static final int TAPSIZE = 8;
+ private static final int TAPOFFSET = 25;
+
+ @Override
+ public void terminateOK()
+ {
+ EditWindow wnd = EditWindow.getCurrent();
+ Highlighter h = wnd.getRulerHighlighter();
+ h.clear();
+ for(RoutesOnNetwork ron : allSpineRoutes)
+ {
+ if (!ron.getName().equals(routeName)) continue;
+
+ List<SteinerTreePortPair> pairs = ron.getPairs();
+ for(SteinerTreePortPair pair : pairs)
+ {
+ List<PortInst> taps = pair.getSpineTaps();
+ double fX = pair.getPort1().getCenter().getX(), fY = pair.getPort1().getCenter().getY();
+ double tX = pair.getPort2().getCenter().getX(), tY = pair.getPort2().getCenter().getY();
+ boolean hor = Math.abs(fX-tX) > Math.abs(fY-tY);
+ double offX = 0, offY = 0;
+ if (hor)
+ {
+ offY = TAPOFFSET;
+ fY = tY = Math.max(fY, tY);
+ } else
+ {
+ offX = -TAPOFFSET;
+ fX = tX = Math.min(fX, tX);
+ }
+
+ Color col = taps == null ? Color.GREEN : Color.RED;
+
+ h.addLine(EPoint.fromLambda(fX+offX, fY+offY), EPoint.fromLambda(tX+offX, tY+offY), cell, true, col, false);
+
+ // show the end points
+ Poly poly = new Poly(new Rectangle2D.Double(pair.getPort1().getCenter().getX()-TAPSIZE, pair.getPort1().getCenter().getY()-TAPSIZE, TAPSIZE*2, TAPSIZE*2));
+ poly.setStyle(Poly.Type.FILLED);
+ h.addPoly(poly, cell, Color.RED);
+ h.addLine(EPoint.fromLambda(fX+offX, fY+offY), pair.getPort1().getCenter(), cell, true, col, false);
+
+ poly = new Poly(new Rectangle2D.Double(pair.getPort2().getCenter().getX()-TAPSIZE, pair.getPort2().getCenter().getY()-TAPSIZE, TAPSIZE*2, TAPSIZE*2));
+ poly.setStyle(Poly.Type.FILLED);
+ h.addPoly(poly, cell, Color.RED);
+ h.addLine(EPoint.fromLambda(tX+offX, tY+offY), pair.getPort2().getCenter(), cell, true, col, false);
+
+ if (taps == null) continue;
+ for(PortInst pi : taps)
+ {
+ EPoint pt = pi.getCenter();
+ poly = new Poly(new Rectangle2D.Double(pt.getX()-TAPSIZE, pt.getY()-TAPSIZE, TAPSIZE*2, TAPSIZE*2));
+ poly.setStyle(Poly.Type.FILLED);
+ h.addPoly(poly, cell, Color.RED);
+ if (hor)
+ {
+ h.addLine(EPoint.fromLambda(pt.getX(), pt.getY()), EPoint.fromLambda(pt.getX(), tY+offY), cell, true, col, false);
+ } else
+ {
+ h.addLine(EPoint.fromLambda(pt.getX(), pt.getY()), EPoint.fromLambda(tX+offX, pt.getY()), cell, true, col, false);
+ }
+ }
+ }
+ }
+ h.finished();
+ wnd.repaint();
+ }
+ }
+
+ public static void showSpineNetworks(List<RoutesOnNetwork> allRoutes)
+ {
+ allSpineRoutes = allRoutes;
+ }
+
+ /**
+ * Method to tell whether networks are being rewired for least-distance.
+ * @return true if networks are being rewired for least-distance.
+ */
+ public static boolean isShowingSpines() { return debugDialog != null && debuggingType == DebugType.SHOWSPINES; }
+
+
+ /************************************* REWIRE NETWORKS *************************************/
+
private static void rewireNets()
{
EditWindow wnd = EditWindow.getCurrent();
Cell cell = wnd.getCell();
- if (cell == null) return;
-
- // get list of selected nets
- List<ArcInst> selected = new ArrayList<ArcInst>();
- for(Iterator<ArcInst> it = cell.getArcs(); it.hasNext(); )
+ if (cell == null) return;
+ highlighter = wnd.getRulerHighlighter();
+ new RewireNets(cell);
+ }
+
+ public static class RewireNets extends Job
+ {
+ private Cell cell;
+ private EditingPreferences ep;
+
+ public RewireNets(Cell c)
{
- ArcInst ai = it.next();
- if (ai.getProto() == Generic.tech().unrouted_arc) selected.add(ai);
+ super("Rewire Networks", User.getUserTool(), Job.Type.CHANGE, null, null, Job.Priority.USER);
+ cell = c;
+ ep = UserInterfaceMain.getEditingPreferences();
+ startJob();
}
- if (selected.isEmpty()) return;
- debuggingType = DebugType.REWIRENETS;
- SeaOfGatesHandlers.startInJob(cell, selected, SeaOfGatesEngineType.defaultVersion, Save.SAVE_PERIODIC);
+ public boolean doIt() throws JobException
+ {
+ // get list of selected nets
+ List<ArcInst> selected = new ArrayList<ArcInst>();
+ for(Iterator<ArcInst> it = cell.getArcs(); it.hasNext(); )
+ {
+ ArcInst ai = it.next();
+ if (ai.getProto() == Generic.tech().unrouted_arc) selected.add(ai);
+ }
+ if (selected.isEmpty()) return true;
+
+ debuggingType = DebugType.REWIRENETS;
+ endADebug = true;
+ debugDialog.router = SeaOfGatesEngineFactory.createSeaOfGatesEngine(SeaOfGatesEngineType.defaultVersion);
+ SeaOfGatesOptions prefs = new SeaOfGatesOptions();
+ prefs.getOptionsFromPreferences(false);
+ debugDialog.router.setPrefs(prefs);
+ debugDialog.svInfo = new HashMap<SearchVertex,SVState>();
+ netNames = new HashMap<Integer,String>();
+ svOrder = 1;
+
+ Job job = Job.getRunningJob();
+ debugDialog.router.routeIt(SeaOfGatesHandlers.getDefault(cell, debugDialog.router.getPrefs().resultCellName,
+ debugDialog.router.getPrefs().contactPlacementAction, job, ep), cell, false, selected);
+ return true;
+ }
}
/**
@@ -642,6 +816,16 @@ public class RoutingDebug
public RoutingDialog()
{
super(TopLevel.getCurrentJFrame());
+
+ // detect space key
+ final String SPACE_KEY = "space-key";
+ KeyStroke space = KeyStroke.getKeyStroke(KeyEvent.VK_SPACE, 0);
+ getRootPane().getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(space, SPACE_KEY);
+ getRootPane().getActionMap().put(SPACE_KEY, new AbstractAction()
+ {
+ public void actionPerformed(ActionEvent event) { spacePressed(); }
+ });
+
seeSV = new SearchVertex[6];
currentSV = null;
tech = Technology.getCurrent();
@@ -766,6 +950,7 @@ public class RoutingDebug
doGlobalRouting.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { doGlobalRouting(); } });
gbc = new GridBagConstraints();
gbc.gridx = 0; gbc.gridy = yPos;
+ gbc.weightx = 0.3;
gbc.insets = new Insets(4, 4, 4, 4);
getContentPane().add(doGlobalRouting, gbc);
@@ -773,10 +958,18 @@ public class RoutingDebug
rewire.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { rewireNets(); } });
gbc = new GridBagConstraints();
gbc.gridx = 1; gbc.gridy = yPos;
- gbc.weightx = 0.5;
+ gbc.weightx = 0.3;
gbc.insets = new Insets(4, 4, 4, 4);
getContentPane().add(rewire, gbc);
+ JButton showSpines = new JButton("Show Spines");
+ showSpines.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent evt) { showSpines(); } });
+ gbc = new GridBagConstraints();
+ gbc.gridx = 2; gbc.gridy = yPos;
+ gbc.weightx = 0.3;
+ gbc.insets = new Insets(4, 4, 4, 4);
+ getContentPane().add(showSpines, gbc);
+
yPos++;
JPanel grPanel = new JPanel();
@@ -927,7 +1120,7 @@ public class RoutingDebug
dirData[i].setEditable(false);
dirData[i].setCursor(null);
dirData[i].setOpaque(false);
- dirData[i].setFocusable(false);
+ dirData[i].setFocusable(true);
dirData[i].setLineWrap(true);
dirData[i].setFont(UIManager.getFont("Label.font"));
gbc = new GridBagConstraints();
@@ -1013,6 +1206,7 @@ public class RoutingDebug
SeaOfGatesCell.showGrid(wnd, h, coords, hor, wnd.getScale(), -1);
}
h.finished();
+ wnd.repaint();
}
/**
@@ -1109,7 +1303,7 @@ public class RoutingDebug
currentSV = sv;
SVState svs = svInfo.get(sv);
svs.setBackgroundColor(Color.WHITE, h);
-
+
for(int i=0; i<6; i++)
{
dirData[i].setText("");
@@ -1200,6 +1394,75 @@ public class RoutingDebug
protected void escapePressed() { endDebugging(); }
+ /**
+ * Method to respond when the space key is pressed.
+ * Finds highlighted text and shows those coordinates.
+ */
+ protected void spacePressed()
+ {
+ Component comp = getFocusOwner();
+ if (!(comp instanceof JTextArea)) return;
+ JTextArea ta = (JTextArea)comp;
+ int start = ta.getSelectionStart();
+ int end = ta.getSelectionEnd();
+ String addr = ta.getText().substring(start, end).toLowerCase();
+
+ // parse coordinate
+ int commaPos = addr.indexOf(',');
+ if (commaPos >= 0)
+ {
+ double x = TextUtils.atofDistance(addr.substring(0, commaPos));
+ double y = TextUtils.atofDistance(addr.substring(commaPos+1));
+ Point2D p1 = new Point2D.Double(x-5, y-5);
+ Point2D p2 = new Point2D.Double(x-5, y+5);
+ Point2D p3 = new Point2D.Double(x+5, y+5);
+ Point2D p4 = new Point2D.Double(x+5, y-5);
+
+ EditWindow wnd = EditWindow.getCurrent();
+ Cell cell = wnd.getCell();
+ Highlighter h = wnd.getHighlighter();
+ h.clear();
+ h.addLine(p1, p3, cell, true, Color.RED, true);
+ h.addLine(p2, p4, cell, true, Color.RED, true);
+ h.finished();
+ wnd.repaint();
+ return;
+ }
+
+ // parse rectangle
+ int andPos = addr.indexOf(" and ");
+ int xPos = addr.indexOf("<=x<=");
+ int yPos = addr.indexOf("<=y<=");
+ if (andPos >= 0 && xPos >= 0 && yPos >= 0)
+ {
+ double lX = TextUtils.atofDistance(addr.substring(0, xPos));
+ double hX = TextUtils.atofDistance(addr.substring(xPos+5, andPos));
+ double lY = TextUtils.atofDistance(addr.substring(andPos+5, yPos));
+ double hY = TextUtils.atofDistance(addr.substring(yPos+5));
+ Point2D p1 = new Point2D.Double(lX, lY);
+ Point2D p2 = new Point2D.Double(lX, hY);
+ Point2D p3 = new Point2D.Double(hX, hY);
+ Point2D p4 = new Point2D.Double(hX, lY);
+
+ EditWindow wnd = EditWindow.getCurrent();
+ Cell cell = wnd.getCell();
+ Highlighter h = wnd.getHighlighter();
+ h.clear();
+ h.addLine(p1, p2, cell, true, Color.RED, true);
+ h.addLine(p2, p3, cell, true, Color.RED, true);
+ h.addLine(p3, p4, cell, true, Color.RED, true);
+ h.addLine(p4, p1, cell, true, Color.RED, true);
+ h.addLine(p1, p3, cell, true, Color.RED, true);
+ h.addLine(p2, p4, cell, true, Color.RED, true);
+ h.finished();
+ wnd.repaint();
+ return;
+ }
+
+ // don't know how to parse
+ Job.getUserInterface().showInformationMessage("CANNOT PARSE: "+addr, "SELECTION ERROR");
+ }
+
private void showGlobalRoutingGrid()
{
// show grid lines around buckets
@@ -1256,12 +1519,12 @@ public class RoutingDebug
if (w.getPathBucket(i-1).getBounds().getCenterX() == x)
{
if (w.getPathBucket(i-1) == n1) x = p1.getX();
- if (w.getPathBucket(i-1) == n2) x = p2.getX();
+ if (w.getPathBucket(i-1) == n2) x = p2.getX();
}
if (w.getPathBucket(i-1).getBounds().getCenterY() == y)
{
if (w.getPathBucket(i-1) == n1) y = p1.getY();
- if (w.getPathBucket(i-1) == n2) y = p2.getY();
+ if (w.getPathBucket(i-1) == n2) y = p2.getY();
}
}
if (i < w.getNumPathElements()-1)
@@ -1269,12 +1532,12 @@ public class RoutingDebug
if (w.getPathBucket(i+1).getBounds().getCenterX() == x)
{
if (w.getPathBucket(i+1) == n1) x = p1.getX();
- if (w.getPathBucket(i+1) == n2) x = p2.getX();
+ if (w.getPathBucket(i+1) == n2) x = p2.getX();
}
if (w.getPathBucket(i+1).getBounds().getCenterY() == y)
{
if (w.getPathBucket(i+1) == n1) y = p1.getY();
- if (w.getPathBucket(i+1) == n2) y = p2.getY();
+ if (w.getPathBucket(i+1) == n2) y = p2.getY();
}
}
for(;;)
@@ -1317,8 +1580,9 @@ public class RoutingDebug
* @param cell the Cell in which routing happened.
* @param h the Highlighter for showing the result.
*/
- private void showPathToGoal(SearchVertex result, Cell cell, Highlighter h)
+ private void showPathToGoal(NeededRoute nr, SearchVertex result, Cell cell, Highlighter h)
{
+ EPoint goalCoord = null;
if (result == SeaOfGatesEngine.svAborted)
{
routeResult.setText("Result: Aborted by user");
@@ -1333,6 +1597,7 @@ public class RoutingDebug
routeResult.setText("Result: Success!");
SVState svs = ensureDebuggingShadow(result, false);
svs.changeLabel("!!GOAL!!", h);
+ goalCoord = EPoint.fromLambda(result.getX(), result.getY());
for(;;)
{
SearchVertex svLast = result.getLast();
@@ -1344,9 +1609,9 @@ public class RoutingDebug
double lowOff = lowZ * layerOffset;
double highOff = highZ * layerOffset;
h.addLine(EPoint.fromLambda(result.getX()+lowOff, result.getY()+lowOff+goalWidth),
- EPoint.fromLambda(result.getX()+highOff-goalWidth, result.getY()+highOff), cell, true, Color.WHITE, false);
+ EPoint.fromLambda(result.getX()+highOff-goalWidth, result.getY()+highOff), cell, true, Color.WHITE, false);
h.addLine(EPoint.fromLambda(result.getX()+lowOff+goalWidth, result.getY()+lowOff),
- EPoint.fromLambda(result.getX()+highOff, result.getY()+highOff-goalWidth), cell, true, Color.WHITE, false);
+ EPoint.fromLambda(result.getX()+highOff, result.getY()+highOff-goalWidth), cell, true, Color.WHITE, false);
} else
{
double off = result.getZ() * layerOffset;
@@ -1354,21 +1619,32 @@ public class RoutingDebug
{
// horizontal line
h.addLine(EPoint.fromLambda(result.getX()+off, result.getY()+off-goalWidth),
- EPoint.fromLambda(svLast.getX()+off, svLast.getY()+off-goalWidth), cell, true, Color.WHITE, false);
+ EPoint.fromLambda(svLast.getX()+off, svLast.getY()+off-goalWidth), cell, true, Color.WHITE, false);
h.addLine(EPoint.fromLambda(result.getX()+off, result.getY()+off+goalWidth),
- EPoint.fromLambda(svLast.getX()+off, svLast.getY()+off+goalWidth), cell, true, Color.WHITE, false);
+ EPoint.fromLambda(svLast.getX()+off, svLast.getY()+off+goalWidth), cell, true, Color.WHITE, false);
} else
{
// vertical line
h.addLine(EPoint.fromLambda(result.getX()+off-goalWidth, result.getY()+off),
- EPoint.fromLambda(svLast.getX()+off-goalWidth, svLast.getY()+off), cell, true, Color.WHITE, false);
+ EPoint.fromLambda(svLast.getX()+off-goalWidth, svLast.getY()+off), cell, true, Color.WHITE, false);
h.addLine(EPoint.fromLambda(result.getX()+off+goalWidth, result.getY()+off),
- EPoint.fromLambda(svLast.getX()+off+goalWidth, svLast.getY()+off), cell, true, Color.WHITE, false);
+ EPoint.fromLambda(svLast.getX()+off+goalWidth, svLast.getY()+off), cell, true, Color.WHITE, false);
}
}
result = svLast;
}
}
+
+ // show the possible endpoints
+ PossibleEndpoints endChoices = endADebug ? nr.getBPossibleEndpoints() : nr.getAPossibleEndpoints();
+ for(PossibleEndpoint pe : endChoices.getEndpoints())
+ {
+ EPoint pt = pe.getCoord();
+ if (goalCoord != null && pt.getX() == goalCoord.getX() && pt.getY() == goalCoord.getY()) continue;
+ EPoint ptOff = EPoint.fromLambda(pt.getX() + possibleGoalOffset, pt.getY() + possibleGoalOffset);
+ h.addLine(EPoint.fromLambda(ptOff.getX(), ptOff.getY()), EPoint.fromLambda(pt.getX(), pt.getY()), cell, true, Color.BLACK, false);
+ h.addMessage(cell, "G", ptOff);
+ }
}
// private void showAandB(ArcInst ai)
@@ -1386,10 +1662,29 @@ public class RoutingDebug
{
PortInst piF = wf.getFromPortInst();
PortInst piT = wf.getToPortInst();
+ NeededRoute nr = wf.getNeededRoute();
+ boolean aToB = wf.isAtoB();
+ double fromTaperWidth, toTaperWidth, fromTaperLength, toTaperLength;
+ if (aToB)
+ {
+ fromTaperWidth = nr.getATaperWidth();
+ toTaperWidth = nr.getBTaperWidth();
+ fromTaperLength = nr.getATaperLength();
+ toTaperLength = nr.getBTaperLength();
+ } else
+ {
+ fromTaperWidth = nr.getBTaperWidth();
+ toTaperWidth = nr.getATaperWidth();
+ fromTaperLength = nr.getBTaperLength();
+ toTaperLength = nr.getATaperLength();
+ }
+
String fromMsg = "FROM: (" + TextUtils.formatDistance(wf.getFromX()) + "," + TextUtils.formatDistance(wf.getFromY()) +
", " + SeaOfGatesEngine.describeMetal(wf.getFromZ(), wf.getFromMask()) + "): port " + piF.getPortProto().getName() + " of node " + piF.getNodeInst().describe(false);
- String toMsg = "TO: (" + TextUtils.formatDistance(wf.getToX()) + "," + TextUtils.formatDistance(wf.getToY()) +
+ if (fromTaperLength > 0) fromMsg += ", Taper width is " + TextUtils.formatDistance(fromTaperWidth);
+ String toMsg = "TO: (" + TextUtils.formatDistance(wf.getTo().getCenterX()) + "," + TextUtils.formatDistance(wf.getTo().getCenterY()) +
", " + SeaOfGatesEngine.describeMetal(wf.getToZ(), wf.getToMask()) + "): port " + piT.getPortProto().getName() + " of node " + piT.getNodeInst().describe(false);
+ if (toTaperLength > 0) toMsg += ", Taper width is " + TextUtils.formatDistance(toTaperWidth);
setRouteDescription(fromMsg, toMsg);
// draw the search vertices
@@ -1418,14 +1713,14 @@ public class RoutingDebug
double lowOff = lowZ * layerOffset;
double highOff = highZ * layerOffset;
h.addLine(EPoint.fromLambda(sv.getX()+lowOff, sv.getY()+lowOff),
- EPoint.fromLambda(sv.getX()+highOff, sv.getY()+highOff), cell, true, Color.WHITE, false);
+ EPoint.fromLambda(sv.getX()+highOff, sv.getY()+highOff), cell, true, Color.WHITE, false);
} else
{
// draw line in proper metal color showing the motion
double off = sv.getZ() * layerOffset;
Color col = router.getPrimaryMetalLayer(sv.getZ()).getGraphics().getColor();
h.addLine(EPoint.fromLambda(sv.getX()+off, sv.getY()+off),
- EPoint.fromLambda(sv.getLast().getX()+off, sv.getLast().getY()+off), cell, false, col, false);
+ EPoint.fromLambda(sv.getLast().getX()+off, sv.getLast().getY()+off), cell, false, col, false);
}
// remember lowest Z coordinate at this place so that anchor line can be drawn if it is above Metal-1
@@ -1458,6 +1753,8 @@ public class RoutingDebug
public static SVState ensureDebuggingShadow(SearchVertex sv, boolean start)
{
+ if (debugDialog == null) return null;
+
SVState svs = debugDialog.svInfo.get(sv);
if (svs == null)
{
diff --git a/com/sun/electric/tool/user/ui/SizeListener.java b/com/sun/electric/tool/user/ui/SizeListener.java
index b52aa43..18d9fb2 100644
--- a/com/sun/electric/tool/user/ui/SizeListener.java
+++ b/com/sun/electric/tool/user/ui/SizeListener.java
@@ -4,7 +4,7 @@
*
* File: SizeListener.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ui/StatusBar.java b/com/sun/electric/tool/user/ui/StatusBar.java
index 328aade..6304f5e 100644
--- a/com/sun/electric/tool/user/ui/StatusBar.java
+++ b/com/sun/electric/tool/user/ui/StatusBar.java
@@ -4,7 +4,7 @@
*
* File: StatusBar.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ui/TechPalette.java b/com/sun/electric/tool/user/ui/TechPalette.java
index 721e0fd..66dde2b 100644
--- a/com/sun/electric/tool/user/ui/TechPalette.java
+++ b/com/sun/electric/tool/user/ui/TechPalette.java
@@ -4,7 +4,7 @@
*
* File: TechPalette.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ui/TextWindow.java b/com/sun/electric/tool/user/ui/TextWindow.java
index 1ad9942..1fdb449 100644
--- a/com/sun/electric/tool/user/ui/TextWindow.java
+++ b/com/sun/electric/tool/user/ui/TextWindow.java
@@ -4,7 +4,7 @@
*
* File: TextWindow.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ui/ToolBar.java b/com/sun/electric/tool/user/ui/ToolBar.java
index 94259b3..a187414 100644
--- a/com/sun/electric/tool/user/ui/ToolBar.java
+++ b/com/sun/electric/tool/user/ui/ToolBar.java
@@ -4,7 +4,7 @@
*
* File: ToolBar.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ui/ToolBarButton.java b/com/sun/electric/tool/user/ui/ToolBarButton.java
index fbc082e..641eebb 100644
--- a/com/sun/electric/tool/user/ui/ToolBarButton.java
+++ b/com/sun/electric/tool/user/ui/ToolBarButton.java
@@ -4,7 +4,7 @@
*
* File: ToolBarButton.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ui/TopLevel.java b/com/sun/electric/tool/user/ui/TopLevel.java
index 6a947cf..e7c0bd4 100644
--- a/com/sun/electric/tool/user/ui/TopLevel.java
+++ b/com/sun/electric/tool/user/ui/TopLevel.java
@@ -4,7 +4,7 @@
*
* File: TopLevel.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ui/Util.java b/com/sun/electric/tool/user/ui/Util.java
index 4c44eb8..4550b91 100644
--- a/com/sun/electric/tool/user/ui/Util.java
+++ b/com/sun/electric/tool/user/ui/Util.java
@@ -4,7 +4,7 @@
*
* File: Util.java
*
- * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ui/WindowContent.java b/com/sun/electric/tool/user/ui/WindowContent.java
index 7aa31c3..d4ed1d8 100644
--- a/com/sun/electric/tool/user/ui/WindowContent.java
+++ b/com/sun/electric/tool/user/ui/WindowContent.java
@@ -4,7 +4,7 @@
*
* File: WindowContent.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ui/WindowContextClass.java b/com/sun/electric/tool/user/ui/WindowContextClass.java
index cc42cff..9c3336f 100644
--- a/com/sun/electric/tool/user/ui/WindowContextClass.java
+++ b/com/sun/electric/tool/user/ui/WindowContextClass.java
@@ -4,7 +4,7 @@
*
* File: WindowContextClass.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ui/WindowFrame.java b/com/sun/electric/tool/user/ui/WindowFrame.java
index 35fccfe..7e3bc9b 100644
--- a/com/sun/electric/tool/user/ui/WindowFrame.java
+++ b/com/sun/electric/tool/user/ui/WindowFrame.java
@@ -4,7 +4,7 @@
*
* File: WindowFrame.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/ui/ZoomAndPanListener.java b/com/sun/electric/tool/user/ui/ZoomAndPanListener.java
index 5d58b3e..7e26bbf 100644
--- a/com/sun/electric/tool/user/ui/ZoomAndPanListener.java
+++ b/com/sun/electric/tool/user/ui/ZoomAndPanListener.java
@@ -4,7 +4,7 @@
*
* File: ZoomAndPanListener.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/waveform/DragButton.java b/com/sun/electric/tool/user/waveform/DragButton.java
index ff77a1f..d61737f 100644
--- a/com/sun/electric/tool/user/waveform/DragButton.java
+++ b/com/sun/electric/tool/user/waveform/DragButton.java
@@ -4,7 +4,7 @@
*
* File: DragButton.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/waveform/HorizRuler.java b/com/sun/electric/tool/user/waveform/HorizRuler.java
index 73e1c27..7187050 100644
--- a/com/sun/electric/tool/user/waveform/HorizRuler.java
+++ b/com/sun/electric/tool/user/waveform/HorizRuler.java
@@ -4,7 +4,7 @@
*
* File: HorizRuler.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/waveform/Panel.java b/com/sun/electric/tool/user/waveform/Panel.java
index ae4355c..5e1ff63 100644
--- a/com/sun/electric/tool/user/waveform/Panel.java
+++ b/com/sun/electric/tool/user/waveform/Panel.java
@@ -4,7 +4,7 @@
*
* File: Panel.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/waveform/StepSize.java b/com/sun/electric/tool/user/waveform/StepSize.java
index 7eae4b3..30c7409 100644
--- a/com/sun/electric/tool/user/waveform/StepSize.java
+++ b/com/sun/electric/tool/user/waveform/StepSize.java
@@ -4,7 +4,7 @@
*
* File: StepSize.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/waveform/SweepSignal.java b/com/sun/electric/tool/user/waveform/SweepSignal.java
index 0b48af7..1ebd206 100644
--- a/com/sun/electric/tool/user/waveform/SweepSignal.java
+++ b/com/sun/electric/tool/user/waveform/SweepSignal.java
@@ -4,7 +4,7 @@
*
* File: SweepSignal.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/waveform/WaveSignal.java b/com/sun/electric/tool/user/waveform/WaveSignal.java
index c096e64..bf1f797 100644
--- a/com/sun/electric/tool/user/waveform/WaveSignal.java
+++ b/com/sun/electric/tool/user/waveform/WaveSignal.java
@@ -4,7 +4,7 @@
*
* File: WaveformWindow.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/user/waveform/WaveformWindow.java b/com/sun/electric/tool/user/waveform/WaveformWindow.java
index 409ea55..0e10b86 100644
--- a/com/sun/electric/tool/user/waveform/WaveformWindow.java
+++ b/com/sun/electric/tool/user/waveform/WaveformWindow.java
@@ -4,7 +4,7 @@
*
* File: WaveformWindow.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/Parallel.java b/com/sun/electric/tool/util/concurrent/Parallel.java
index f26936d..6701cd2 100644
--- a/com/sun/electric/tool/util/concurrent/Parallel.java
+++ b/com/sun/electric/tool/util/concurrent/Parallel.java
@@ -4,7 +4,7 @@
*
* File: Parallel.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/barriers/Barrier.java b/com/sun/electric/tool/util/concurrent/barriers/Barrier.java
index f7d5608..f1b3ee1 100644
--- a/com/sun/electric/tool/util/concurrent/barriers/Barrier.java
+++ b/com/sun/electric/tool/util/concurrent/barriers/Barrier.java
@@ -4,7 +4,7 @@
*
* File: Barrier.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/barriers/SenseBarrier.java b/com/sun/electric/tool/util/concurrent/barriers/SenseBarrier.java
index 5a1dfda..d765312 100644
--- a/com/sun/electric/tool/util/concurrent/barriers/SenseBarrier.java
+++ b/com/sun/electric/tool/util/concurrent/barriers/SenseBarrier.java
@@ -4,7 +4,7 @@
*
* File: SenseBarrier.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/barriers/SimpleTDBarrier.java b/com/sun/electric/tool/util/concurrent/barriers/SimpleTDBarrier.java
index 07b378f..c08ab5e 100644
--- a/com/sun/electric/tool/util/concurrent/barriers/SimpleTDBarrier.java
+++ b/com/sun/electric/tool/util/concurrent/barriers/SimpleTDBarrier.java
@@ -4,7 +4,7 @@
*
* File: SimpleTDBarrier.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/barriers/TDBarrier.java b/com/sun/electric/tool/util/concurrent/barriers/TDBarrier.java
index c64d27e..8c75994 100644
--- a/com/sun/electric/tool/util/concurrent/barriers/TDBarrier.java
+++ b/com/sun/electric/tool/util/concurrent/barriers/TDBarrier.java
@@ -4,7 +4,7 @@
*
* File: TDBarrier.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/datastructures/BDEQueue.java b/com/sun/electric/tool/util/concurrent/datastructures/BDEQueue.java
index d0507c7..468f782 100644
--- a/com/sun/electric/tool/util/concurrent/datastructures/BDEQueue.java
+++ b/com/sun/electric/tool/util/concurrent/datastructures/BDEQueue.java
@@ -4,7 +4,7 @@
*
* File: BDEQueue.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/datastructures/BDEQueueWrapper.java b/com/sun/electric/tool/util/concurrent/datastructures/BDEQueueWrapper.java
index ed00f31..92d042e 100644
--- a/com/sun/electric/tool/util/concurrent/datastructures/BDEQueueWrapper.java
+++ b/com/sun/electric/tool/util/concurrent/datastructures/BDEQueueWrapper.java
@@ -4,7 +4,7 @@
*
* File: BDEQueueWrapper.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/datastructures/CircularArray.java b/com/sun/electric/tool/util/concurrent/datastructures/CircularArray.java
index 76addd9..3cbec69 100644
--- a/com/sun/electric/tool/util/concurrent/datastructures/CircularArray.java
+++ b/com/sun/electric/tool/util/concurrent/datastructures/CircularArray.java
@@ -4,7 +4,7 @@
*
* File: CircularArray.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/datastructures/DEListWrapper.java b/com/sun/electric/tool/util/concurrent/datastructures/DEListWrapper.java
index cef8e11..759136c 100644
--- a/com/sun/electric/tool/util/concurrent/datastructures/DEListWrapper.java
+++ b/com/sun/electric/tool/util/concurrent/datastructures/DEListWrapper.java
@@ -4,7 +4,7 @@
*
* File: DESkipListWrapper.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/datastructures/FCQueue.java b/com/sun/electric/tool/util/concurrent/datastructures/FCQueue.java
index 6e3a975..5a5384a 100644
--- a/com/sun/electric/tool/util/concurrent/datastructures/FCQueue.java
+++ b/com/sun/electric/tool/util/concurrent/datastructures/FCQueue.java
@@ -5,7 +5,7 @@
* File: FCQueue.java
* Written by: Itai Incze, Tel-Aviv University
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/datastructures/IDEStructure.java b/com/sun/electric/tool/util/concurrent/datastructures/IDEStructure.java
index 548aae0..505a343 100644
--- a/com/sun/electric/tool/util/concurrent/datastructures/IDEStructure.java
+++ b/com/sun/electric/tool/util/concurrent/datastructures/IDEStructure.java
@@ -4,7 +4,7 @@
*
* File: IDEStructure.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/datastructures/IStructure.java b/com/sun/electric/tool/util/concurrent/datastructures/IStructure.java
index 4e89173..fb38e2f 100644
--- a/com/sun/electric/tool/util/concurrent/datastructures/IStructure.java
+++ b/com/sun/electric/tool/util/concurrent/datastructures/IStructure.java
@@ -4,7 +4,7 @@
*
* File: IStructure.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/datastructures/IWorkStealing.java b/com/sun/electric/tool/util/concurrent/datastructures/IWorkStealing.java
index 4126aa3..2deb1c6 100644
--- a/com/sun/electric/tool/util/concurrent/datastructures/IWorkStealing.java
+++ b/com/sun/electric/tool/util/concurrent/datastructures/IWorkStealing.java
@@ -4,7 +4,7 @@
*
* File: IWorkStealing.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/datastructures/JavaQueueWrapper.java b/com/sun/electric/tool/util/concurrent/datastructures/JavaQueueWrapper.java
index e947b78..3372935 100644
--- a/com/sun/electric/tool/util/concurrent/datastructures/JavaQueueWrapper.java
+++ b/com/sun/electric/tool/util/concurrent/datastructures/JavaQueueWrapper.java
@@ -4,7 +4,7 @@
*
* File: JavaDataStructureWrapper.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/datastructures/LockFreeQueue.java b/com/sun/electric/tool/util/concurrent/datastructures/LockFreeQueue.java
index bafd28f..5ddecee 100644
--- a/com/sun/electric/tool/util/concurrent/datastructures/LockFreeQueue.java
+++ b/com/sun/electric/tool/util/concurrent/datastructures/LockFreeQueue.java
@@ -4,7 +4,7 @@
*
* File: LockFreeQueue.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/datastructures/LockFreeSkipList.java b/com/sun/electric/tool/util/concurrent/datastructures/LockFreeSkipList.java
index 64ac1ac..28a6150 100644
--- a/com/sun/electric/tool/util/concurrent/datastructures/LockFreeSkipList.java
+++ b/com/sun/electric/tool/util/concurrent/datastructures/LockFreeSkipList.java
@@ -4,7 +4,7 @@
*
* File: LockFreeSkipList.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/datastructures/LockFreeStack.java b/com/sun/electric/tool/util/concurrent/datastructures/LockFreeStack.java
index 9fb13ad..fa4c375 100644
--- a/com/sun/electric/tool/util/concurrent/datastructures/LockFreeStack.java
+++ b/com/sun/electric/tool/util/concurrent/datastructures/LockFreeStack.java
@@ -4,7 +4,7 @@
*
* File: LockFreeStack.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/datastructures/MultipleQueuesStructure.java b/com/sun/electric/tool/util/concurrent/datastructures/MultipleQueuesStructure.java
index f3db5f6..5a87553 100644
--- a/com/sun/electric/tool/util/concurrent/datastructures/MultipleQueuesStructure.java
+++ b/com/sun/electric/tool/util/concurrent/datastructures/MultipleQueuesStructure.java
@@ -4,7 +4,7 @@
*
* File: MultipleQueuesStructure.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/datastructures/UnboundedDEQueue.java b/com/sun/electric/tool/util/concurrent/datastructures/UnboundedDEQueue.java
index 3114d34..6137b40 100644
--- a/com/sun/electric/tool/util/concurrent/datastructures/UnboundedDEQueue.java
+++ b/com/sun/electric/tool/util/concurrent/datastructures/UnboundedDEQueue.java
@@ -4,7 +4,7 @@
*
* File: UnboundedDEQueue.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/datastructures/WorkSharingStructure.java b/com/sun/electric/tool/util/concurrent/datastructures/WorkSharingStructure.java
index 6cfdb01..f7f2edc 100644
--- a/com/sun/electric/tool/util/concurrent/datastructures/WorkSharingStructure.java
+++ b/com/sun/electric/tool/util/concurrent/datastructures/WorkSharingStructure.java
@@ -4,7 +4,7 @@
*
* File: WorkSharingStructure.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/datastructures/WorkStealingStructure.java b/com/sun/electric/tool/util/concurrent/datastructures/WorkStealingStructure.java
index a469a15..5723a09 100644
--- a/com/sun/electric/tool/util/concurrent/datastructures/WorkStealingStructure.java
+++ b/com/sun/electric/tool/util/concurrent/datastructures/WorkStealingStructure.java
@@ -4,7 +4,7 @@
*
* File: WorkStealingStructure.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/debug/Debug.java b/com/sun/electric/tool/util/concurrent/debug/Debug.java
index 6a60585..3aeccef 100644
--- a/com/sun/electric/tool/util/concurrent/debug/Debug.java
+++ b/com/sun/electric/tool/util/concurrent/debug/Debug.java
@@ -4,7 +4,7 @@
*
* File: Debug.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/debug/IDebug.java b/com/sun/electric/tool/util/concurrent/debug/IDebug.java
index e4dda18..05a61e4 100644
--- a/com/sun/electric/tool/util/concurrent/debug/IDebug.java
+++ b/com/sun/electric/tool/util/concurrent/debug/IDebug.java
@@ -4,7 +4,7 @@
*
* File: IDebug.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/debug/LoadBalancing.java b/com/sun/electric/tool/util/concurrent/debug/LoadBalancing.java
index 78e6665..f3ce11e 100644
--- a/com/sun/electric/tool/util/concurrent/debug/LoadBalancing.java
+++ b/com/sun/electric/tool/util/concurrent/debug/LoadBalancing.java
@@ -4,7 +4,7 @@
*
* File: LoadBalancing.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/debug/StealTracker.java b/com/sun/electric/tool/util/concurrent/debug/StealTracker.java
index a9c72d5..99a3ffd 100644
--- a/com/sun/electric/tool/util/concurrent/debug/StealTracker.java
+++ b/com/sun/electric/tool/util/concurrent/debug/StealTracker.java
@@ -4,7 +4,7 @@
*
* File: StealTracker.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/exceptions/PoolExistsException.java b/com/sun/electric/tool/util/concurrent/exceptions/PoolExistsException.java
index da87829..ed24b09 100644
--- a/com/sun/electric/tool/util/concurrent/exceptions/PoolExistsException.java
+++ b/com/sun/electric/tool/util/concurrent/exceptions/PoolExistsException.java
@@ -4,7 +4,7 @@
*
* File: PoolExistsException.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/exceptions/PoolNotInitializedException.java b/com/sun/electric/tool/util/concurrent/exceptions/PoolNotInitializedException.java
index 85f95c4..d2d1eb6 100644
--- a/com/sun/electric/tool/util/concurrent/exceptions/PoolNotInitializedException.java
+++ b/com/sun/electric/tool/util/concurrent/exceptions/PoolNotInitializedException.java
@@ -4,7 +4,7 @@
*
* File: PoolNotInitializedException.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/patterns/PForJob.java b/com/sun/electric/tool/util/concurrent/patterns/PForJob.java
index 783a6bd..ad15113 100644
--- a/com/sun/electric/tool/util/concurrent/patterns/PForJob.java
+++ b/com/sun/electric/tool/util/concurrent/patterns/PForJob.java
@@ -4,7 +4,7 @@
*
* File: PForJob.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/patterns/PForTask.java b/com/sun/electric/tool/util/concurrent/patterns/PForTask.java
index 211bd89..e74f2f2 100644
--- a/com/sun/electric/tool/util/concurrent/patterns/PForTask.java
+++ b/com/sun/electric/tool/util/concurrent/patterns/PForTask.java
@@ -4,7 +4,7 @@
*
* File: PForTask.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/patterns/PJob.java b/com/sun/electric/tool/util/concurrent/patterns/PJob.java
index e871402..4ed70fa 100644
--- a/com/sun/electric/tool/util/concurrent/patterns/PJob.java
+++ b/com/sun/electric/tool/util/concurrent/patterns/PJob.java
@@ -4,7 +4,7 @@
*
* File: PJob.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/patterns/PReduceJob.java b/com/sun/electric/tool/util/concurrent/patterns/PReduceJob.java
index 6132e3e..3e48f6a 100644
--- a/com/sun/electric/tool/util/concurrent/patterns/PReduceJob.java
+++ b/com/sun/electric/tool/util/concurrent/patterns/PReduceJob.java
@@ -4,7 +4,7 @@
*
* File: PJob.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/patterns/PTask.java b/com/sun/electric/tool/util/concurrent/patterns/PTask.java
index 1484bb8..76fa057 100644
--- a/com/sun/electric/tool/util/concurrent/patterns/PTask.java
+++ b/com/sun/electric/tool/util/concurrent/patterns/PTask.java
@@ -4,7 +4,7 @@
*
* File: PTask.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/patterns/PWhileJob.java b/com/sun/electric/tool/util/concurrent/patterns/PWhileJob.java
index c561f94..7dc9109 100644
--- a/com/sun/electric/tool/util/concurrent/patterns/PWhileJob.java
+++ b/com/sun/electric/tool/util/concurrent/patterns/PWhileJob.java
@@ -4,7 +4,7 @@
*
* File: PWhileJob.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/patterns/Pipeline.java b/com/sun/electric/tool/util/concurrent/patterns/Pipeline.java
index ea6c3dd..d9e8820 100644
--- a/com/sun/electric/tool/util/concurrent/patterns/Pipeline.java
+++ b/com/sun/electric/tool/util/concurrent/patterns/Pipeline.java
@@ -4,7 +4,7 @@
*
* File: Pipeline.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/runtime/MultiThreadedRandomizer.java b/com/sun/electric/tool/util/concurrent/runtime/MultiThreadedRandomizer.java
index b8f2193..88c044d 100644
--- a/com/sun/electric/tool/util/concurrent/runtime/MultiThreadedRandomizer.java
+++ b/com/sun/electric/tool/util/concurrent/runtime/MultiThreadedRandomizer.java
@@ -4,7 +4,7 @@
*
* File: MultiThreadedRandomizer.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/runtime/Scheduler.java b/com/sun/electric/tool/util/concurrent/runtime/Scheduler.java
index c21fe0f..5a7b1c5 100644
--- a/com/sun/electric/tool/util/concurrent/runtime/Scheduler.java
+++ b/com/sun/electric/tool/util/concurrent/runtime/Scheduler.java
@@ -4,7 +4,7 @@
*
* File: Scheduler.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/runtime/ThreadID.java b/com/sun/electric/tool/util/concurrent/runtime/ThreadID.java
index c237a8f..3ac3c2e 100644
--- a/com/sun/electric/tool/util/concurrent/runtime/ThreadID.java
+++ b/com/sun/electric/tool/util/concurrent/runtime/ThreadID.java
@@ -4,7 +4,7 @@
*
* File: ThreadID.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/runtime/WorkerStrategy.java b/com/sun/electric/tool/util/concurrent/runtime/WorkerStrategy.java
index a308301..925502a 100644
--- a/com/sun/electric/tool/util/concurrent/runtime/WorkerStrategy.java
+++ b/com/sun/electric/tool/util/concurrent/runtime/WorkerStrategy.java
@@ -4,7 +4,7 @@
*
* File: PoolWorkerStrategy.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/runtime/pipeline/PipelineRuntime.java b/com/sun/electric/tool/util/concurrent/runtime/pipeline/PipelineRuntime.java
index ca7fc40..9d18b72 100644
--- a/com/sun/electric/tool/util/concurrent/runtime/pipeline/PipelineRuntime.java
+++ b/com/sun/electric/tool/util/concurrent/runtime/pipeline/PipelineRuntime.java
@@ -4,7 +4,7 @@
*
* File: Pipeline.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/runtime/pipeline/PipelineWorkerStrategy.java b/com/sun/electric/tool/util/concurrent/runtime/pipeline/PipelineWorkerStrategy.java
index 271290f..39f818b 100644
--- a/com/sun/electric/tool/util/concurrent/runtime/pipeline/PipelineWorkerStrategy.java
+++ b/com/sun/electric/tool/util/concurrent/runtime/pipeline/PipelineWorkerStrategy.java
@@ -4,7 +4,7 @@
*
* File: PipelineWorkerStrategy.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/runtime/pipeline/SimplePipelineWorker.java b/com/sun/electric/tool/util/concurrent/runtime/pipeline/SimplePipelineWorker.java
index b25b243..0ce7100 100644
--- a/com/sun/electric/tool/util/concurrent/runtime/pipeline/SimplePipelineWorker.java
+++ b/com/sun/electric/tool/util/concurrent/runtime/pipeline/SimplePipelineWorker.java
@@ -4,7 +4,7 @@
*
* File: SimplePipelineWorker.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/runtime/taskParallel/IThreadPool.java b/com/sun/electric/tool/util/concurrent/runtime/taskParallel/IThreadPool.java
index f9dd39b..52cb52e 100644
--- a/com/sun/electric/tool/util/concurrent/runtime/taskParallel/IThreadPool.java
+++ b/com/sun/electric/tool/util/concurrent/runtime/taskParallel/IThreadPool.java
@@ -4,7 +4,7 @@
*
* File: IThreadPool.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/runtime/taskParallel/PoolWorkerStrategy.java b/com/sun/electric/tool/util/concurrent/runtime/taskParallel/PoolWorkerStrategy.java
index 66635b4..9ffed11 100644
--- a/com/sun/electric/tool/util/concurrent/runtime/taskParallel/PoolWorkerStrategy.java
+++ b/com/sun/electric/tool/util/concurrent/runtime/taskParallel/PoolWorkerStrategy.java
@@ -4,7 +4,7 @@
*
* File: PoolWorkerStrategy.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/runtime/taskParallel/SimpleWorker.java b/com/sun/electric/tool/util/concurrent/runtime/taskParallel/SimpleWorker.java
index 8b4eedd..05cc385 100644
--- a/com/sun/electric/tool/util/concurrent/runtime/taskParallel/SimpleWorker.java
+++ b/com/sun/electric/tool/util/concurrent/runtime/taskParallel/SimpleWorker.java
@@ -4,7 +4,7 @@
*
* File: SimpleWorker.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/runtime/taskParallel/SynchronizedWorker.java b/com/sun/electric/tool/util/concurrent/runtime/taskParallel/SynchronizedWorker.java
index c8f58f4..383cf07 100644
--- a/com/sun/electric/tool/util/concurrent/runtime/taskParallel/SynchronizedWorker.java
+++ b/com/sun/electric/tool/util/concurrent/runtime/taskParallel/SynchronizedWorker.java
@@ -4,7 +4,7 @@
*
* File: SimpleWorker.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+4 * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/runtime/taskParallel/ThreadPool.java b/com/sun/electric/tool/util/concurrent/runtime/taskParallel/ThreadPool.java
index 8a974b8..022c0c9 100644
--- a/com/sun/electric/tool/util/concurrent/runtime/taskParallel/ThreadPool.java
+++ b/com/sun/electric/tool/util/concurrent/runtime/taskParallel/ThreadPool.java
@@ -4,7 +4,7 @@
*
* File: ThreadPool.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/runtime/taskParallel/ThreadPoolScalaForkJoin.java b/com/sun/electric/tool/util/concurrent/runtime/taskParallel/ThreadPoolJdkForkJoin.java
similarity index 80%
rename from com/sun/electric/tool/util/concurrent/runtime/taskParallel/ThreadPoolScalaForkJoin.java
rename to com/sun/electric/tool/util/concurrent/runtime/taskParallel/ThreadPoolJdkForkJoin.java
index dc643cf..bd38bb2 100644
--- a/com/sun/electric/tool/util/concurrent/runtime/taskParallel/ThreadPoolScalaForkJoin.java
+++ b/com/sun/electric/tool/util/concurrent/runtime/taskParallel/ThreadPoolJdkForkJoin.java
@@ -4,7 +4,7 @@
*
* File: ThreadPoolScalaForkJoin.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -23,30 +23,30 @@ package com.sun.electric.tool.util.concurrent.runtime.taskParallel;
import com.sun.electric.tool.util.concurrent.patterns.PTask;
import java.util.concurrent.TimeUnit;
-import scala.concurrent.forkjoin.ForkJoinPool;
-import scala.concurrent.forkjoin.ForkJoinTask;
+import java.util.concurrent.ForkJoinPool;
+import java.util.concurrent.ForkJoinTask;
-public class ThreadPoolScalaForkJoin extends IThreadPool {
+public class ThreadPoolJdkForkJoin extends IThreadPool {
private ForkJoinPool pool;
private int threads;
- private ThreadPoolScalaForkJoin() {
+ private ThreadPoolJdkForkJoin() {
this(Runtime.getRuntime().availableProcessors());
}
- private ThreadPoolScalaForkJoin(int threads) {
+ private ThreadPoolJdkForkJoin(int threads) {
this.threads = threads;
}
- public static ThreadPoolScalaForkJoin initialize() {
- ThreadPoolScalaForkJoin pool = new ThreadPoolScalaForkJoin();
+ public static ThreadPoolJdkForkJoin initialize() {
+ ThreadPoolJdkForkJoin pool = new ThreadPoolJdkForkJoin();
pool.start();
return pool;
}
- public static ThreadPoolScalaForkJoin initialize(int numOfThreads) {
- ThreadPoolScalaForkJoin pool = new ThreadPoolScalaForkJoin(numOfThreads);
+ public static ThreadPoolJdkForkJoin initialize(int numOfThreads) {
+ ThreadPoolJdkForkJoin pool = new ThreadPoolJdkForkJoin(numOfThreads);
pool.start();
return pool;
}
diff --git a/com/sun/electric/tool/util/concurrent/utils/BlockedRange.java b/com/sun/electric/tool/util/concurrent/utils/BlockedRange.java
index 644b816..e133f92 100644
--- a/com/sun/electric/tool/util/concurrent/utils/BlockedRange.java
+++ b/com/sun/electric/tool/util/concurrent/utils/BlockedRange.java
@@ -4,7 +4,7 @@
*
* File: BlockedRange.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/utils/BlockedRange1D.java b/com/sun/electric/tool/util/concurrent/utils/BlockedRange1D.java
index 117e228..bd8c6d2 100644
--- a/com/sun/electric/tool/util/concurrent/utils/BlockedRange1D.java
+++ b/com/sun/electric/tool/util/concurrent/utils/BlockedRange1D.java
@@ -4,7 +4,7 @@
*
* File: BlockedRange1D.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/utils/BlockedRange2D.java b/com/sun/electric/tool/util/concurrent/utils/BlockedRange2D.java
index a531ce0..db51874 100644
--- a/com/sun/electric/tool/util/concurrent/utils/BlockedRange2D.java
+++ b/com/sun/electric/tool/util/concurrent/utils/BlockedRange2D.java
@@ -4,7 +4,7 @@
*
* File: BlockedRange2D.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/utils/ConcurrentCollectionFactory.java b/com/sun/electric/tool/util/concurrent/utils/ConcurrentCollectionFactory.java
index 4ad27cd..3b35213 100644
--- a/com/sun/electric/tool/util/concurrent/utils/ConcurrentCollectionFactory.java
+++ b/com/sun/electric/tool/util/concurrent/utils/ConcurrentCollectionFactory.java
@@ -4,7 +4,7 @@
*
* File: ConcurrentCollectionFactory.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/utils/EmptyException.java b/com/sun/electric/tool/util/concurrent/utils/EmptyException.java
index 64d590b..3c5c48c 100644
--- a/com/sun/electric/tool/util/concurrent/utils/EmptyException.java
+++ b/com/sun/electric/tool/util/concurrent/utils/EmptyException.java
@@ -4,7 +4,7 @@
*
* File: EmptyException.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/utils/FullException.java b/com/sun/electric/tool/util/concurrent/utils/FullException.java
index 6c95a9f..cce797e 100644
--- a/com/sun/electric/tool/util/concurrent/utils/FullException.java
+++ b/com/sun/electric/tool/util/concurrent/utils/FullException.java
@@ -4,7 +4,7 @@
*
* File: FullException.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/tool/util/concurrent/utils/Range.java b/com/sun/electric/tool/util/concurrent/utils/Range.java
index aa498e4..1d9c902 100644
--- a/com/sun/electric/tool/util/concurrent/utils/Range.java
+++ b/com/sun/electric/tool/util/concurrent/utils/Range.java
@@ -4,7 +4,7 @@
*
* File: Range.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/ArgumentsParser.java b/com/sun/electric/util/ArgumentsParser.java
index b72be03..2d732f9 100644
--- a/com/sun/electric/util/ArgumentsParser.java
+++ b/com/sun/electric/util/ArgumentsParser.java
@@ -4,7 +4,7 @@
*
* File: ArgumentsParser.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/BaseProperties.java b/com/sun/electric/util/BaseProperties.java
index 555bc68..24774ac 100644
--- a/com/sun/electric/util/BaseProperties.java
+++ b/com/sun/electric/util/BaseProperties.java
@@ -4,7 +4,7 @@
*
* File: BaseProperties.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/ClientOS.java b/com/sun/electric/util/ClientOS.java
index 7462e05..af05a20 100644
--- a/com/sun/electric/util/ClientOS.java
+++ b/com/sun/electric/util/ClientOS.java
@@ -4,7 +4,7 @@
*
* File: ClientOS.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -21,90 +21,80 @@
*/
package com.sun.electric.util;
-public class ClientOS {
+public class ClientOS
+{
+ /**
+ * OS is a typesafe enum class that describes the current operating system.
+ */
+ public enum OS
+ {
+ /** Describes Windows. */ WINDOWS("Windows"),
+ /** Describes UNIX/Linux. */ UNIX("UNIX"),
+ /** Describes Macintosh. */ MACINTOSH("Macintosh");
+ private String name;
- /**
- * OS is a typesafe enum class that describes the current operating system.
- */
- public enum OS {
+ private OS(String name)
+ {
+ this.name = name;
+ }
- /**
- * Describes Windows.
- */
- WINDOWS("Windows"),
- /**
- * Describes UNIX/Linux.
- */
- UNIX("UNIX"),
- /**
- * Describes Macintosh.
- */
- MACINTOSH("Macintosh");
- private String name;
+ /**
+ * Method to return a printable version of this OS.
+ * @return a printable version of this OS.
+ */
+ public String toString() { return name; }
+ }
- private OS(String name) {
- this.name = name;
- }
+ /**
+ * The current operating system and version.
+ */
+ public static final OS os = OSInitialize();
+ public static double osVersion;
- /**
- * Returns a printable version of this OS.
- *
- * @return a printable version of this OS.
- */
- public String toString() {
- return name;
- }
- }
- /**
- * The current operating system.
- */
- public static final OS os = OSInitialize();
+ /**
+ * Method to return the operating system name.
+ */
+ public static String getOSPrefix()
+ {
+ String osPrefix = "";
+ if (os == OS.WINDOWS) osPrefix = "Win";
+ else if (os == OS.MACINTOSH) osPrefix = "Mac";
+ else if (os == OS.UNIX) osPrefix = "Linux";
+ return osPrefix;
+ }
- // return OS prefix
- public static String getOSPrefix() {
- String osPrefix = "";
- if (os == OS.WINDOWS) {
- osPrefix = "Win";
- } else if (os == OS.MACINTOSH) {
- osPrefix = "Mac";
- } else if (os == OS.UNIX) {
- osPrefix = "Linux";
- }
- return osPrefix;
- }
+ public static String userDir()
+ {
+ return ClientOS.isOSMac() ? System.getProperty("user.home") : System.getProperty("user.dir");
+ }
- public static String userDir() {
- return ClientOS.isOSMac() ? System.getProperty("user.home") : System.getProperty("user.dir");
- }
+ private static OS OSInitialize()
+ {
+ osVersion = 0;
+ try
+ {
+ String osName = System.getProperty("os.name").toLowerCase();
+ if (osName.startsWith("windows"))
+ {
+ String versionStr = osName.substring(8);
+ osVersion = TextUtils.atof(versionStr);
+ return OS.WINDOWS;
+ }
+ if (osName.startsWith("linux") || osName.startsWith("solaris") || osName.startsWith("sunos")) return OS.UNIX;
+ if (osName.startsWith("mac")) return OS.MACINTOSH;
+ } catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ System.out.println("No OS detected");
+ return null;
+ }
- private static OS OSInitialize() {
- try {
- String osName = System.getProperty("os.name").toLowerCase();
- if (osName.startsWith("windows")) {
- return OS.WINDOWS;
+ public static boolean isOSWindows() { return os == OS.WINDOWS; }
- } else if (osName.startsWith("linux")
- || osName.startsWith("solaris") || osName.startsWith("sunos")) {
- return OS.UNIX;
- } else if (osName.startsWith("mac")) {
- return OS.MACINTOSH;
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- System.out.println("No OS detected");
- return null;
- }
+ public static boolean isOSMac() { return os == OS.MACINTOSH; }
- public static boolean isOSWindows() {
- return os == OS.WINDOWS;
- }
+ public static boolean isOSLinux() { return os == OS.UNIX; }
- public static boolean isOSMac() {
- return os == OS.MACINTOSH;
- }
-
- public static boolean isOSLinux() {
- return os == OS.UNIX;
- }
+ public static double getOSVersion() { return osVersion; }
}
diff --git a/com/sun/electric/util/CollectionFactory.java b/com/sun/electric/util/CollectionFactory.java
index 30be27f..1f6850e 100644
--- a/com/sun/electric/util/CollectionFactory.java
+++ b/com/sun/electric/util/CollectionFactory.java
@@ -4,7 +4,7 @@
*
* File: ConcurrentCollectionFactory.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/ElapseTimer.java b/com/sun/electric/util/ElapseTimer.java
index e67f6af..35a917d 100644
--- a/com/sun/electric/util/ElapseTimer.java
+++ b/com/sun/electric/util/ElapseTimer.java
@@ -4,7 +4,7 @@
*
* File: ElapseTimer.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/JavaCompatiblity.java b/com/sun/electric/util/JavaCompatiblity.java
index 658986c..f8c3dc0 100644
--- a/com/sun/electric/util/JavaCompatiblity.java
+++ b/com/sun/electric/util/JavaCompatiblity.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: JavaCompatiblity.java
- * Written by Gilda Garreton, Oracle.
+ * Written by Gilda Garreton.
*
- * Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/PropertiesUtils.java b/com/sun/electric/util/PropertiesUtils.java
index 6013086..b6a5633 100644
--- a/com/sun/electric/util/PropertiesUtils.java
+++ b/com/sun/electric/util/PropertiesUtils.java
@@ -4,7 +4,7 @@
*
* File: PropertiesUtils.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/TextUtils.java b/com/sun/electric/util/TextUtils.java
index fab3905..162c220 100644
--- a/com/sun/electric/util/TextUtils.java
+++ b/com/sun/electric/util/TextUtils.java
@@ -4,7 +4,7 @@
*
* File: TextUtils.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/UniqueIDGenerator.java b/com/sun/electric/util/UniqueIDGenerator.java
index 86b71f0..e8cde3b 100644
--- a/com/sun/electric/util/UniqueIDGenerator.java
+++ b/com/sun/electric/util/UniqueIDGenerator.java
@@ -4,7 +4,7 @@
*
* File: UniqueIDGenerator.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/collections/ArrayIterator.java b/com/sun/electric/util/collections/ArrayIterator.java
index b7c0b37..1ddcfa1 100644
--- a/com/sun/electric/util/collections/ArrayIterator.java
+++ b/com/sun/electric/util/collections/ArrayIterator.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ArrayIterarator.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/collections/ImmutableArrayList.java b/com/sun/electric/util/collections/ImmutableArrayList.java
index 4edca02..50940d6 100644
--- a/com/sun/electric/util/collections/ImmutableArrayList.java
+++ b/com/sun/electric/util/collections/ImmutableArrayList.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ImmutableArrayList.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/collections/ImmutableList.java b/com/sun/electric/util/collections/ImmutableList.java
index 54621e6..eb91f39 100644
--- a/com/sun/electric/util/collections/ImmutableList.java
+++ b/com/sun/electric/util/collections/ImmutableList.java
@@ -4,7 +4,7 @@
*
* File: ImmutableList.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/collections/ImmutableList2.java b/com/sun/electric/util/collections/ImmutableList2.java
index 56f69a3..536cba2 100644
--- a/com/sun/electric/util/collections/ImmutableList2.java
+++ b/com/sun/electric/util/collections/ImmutableList2.java
@@ -4,7 +4,7 @@
*
* File: ImmutableList2.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/collections/WeakReferences.java b/com/sun/electric/util/collections/WeakReferences.java
index 2e42f45..ce716b2 100644
--- a/com/sun/electric/util/collections/WeakReferences.java
+++ b/com/sun/electric/util/collections/WeakReferences.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: WeakReferences.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/io/CSVFile.java b/com/sun/electric/util/io/CSVFile.java
index dc5d5cb..e8d8de3 100644
--- a/com/sun/electric/util/io/CSVFile.java
+++ b/com/sun/electric/util/io/CSVFile.java
@@ -4,7 +4,7 @@
*
* File: CSVFile.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/io/input/CSVInput.java b/com/sun/electric/util/io/input/CSVInput.java
index a8cfbb8..be5c99f 100644
--- a/com/sun/electric/util/io/input/CSVInput.java
+++ b/com/sun/electric/util/io/input/CSVInput.java
@@ -4,7 +4,7 @@
*
* File: CSVInput.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/io/output/CSVWriter.java b/com/sun/electric/util/io/output/CSVWriter.java
index cb438a8..03c6f48 100644
--- a/com/sun/electric/util/io/output/CSVWriter.java
+++ b/com/sun/electric/util/io/output/CSVWriter.java
@@ -4,7 +4,7 @@
*
* File: CVSWriter.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/math/AbstractFixpPoint.java b/com/sun/electric/util/math/AbstractFixpPoint.java
index 8ff62d5..815fa84 100644
--- a/com/sun/electric/util/math/AbstractFixpPoint.java
+++ b/com/sun/electric/util/math/AbstractFixpPoint.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: AbstractFixpPoint.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/math/AbstractFixpRectangle.java b/com/sun/electric/util/math/AbstractFixpRectangle.java
index 9a5838b..a76e786 100644
--- a/com/sun/electric/util/math/AbstractFixpRectangle.java
+++ b/com/sun/electric/util/math/AbstractFixpRectangle.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: AbstractFixpPoint.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/math/DBMath.java b/com/sun/electric/util/math/DBMath.java
index 5535523..787c432 100644
--- a/com/sun/electric/util/math/DBMath.java
+++ b/com/sun/electric/util/math/DBMath.java
@@ -4,7 +4,7 @@
*
* File: DBMath.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/math/ECoord.java b/com/sun/electric/util/math/ECoord.java
index d236f0c..234d3f4 100644
--- a/com/sun/electric/util/math/ECoord.java
+++ b/com/sun/electric/util/math/ECoord.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ECoord.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/math/EDimension.java b/com/sun/electric/util/math/EDimension.java
index c10a59e..7e38d3c 100644
--- a/com/sun/electric/util/math/EDimension.java
+++ b/com/sun/electric/util/math/EDimension.java
@@ -4,7 +4,7 @@
*
* File: Dimension2D.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/math/FixpCoord.java b/com/sun/electric/util/math/FixpCoord.java
index 80af699..578cb4f 100644
--- a/com/sun/electric/util/math/FixpCoord.java
+++ b/com/sun/electric/util/math/FixpCoord.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: FixpCoord.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/math/FixpRectangle.java b/com/sun/electric/util/math/FixpRectangle.java
index 1d936ee..593dd41 100644
--- a/com/sun/electric/util/math/FixpRectangle.java
+++ b/com/sun/electric/util/math/FixpRectangle.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: FixpPoint.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/math/FixpTransform.java b/com/sun/electric/util/math/FixpTransform.java
index f9db350..fdd0e8f 100644
--- a/com/sun/electric/util/math/FixpTransform.java
+++ b/com/sun/electric/util/math/FixpTransform.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: FixpTransform.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/math/GenMath.java b/com/sun/electric/util/math/GenMath.java
index 737faf5..ab108d1 100644
--- a/com/sun/electric/util/math/GenMath.java
+++ b/com/sun/electric/util/math/GenMath.java
@@ -4,7 +4,7 @@
*
* File: GenMath.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/math/MutableBoolean.java b/com/sun/electric/util/math/MutableBoolean.java
index f252260..85fe733 100644
--- a/com/sun/electric/util/math/MutableBoolean.java
+++ b/com/sun/electric/util/math/MutableBoolean.java
@@ -4,7 +4,7 @@
*
* File: MutableBoolean.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/math/MutableDouble.java b/com/sun/electric/util/math/MutableDouble.java
index 101a204..ca04ad1 100644
--- a/com/sun/electric/util/math/MutableDouble.java
+++ b/com/sun/electric/util/math/MutableDouble.java
@@ -4,7 +4,7 @@
*
* File: MutableDouble.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/math/MutableInteger.java b/com/sun/electric/util/math/MutableInteger.java
index 893d9c0..0b1fd59 100644
--- a/com/sun/electric/util/math/MutableInteger.java
+++ b/com/sun/electric/util/math/MutableInteger.java
@@ -4,7 +4,7 @@
*
* File: MutableInteger.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/math/MutableInterval.java b/com/sun/electric/util/math/MutableInterval.java
index 83cb397..bfb77e4 100644
--- a/com/sun/electric/util/math/MutableInterval.java
+++ b/com/sun/electric/util/math/MutableInterval.java
@@ -4,7 +4,7 @@
*
* File: MutableInterval.java
*
- * Copyright (c) 2004, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2004, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/math/MutableLong.java b/com/sun/electric/util/math/MutableLong.java
index b13d31c..fc0b8ed 100644
--- a/com/sun/electric/util/math/MutableLong.java
+++ b/com/sun/electric/util/math/MutableLong.java
@@ -4,7 +4,7 @@
*
* File: MutableLong.java
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/math/Orientation.java b/com/sun/electric/util/math/Orientation.java
index 5a1a7fe..a2bbf7d 100644
--- a/com/sun/electric/util/math/Orientation.java
+++ b/com/sun/electric/util/math/Orientation.java
@@ -4,7 +4,7 @@
*
* File: Orientation.java
*
- * Copyright (c) 2005, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/memory/Memory.java b/com/sun/electric/util/memory/Memory.java
index 7c1f86b..02bcf49 100644
--- a/com/sun/electric/util/memory/Memory.java
+++ b/com/sun/electric/util/memory/Memory.java
@@ -4,7 +4,7 @@
*
* File: Memory.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/memory/MemoryUsage.java b/com/sun/electric/util/memory/MemoryUsage.java
index d6f5328..6685893 100644
--- a/com/sun/electric/util/memory/MemoryUsage.java
+++ b/com/sun/electric/util/memory/MemoryUsage.java
@@ -4,7 +4,7 @@
*
* File: MemoryUsage.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/memory/ObjSize.java b/com/sun/electric/util/memory/ObjSize.java
index b0ac1a4..f78837c 100644
--- a/com/sun/electric/util/memory/ObjSize.java
+++ b/com/sun/electric/util/memory/ObjSize.java
@@ -3,9 +3,9 @@
* Electric(tm) VLSI Design System
*
* File: ObjSize.java
- * Written by: Dmitry Nadezhin, Sun Microsystems.
+ * Written by: Dmitry Nadezhin.
*
- * Copyright (c) 2003, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/test/TestByReflection.java b/com/sun/electric/util/test/TestByReflection.java
index 073725f..4cb7df3 100644
--- a/com/sun/electric/util/test/TestByReflection.java
+++ b/com/sun/electric/util/test/TestByReflection.java
@@ -4,7 +4,7 @@
*
* File: TestByReflection.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
diff --git a/com/sun/electric/util/test/TestHelpers.java b/com/sun/electric/util/test/TestHelpers.java
index 1753673..37f550f 100644
--- a/com/sun/electric/util/test/TestHelpers.java
+++ b/com/sun/electric/util/test/TestHelpers.java
@@ -4,7 +4,7 @@
*
* File: TestHelpers.java
*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, Static Free Software. All rights reserved.
*
* Electric(tm) is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-java/electric.git
More information about the pkg-java-commits
mailing list