Compare commits

...
165 Commits
Author SHA1 Message Date
Tim Edwards eefdb61e14 Merge branch 'master' into work 2018-04-05 10:10:47 -04:00
Tim Edwards 1d1ad3c833 Update at Thu Apr 5 10:10:44 EDT 2018 by tim 2018-04-05 10:10:44 -04:00
Tim Edwards 4166408576 Discovered a subtle error caused by running a setup script that
calls "equate pins".  This could fail because the routine that forces
uniqueness of pins was being called by the "compare" command but
outside of PinMatch.  Fixed by duplicating the call to force uniqueness
of pins inside the "equate" function.  Redundant calls should not
matter as uniqueness is resolved on the first call and subsequent calls
will need no further action.
2018-04-05 10:06:32 -04:00
Tim Edwards 2b15b731bb Merge branch 'master' into work 2018-03-28 12:40:17 -04:00
Tim Edwards 9ad6ad3338 Update at Wed Mar 28 12:40:15 EDT 2018 by tim 2018-03-28 12:40:15 -04:00
Tim Edwards 0fb5efd914 Corrected a crash condition during pin matching if any subcell has
no pins at all.
2018-03-28 12:39:40 -04:00
Tim Edwards 763117aabe Merge branch 'master' into work 2018-01-29 13:26:41 -05:00
Tim Edwards 96a95d337f Update at Mon Jan 29 13:26:39 EST 2018 by tim 2018-01-29 13:26:39 -05:00
Tim Edwards 393788a039 Changed behavior of the "lvs" script so that the setup file can
be specified as "nosetup" if the "lvs" command is being called
interactively from a terminal or as part of a larger script where
setup commands have been issued prior to running the "lvs" script.
Similarly, the log file can be specified as "nolog" to prevent any
log file from being generated.
2018-01-29 13:24:54 -05:00
Tim Edwards c630c2e397 Merge branch 'master' into work 2018-01-26 11:58:07 -05:00
Tim Edwards 1e8685128c Update at Fri Jan 26 11:58:05 EST 2018 by tim 2018-01-26 11:58:05 -05:00
Tim Edwards 440f61d540 Corrected a number of function returns, mainly to avoid compile-
time warnings and errors.  Removed the "-lazy" option from the
Tcl load command, which is not needed when the stubs libraries
are compiled in correctly, and which causes issues on some
systems (e.g., Mac OS).  Thanks to Matt Guthaus for the patch.
2018-01-26 11:56:41 -05:00
Tim Edwards cc532b2cb7 Merge branch 'master' into work 2017-12-14 21:50:33 -05:00
Tim Edwards 2a4c7b3cde Update at Thu Dec 14 21:50:32 EST 2017 by tim 2017-12-14 21:50:32 -05:00
Tim Edwards 87e44b0d8c Corrected an issue in which netgen would attempt to find a file
from a ".include" line by trying alternate extensions.  This
should be discouraged, as it happened that a file included
"name.defparams", a file that didn't exist, and instead of calling
out the missing file, it recast it to "name.spice" and caused it
to drop into an infinite loop.  Oops.
2017-12-14 21:48:01 -05:00
Tim Edwards e1322dbaf6 Merge branch 'master' into work 2017-12-07 08:46:43 -05:00
Tim Edwards 661157e041 Update at Thu Dec 7 08:46:40 EST 2017 by tim 2017-12-07 08:46:40 -05:00
Tim Edwards 77e5d70626 Corrected Tcl list output (and, by consequence, the JSON file
output) to include pin information (missing "-list" argument to
the "equate pins" command).
2017-12-07 08:45:37 -05:00
Tim Edwards 4098b7d5fd Completed an unimplemented method that sets missing properties to
the default before comparing instances against each other for
serial/parallel combination.  In particular, this avoids a
failure to serially combine a device with M = 1 vs. a device with
no M declared.
2017-10-12 15:26:29 -04:00
Tim Edwards f860244700 Provide additional output for mismatched serial/parallel networks.
Netgen was incorrectly treating mismatched networks as a missing
set of parameters on whichever device had more property records,
resulting in misleading output.
2017-10-12 14:17:24 -04:00
Tim Edwards 66015511cb Corrected mismatch count, which was prematurely declaring a
mismatch on "M=" even though some conditions pass.
2017-10-12 12:30:33 -04:00
Tim Edwards b3277ca53e Modified reading of SPICE files so that parameters in quotes get
treated monolithically instead of being broken up into separate
tokens according to space characters, which screws up the parameter
parsing.
2017-10-12 12:11:30 -04:00
Tim Edwards 00c2e74524 Merge branch 'master' into work 2017-10-12 10:52:58 -04:00
Tim Edwards bdb8917327 Update at Thu Oct 12 10:52:56 EDT 2017 by tim 2017-10-12 10:52:56 -04:00
Tim Edwards 95bce5dbd6 Corrected another error in the serial combination in which the
attempt to resolve values by combining over serial chains was
attempting to access a property "S" in the component's master
record, which generally won't exist unless it has been explicitly
set in the netlist (which is unlikely since "S" is not a standard
SPICE/CDL parameter like "M").
2017-10-12 10:51:13 -04:00
Tim Edwards e15620257c Merge branch 'master' into work 2017-10-10 22:25:50 -04:00
Tim Edwards 7a947ee9be Update at Tue Oct 10 22:25:49 EDT 2017 by tim 2017-10-10 22:25:49 -04:00
Tim Edwards b5f188de42 Corrected two errors in the serial combine function, one which
misses a device if it has been already moved due to earlier
merging in the serial combine routine, and runs off the end of
the list;  the other if the pin check routine falls on the last
device in the list, leading to an incorrect check for a record
where there is only a NULL.
2017-10-10 22:24:09 -04:00
Tim Edwards ccbb286cf3 Merge branch 'master' into work 2017-08-24 09:51:46 -04:00
Tim Edwards 4809c02f79 Update at Thu Aug 24 09:51:44 EDT 2017 by tim 2017-08-24 09:51:44 -04:00
Tim Edwards af3982766e Prevented a crash condition in the error case in which ports are
unordered at the time of reaching reorderpins().  Pins will be
ordered arbitrarily (in the order of appearance in the linked
list), but netgen will not crash.
2017-08-24 09:50:40 -04:00
Tim Edwards 25c1f13e16 Update at Thu Aug 10 22:41:12 EDT 2017 by tim 2017-08-10 22:41:12 -04:00
Tim Edwards f0eec657a3 Update at Wed Aug 9 09:04:43 EDT 2017 by tim 2017-08-09 09:04:43 -04:00
Tim Edwards 9d476bc25a Merge branch 'master' into work 2017-06-22 08:13:02 -04:00
Tim Edwards 5ed3fcb3f1 Update at Thu Jun 22 08:12:59 EDT 2017 by tim 2017-06-22 08:13:00 -04:00
Tim Edwards ab9659af17 Corrected coding error in tilde expansion of .include filenames. 2017-06-22 08:12:41 -04:00
Tim Edwards 41939adb84 Merge branch 'master' into work 2017-06-20 22:55:26 -04:00
Tim Edwards 39573981be Update at Tue Jun 20 22:55:24 EDT 2017 by tim 2017-06-20 22:55:24 -04:00
Tim Edwards b9e26f6fce Implemented better black-box handling. Netlist with "stub" entries
for subcircuits (.subckt ... .ends pair with cellname and pin names
and pin order, but no contents) are automatically treated as black-
box circuits if found and if the "-blackbox" option is passed to the
"lvs" (scripted) command.  The "equate pins" command can be used
outside of a comparison to force two circuits (black-box or
otherwise) to be matched by pin name (if not a black-box circuit,
then this is a provisional name match, as a circuit comparison will
order based on connectivity first, not pin names).  So two sets of
black-box circuit libraries can be used as long as their pin names
match.  One hack added to ignore the "!" at the end of global names
when comparing pin names for matching.  Otherwise, pin names must
compare by case-insensitive string match.
2017-06-20 22:50:31 -04:00
Tim Edwards 78779ce2e9 Corrected the "property parallel none" command option so that it
gets applied properly to all existing cells (as well as all
future cells, but normally the former is applicable in a setup
file for LVS).
2017-06-19 22:22:08 -04:00
Tim Edwards 70bb33cc62 Finally reworked "cells" command behavior into something
consistent.
2017-06-19 21:04:33 -04:00
Tim Edwards fdf2f32654 Fixed the "cells -all" command so that it now matches the
documentation, and behaves as intended, which is that "-all" is
not a standalone option but is itself an optional qualifier to
the "cells <valid_cellname>" command.  So the options are
"cells <valid_cellname>" and "cells -all <valid_cellname>".
2017-06-19 20:22:59 -04:00
Tim Edwards 05d4225e97 New command option "model blackbox on|off" makes "readnet spice"
treat empty subcircuits as blackbox cells automatically without
requiring specific callse to "model <cell> blackbox" for each.
Enabled in LVS script by giving option "-blackbox" at the end
of the LVS command.
2017-06-19 17:41:31 -04:00
Tim Edwards b6218699a9 Merge branch 'master' into work 2017-06-19 12:39:02 -04:00
Tim Edwards d7927ef547 Update at Mon Jun 19 12:39:00 EDT 2017 by tim 2017-06-19 12:39:00 -04:00
Tim Edwards af7bc39bbf Added tilde expansion handling for .INCLUDE statements to the
SPICE netlist read routine.
2017-06-19 12:38:27 -04:00
Tim Edwards 5cd68b9ef1 Merge branch 'master' into work 2017-06-18 22:48:13 -04:00
Tim Edwards 07788e7501 Update at Sun Jun 18 22:48:11 EDT 2017 by tim 2017-06-18 22:48:11 -04:00
Tim Edwards 24cc7d0c94 Update to add "property parallel none" command option. 2017-06-18 22:47:51 -04:00
Tim Edwards dbcd36d3ec Merge branch 'master' into work 2017-05-15 16:31:03 -04:00
Tim Edwards 25c17abb70 Update at Mon May 15 16:31:00 EDT 2017 by tim 2017-05-15 16:31:00 -04:00
Tim Edwards fd019b4afd Corrected the same error as a few commits back that causes a message
about property errors to show up, not due to property errors, but
due to proxy pins being inserted in the middle of a device record.
However, the first one was fixed for the case of proxy pins being
added to circuit 1, but the same fix was not made for the opposite
case of proxy pins being added to circuit 2.  This commit corrects
that omission.
2017-05-15 16:29:12 -04:00
Tim Edwards cdfd74bac4 Removed old comment from code referring to the development state. 2017-05-08 21:00:43 -04:00
Tim Edwards dd9e02c5f3 Merge branch 'master' into work 2017-05-08 20:57:01 -04:00
Tim Edwards 26cd16f3ff Update at Mon May 8 20:56:58 EDT 2017 by tim 2017-05-08 20:56:58 -04:00
Tim Edwards ccdd47bc0b Corrected rare case where a cell that is flattened is the first
instance in a cell, and is empty, and causes the cell contents
to be nulled out.
2017-05-08 20:55:58 -04:00
Tim Edwards ace1c28507 Corrected an error placing proxy pins after the first pin of the
first object if the (presumably top-level) cell has no pins
(top-level cells not in a subcircuit definition satisfy this
condition).
2017-05-05 21:08:09 -04:00
Tim Edwards 5e9635e05f Merge branch 'master' into work 2017-05-05 17:36:32 -04:00
Tim Edwards 5c168946e3 Update at Fri May 5 17:36:29 EDT 2017 by tim 2017-05-05 17:36:29 -04:00
Tim Edwards 1471f0c09f Corrected error in combining property records of serial devices. 2017-05-05 17:35:57 -04:00
Tim Edwards 73b81fcfe3 Merge branch 'master' into work 2017-04-25 08:47:58 -04:00
Tim Edwards b083a6df7c Update at Tue Apr 25 08:47:57 EDT 2017 by tim 2017-04-25 08:47:57 -04:00
Tim Edwards 2b5a96500c Corrected the .gitignore file, which was apparently missed when
version 1.5 was first created in git.
2017-04-25 08:47:33 -04:00
Tim Edwards 66f94b47e6 Merge branch 'master' into work 2017-03-06 14:01:26 -05:00
Tim Edwards 09532ee628 Update at Mon Mar 6 14:01:25 EST 2017 by tim 2017-03-06 14:01:25 -05:00
Tim Edwards 2b7d416a41 A few corrections to the JSON format output. 2017-03-06 14:01:14 -05:00
Tim Edwards 090e9e122a Merge branch 'master' into work 2017-03-03 09:11:54 -05:00
Tim Edwards 67f1c1a2e9 Update at Fri Mar 3 09:11:52 EST 2017 by tim 2017-03-03 09:11:52 -05:00
Tim Edwards a7dcb4ef45 Corrected new JSON file output format from netgen. 2017-03-03 09:11:30 -05:00
Tim Edwards a0f1b4cc92 Merge branch 'master' into work 2017-02-27 09:36:54 -05:00
Tim Edwards b5d5496e40 Update at Mon Feb 27 09:36:52 EST 2017 by tim 2017-02-27 09:36:52 -05:00
Tim Edwards 7cac67c81b Corrected an error in the property match subroutine that was failing
to stop at the end of an instance record without properties, leading
to strange errors where netgen declares "There were property errors"
but does not print any errors (because there aren't any).
2017-02-27 09:35:18 -05:00
Tim Edwards ede7406b08 Merge branch 'master' into work 2017-02-08 15:17:01 -05:00
Tim Edwards 516d1c33fb Update at Wed Feb 8 15:16:59 EST 2017 by tim 2017-02-08 15:16:59 -05:00
Tim Edwards 0ad5730701 Corrected an error where snprintf() was not used when printing
formatted side-by-side output, causing a crash for names that
exceed the 40-column limit.
2017-02-08 15:16:24 -05:00
Tim Edwards 24d98ff0d3 Removed backup file for netgen.tcl.in, and made corrections for
the output JSON format, which was incorrect when some entries
were empty.
2017-01-09 17:06:23 -05:00
Tim Edwards 092c99dc1b Merge branch 'master' into work 2017-01-09 12:53:00 -05:00
Tim Edwards 4659b0795d Update at Mon Jan 9 12:52:59 EST 2017 by tim 2017-01-09 12:52:59 -05:00
Tim Edwards b1924bff65 Finished implementing the Tcl list output format, and added a
routine to convert the list output format to a JSON output file,
for easy readback, parsing, and display using python.
2017-01-09 12:51:31 -05:00
Tim Edwards bd356553fd Merge branch 'master' into work 2017-01-07 06:57:27 -05:00
Tim Edwards 46458f2836 Update at Sat Jan 7 06:57:25 EST 2017 by tim 2017-01-07 06:57:25 -05:00
Tim Edwards 8deccaad9c Fixed a bug in the combine routine that causes a segfault; added
preliminary support for a Tcl list output format.
2017-01-07 06:56:51 -05:00
Tim Edwards 4f24915661 Correction to device property matching code to fix a problem that
caused LVS(A, B) to give different results for property errors
than LVS(B, A).
2016-12-12 13:31:56 -05:00
Tim Edwards fdab366627 Corrected typo with == vs. = 2016-12-12 11:51:24 -05:00
Tim Edwards 310d7512a0 Removed backup file. 2016-12-12 11:32:52 -05:00
Tim Edwards 86f52b164a Merge branch 'master' into work 2016-12-12 11:32:44 -05:00
Tim Edwards 4a47c3076d Update at Mon Dec 12 11:32:42 EST 2016 by tim 2016-12-12 11:32:42 -05:00
Tim Edwards 777498b30e Completed the implementation of serial/parallel device network
matching.
2016-12-12 11:32:07 -05:00
Tim Edwards 8300531858 Fixed an error that prevented 'circuit1' and 'circuit2' from being
used in the general cell name format as advertised (in fact caused
a segfault), without which all setup file have to be very circuit-
specific.
2016-12-07 22:22:57 -05:00
Tim Edwards 80378d8816 Several errors in the serial combination code fixed, and then
the serial combination routine was disabled so as not to post a
non-working version, since the parallel/serial property networks
are not analyzed.  This should be completed soon.
2016-12-07 21:21:15 -05:00
Tim Edwards 80d981a672 Merge branch 'master' into work 2016-12-07 15:01:56 -05:00
Tim Edwards 809a3c16e9 Update at Wed Dec 7 15:01:55 EST 2016 by tim 2016-12-07 15:01:55 -05:00
Tim Edwards 8d976e5686 Added more handling of serial/parallel device networks, including
making any subcircuit serializable by using the new command option
"property (device) serial|parallel enable|disable".  Note that as
of this commit, serial device detection is enabled but serial
networks are not collapsed for matching, which will tend to lead
to property errors in serial devices until this code is added,
which should be in a day or two.
2016-12-07 14:57:43 -05:00
Tim Edwards 577dfb5a28 Merge branch 'master' into work 2016-11-11 09:52:19 -05:00
Tim Edwards 46252ad6b9 Update at Fri Nov 11 09:52:18 EST 2016 by tim 2016-11-11 09:52:18 -05:00
Tim Edwards 564fab9667 Corrected an error in which property types were not promoted if
an instance property did not match the cell property type, as
long as the cell property types of the two compared cells matched.
Along with a recent change that left "M" as a type double during
SPICE netlist read-in, this caused "M" mismatches to be ignored,
because the double value was ignored and the integer value was
always zero.
2016-11-11 09:49:37 -05:00
Tim Edwards 0df4190e19 Merge branch 'master' into work 2016-10-26 21:21:10 -04:00
Tim Edwards 2f661ea256 Update at Wed Oct 26 21:21:09 EDT 2016 by tim 2016-10-26 21:21:10 -04:00
Tim Edwards fca075e1ed Disabled the newest unfinished experimental code, which was not
supposed to have been pushed to git yet.
2016-10-26 21:20:42 -04:00
Tim Edwards cc2a5e0ee6 Merge branch 'master' into work 2016-10-25 11:29:17 -04:00
Tim Edwards b7a8d3cfda Update at Tue Oct 25 11:29:17 EDT 2016 by tim 2016-10-25 11:29:17 -04:00
Tim Edwards 0205902baa Changed behavior of property mismatch reporting. This is to help
avoid the problem where non-critical properties cause devices not
to match, resulting in apparent mismatches of matched devices.
The current behavior now prints a statement about each device.
However, the result is still somewhat ambiguous.
2016-10-25 11:26:45 -04:00
Tim Edwards 646b351ee5 Merge branch 'master' into work 2016-10-24 13:43:30 -04:00
Tim Edwards 31a0f10602 Update at Mon Oct 24 13:43:29 EDT 2016 by tim 2016-10-24 13:43:29 -04:00
Tim Edwards a2b1f5c85f Removed all instances of macro INLINE, as this is showing up now
as failing on certain compilers.  This undoubtedly reflects some
change in gcc or the OS setup, but since modern compilers should
be able to figure out for themselves when to inline a subroutine
(or not), the inline hint is somewhat arcane and unnecessary.
2016-10-24 13:42:08 -04:00
Tim Edwards 9148edde69 Implemented command option 'ignore shorted', same syntax as
'ignore class', but removes instances of the specified class whose
pins are shorted together.  Currently requires that all pins must
be shorted together.
2016-10-18 14:17:57 -04:00
Tim Edwards bb07a84ae1 Corrected error that fails to remove property records of any
instance that is deleted because it has been ignored with the
'ignore' command.
2016-10-18 10:19:49 -04:00
Tim Edwards d753e2c208 Merge branch 'master' into work 2016-10-18 09:59:37 -04:00
Tim Edwards bd3b88de4a Update at Tue Oct 18 09:59:36 EDT 2016 by tim 2016-10-18 09:59:36 -04:00
Tim Edwards 668aa38340 Corrected error in property matching, especially to handle problems
with missing properties in instances that prevent matching (underlines
need to add the code to apply defaults from the object where these
occur).
2016-10-18 09:58:00 -04:00
Tim Edwards d99bffa74f Merge branch 'master' into work 2016-10-17 17:47:56 -04:00
Tim Edwards 7ce3b1dcd8 Update at Mon Oct 17 17:47:55 EDT 2016 by tim 2016-10-17 17:47:55 -04:00
Tim Edwards 366821fe7f Corrected parsing of resistor and capacitor values to include
CDL-style expressions as well as numerical values.
2016-10-17 17:47:27 -04:00
Tim Edwards 7ef7ae36de Merge branch 'master' into work 2016-09-20 21:51:09 -04:00
Tim Edwards 675b3e0743 Update at Tue Sep 20 21:51:09 EDT 2016 by tim 2016-09-20 21:51:09 -04:00
Tim Edwards cad7e0e293 First attempt to properly use the Tcl/Tk stubs library feature. 2016-09-20 21:50:48 -04:00
Tim Edwards 19fdbfd185 Merge branch 'master' into work 2016-09-09 09:47:45 -04:00
Tim Edwards 22c2a31e7f Update at Fri Sep 9 09:47:45 EDT 2016 by tim 2016-09-09 09:47:45 -04:00
Tim Edwards 950bb976e6 (1) Corrected output of "nodes" command, which was not handling the
leading '/' of pin names and therefore failing to print anything;
(2) Corrected 'addproxies', which was ending abruptly at the end of
a circuit's object list, such that if an instance needing proxy pins
added was the last object in the circuit, it would not get the proxy
pins added, and therefore would fail LVS.
2016-09-09 09:45:32 -04:00
Tim Edwards b7363862b3 Merge branch 'master' into work 2016-09-08 22:08:22 -04:00
Tim Edwards 29566bde4d Update at Thu Sep 8 22:08:20 EDT 2016 by tim 2016-09-08 22:08:20 -04:00
Tim Edwards 99d096cfc1 Corrected error in tclnetgen for command option "property default",
which did not return from the command after processing the "default"
option.
2016-09-08 22:07:35 -04:00
Tim Edwards 9943676df4 Merge branch 'master' into work 2016-07-21 11:24:28 -04:00
Tim Edwards 568ed65c05 Update at Thu Jul 21 11:24:27 EDT 2016 by tim 2016-07-21 11:24:27 -04:00
Tim Edwards cb85aa7115 Updated configure script to extract the paths for the Tcl and Tk
lib and include files, so that subsequent checks for those files
are not disjoint from the contents of tclConfig.sh and tkConfig.sh.
2016-07-21 11:24:21 -04:00
Tim Edwards be819b7200 Added resistors and inductors to the list of devices whose merging
properties are defined by "property default".
2016-07-16 15:48:51 -04:00
Tim Edwards 618f912cac Implemented critical property combining in parallel for devices
such as resistors.
2016-07-16 15:44:17 -04:00
Tim Edwards 17c2bff72b Added command option "property default" which acts similarly to
"permute default" by (1) handling the usual case for MOSFETs
(resistors and adding in parallel not yet implemented), and
(2) being done automatically when no setup script is specified.
2016-07-16 14:27:31 -04:00
Tim Edwards 7e68f3a32e Merge branch 'master' into work 2016-07-16 13:52:35 -04:00
Tim Edwards c60443b862 Update at Sat Jul 16 13:52:34 EDT 2016 by tim 2016-07-16 13:52:34 -04:00
Tim Edwards 4a295dbfe4 Corrected use of strdup instead of strsave, which causes a different
malloc() to be called and can cause crashes.
2016-07-16 13:51:53 -04:00
Tim Edwards eb72af6d54 Removed the deprecated file flatten.c.bak. 2016-07-11 08:50:22 -04:00
Tim Edwards e7f2cacc88 Merge branch 'master' into work 2016-07-11 08:49:53 -04:00
Tim Edwards 7dfe6ee19f Update at Mon Jul 11 08:49:52 EDT 2016 by tim 2016-07-11 08:49:52 -04:00
Tim Edwards c7f27c909f Finished basic implementation of matching device properties to
include calculations of effective width due to the addition of
width of multiple device instances in parallel.  The original
behavior of splitting all "M=" devices into individual instances
has been effectively inverted, instead combining all parallel
devices of the same class into one, with multiple property
records for devices with non-matching properties (e.g., width,
length, etc.).  Property matching combines devices with different
"critical properties" (e.g., FET gate width) if these are defined
in the setup using the "property merge" command.

Not yet done:  Matching of multiple property records when
critial properties are not defined, handling of critical properties
that combine in parallel instead of simple addition, handling of
devices that combine in series, and the combination of non-critical
properties (e.g., source and drain area, although these are usually
removed from matching).
2016-07-11 08:41:07 -04:00
Tim Edwards 758b5a249a Extended the prematching phase to include matching of devices
based on properties that can be traded with number of devices,
such as MOSFET width, by merging.  This initial implementation
is somewhat limited, only dealing with properties that merge
by summing.  Only devices that do not match at all in the other
circuit will be considered for merging.  The feature includes
a command option "property ... merge ..." that allows control
over which devices can and cannot be merged.
2016-06-23 22:27:34 -04:00
Tim Edwards 15d10f1d93 Merge branch 'master' into work 2016-06-23 10:18:49 -04:00
Tim Edwards a6e3e7e457 Update at Thu Jun 23 10:18:47 EDT 2016 by tim 2016-06-23 10:18:47 -04:00
Tim Edwards 5f634b2a91 Overhaul of the hash table method. Original method used global
variables to iterate over hash table contents.  This led to the
inability to nest hash table iterators.  Fixed by defining a
wrapper structure that holds the actual hash table plus the size
and iterator indexes.  Not only does this solve the nesting
problem, but it also avoids the need to pass the hash table size
on every call, and that reduces the number of ways a hash table
subroutine can go wrong (e.g., cannot access the table out of
bounds simply by passing a size that is larger than was used to
initialize the table).
2016-06-23 10:13:18 -04:00
Tim Edwards cbb2f78ee9 Merge branch 'master' into work 2016-05-19 16:46:33 -04:00
Tim Edwards 99c942eb2b Update at Thu May 19 16:46:32 EDT 2016 by tim 2016-05-19 16:46:32 -04:00
Tim Edwards 4306562a1a Corrected a previously-working output of a list of cells with property
errors at the end of LVS.  The result of "verify matching" got
overwritten by the result from matching pins, erasing the information
about a cell having property errors.
2016-05-19 16:45:27 -04:00
Tim Edwards 2f8d50159f Merge branch 'master' into work 2016-05-17 09:05:10 -04:00
Tim Edwards bbc9110431 Update at Tue May 17 09:05:09 EDT 2016 by tim 2016-05-17 09:05:09 -04:00
Tim Edwards f9c4fc86a0 Prevented error messages about undefined properties for devices. 2016-05-17 09:03:18 -04:00
Tim Edwards e0527a0a89 Corrected the "property tolerance" command in tclnetgen, and cleaned up
some of the property matching output.
2016-05-16 17:33:15 -04:00
Tim Edwards be6a5a87ce Updated the .gitignore file to avoid the .log and .so files. 2016-05-16 13:11:35 -04:00
Tim Edwards 317eb8ff0f Removed files that should not be in the git repository 2016-05-16 13:10:58 -04:00
Tim Edwards 6bf29235bc Added additional diagnostic statements. 2016-05-16 13:09:19 -04:00
Tim Edwards 6428d5995c Merge branch 'master' into work 2016-05-16 10:55:54 -04:00
Tim Edwards acd9a0e846 Update at Mon May 16 10:55:53 EDT 2016 by tim 2016-05-16 10:55:53 -04:00
Tim Edwards 7edeb2e37d Fairly extensive modifications that allow for handling of, and
comparisons between, duplicate cells (cells with the same netlist
that may have more than one name in a circuit, or which for some
reason appear with the same name more than once in a netlist).
Added more checks to the list prematching, which prevents various
troubles with cells having a mismatched hierarchy.  Added a
command option to "flatten class" to flatten instances only within
a specific cell.  Corrected one error in the pin matching routine.
Added a check in the pin matching routine to look for pins that
have been found to be no-connects after cleaning up the pin lists
of the children of that cell.
2016-05-16 10:50:12 -04:00
Tim Edwards 06d772edd0 Fixed a potential crash condition in uniquepins(). 2016-05-05 11:27:23 -04:00
Tim Edwards 9ae51e0150 Merge branch 'master' into work 2016-05-05 10:12:59 -04:00
Tim Edwards f7cbae9efe Update at Thu May 5 10:12:58 EDT 2016 by tim 2016-05-05 10:12:58 -04:00
Tim Edwards 086495bc28 Corrected a line in FlattenUnmatched that would cause an
infinite loop if attempting to flatten an empty cell.
2016-05-05 10:12:23 -04:00
Tim Edwards 846ab5369a Corrected an error causing a segfault on property mismatches where
one cell is missing properties (failed to check for a NULL value
before checking values internal to the structure that was NULL).
2016-03-20 15:56:39 -04:00
Tim Edwards 8667bf0799 Corrected an additional error that let PropertyMatch() be called
with arguments swapped with respect to Circuit1, Circuit2 definitions,
which are fixed in PropertyMatch().
2016-03-20 12:34:24 -04:00
Tim Edwards 0caf47006c Additional measure to ensure that name altered to avoid cross-
netlist naming conflicts does not also cause a naming conflict.
2016-03-20 11:55:51 -04:00
Tim Edwards a7a94ab2be Merge branch 'master' into work 2016-03-20 11:44:06 -04:00
Tim Edwards d612485a9b Update at Sun Mar 20 11:44:06 EDT 2016 by tim 2016-03-20 11:44:06 -04:00
Tim Edwards b245b79c20 Corrected handling of name matching so that if the setup file
equates class "a" in circuit 1 with class "b" in circuit2, and
if circuit 1 has a class called "b" and/or circuit 2 has a class
called "a", then both classes are given a new hash to avoid
conflicts with the (presumably) unrelated cells of the same name
in the other netlist.
2016-03-20 11:41:41 -04:00
Tim Edwards c11252f196 Merge branch 'master' into work 2016-03-16 12:06:39 -04:00
Tim Edwards 5735181f88 Update at Wed Mar 16 12:06:38 EDT 2016 by tim 2016-03-16 12:06:38 -04:00
Tim Edwards 6e144bf5fe Corrected the device pre-matching routine to not segfault when
a cell has zero instances in one of the surveyed cells.
2016-03-16 12:05:51 -04:00
40 changed files with 12354 additions and 4787 deletions
+12 -9
View File
@@ -1,10 +1,13 @@
*.*%
*.cdslck
.inca.db.*
inca.*.pak
*.swp
netgen
netgenexec
defs.mak
Depend
config.cache
config.log
config.status
*.o
*.so
*~
*/av_extracted*/
.nfs*
*.cd-
*/mommdl/
*.log
UPDATE_ME
VERSION
+6 -5
View File
@@ -1,15 +1,14 @@
TO_DO list for version 1.5
------------------------------
1) Parallel (transistors and capacitors) and serial (resistors)
device merging, plus methods for describing how any device
class may be merged.
As of version 1.5.70, the major to-do item list is complete.
Possible useful additions (not critical)
----------------------
1) Add new output style allowing netlists to be described by Tcl scripts
(similar to the C-Code format, but does not require compiling).
(similar to the C-Code format, but does not require compiling) (this
was done in 1.5.72, but now needs some scripts to make use of it.)
2) Add automatic file format guessing from file extension for "write" command
3) Add Tk GUI to match (and improve upon!) the original X11 GUI.
4) Incorporate into Tcl-based xcircuit
@@ -33,5 +32,7 @@ Possible useful additions (not critical)
ntk and ext formats, SPICE format writing, and sim format reading).
11) Add a "property" command to add/remove properties to check, and change
the slop values (done).
12) Add a "subcircuit" command to mimic a SPICE ".SUBCKT ... .ENDS" card.
12) Add a "subcircuit" command to mimic a SPICE ".SUBCKT ... .ENDS" card
(i.e., the ability to add subcircuit "stub" definitions from the
command line or from a setup file).
+1 -1
View File
@@ -1 +1 @@
1.5.48
1.5.94
+5 -5
View File
@@ -39,7 +39,7 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#define ACTELHASHSIZE 99
static long actelhashbase = 0xA00;
static struct hashlist *actelnametab[ACTELHASHSIZE];
static struct hashdict actelnamedict;
static FILE *actelfile;
char *ActelName(char *Name);
@@ -53,16 +53,16 @@ void PrintActelNames(char *filename)
{
if (filename == NULL) actelfile = stdout;
else actelfile = fopen(filename,"w");
RecurseHashTable(actelnametab, ACTELHASHSIZE, PrintActelName);
RecurseHashTable(&actelnamedict, PrintActelName);
if (actelfile != stdout) fclose(actelfile);
}
long ActelNameHash(char *name)
/* hashes name into nametab if necessary, then returns address of entry */
/* hashes name into namedict if necessary, then returns address of entry */
{
struct hashlist *p;
p = HashInstall(name, actelnametab, ACTELHASHSIZE);
p = HashInstall(name, &actelnamedict);
if (p == NULL) return(0);
if (p->ptr != NULL) return ((long)(p->ptr));
actelhashbase++;
@@ -403,7 +403,7 @@ void Actel(char *name, char *filename)
return;
}
ClearDumpedList();
InitializeHashTable(actelnametab, ACTELHASHSIZE);
InitializeHashTable(&actelnamedict, ACTELHASHSIZE);
if (LookupCell(name) != NULL)
actelCell(name);
CloseFile(FileName);
-1
View File
@@ -20,7 +20,6 @@ int MaxCPUTime = 100; /* max number of seconds to burn */
#define MAX_CHANGES_PER_ITER 2
#if 0
/* INLINE */
float RandomUniform(void)
{
/* DANGER! DANGER! Non-portable code below!! */
-4
View File
@@ -36,7 +36,6 @@ int CountFanoutOK;
int CountSwallowedElements;
INLINE
int Independent(int E1, int E2)
/* return 1 if E1 and E2 share no leaves in common */
{
@@ -47,7 +46,6 @@ int Independent(int E1, int E2)
return(1);
}
INLINE
int FanoutOK(int E1, int E2)
{
int approxfanout;
@@ -67,7 +65,6 @@ int FanoutOK(int E1, int E2)
}
INLINE
int Swallowed(int Parent, int Child)
/* returns 1 if Child's fanout is contained in Parent's */
{
@@ -107,7 +104,6 @@ int SmallEnough(int E1, int E2)
}
#endif
INLINE
int SuccessfulEmbedding(int E)
/* returns 1 if element E is a successful embedding */
{
-9
View File
@@ -117,15 +117,6 @@
#define memzero(ptr, len) memset(ptr, 0, len)
#endif
#ifndef INLINE
#ifdef __GNUC__
#define INLINE inline
#else
#define INLINE
#endif /* __GNUC__ */
#endif
#ifdef HAVE_SYSV_STRING
#undef NEED_STRING
#endif
-3
View File
@@ -348,7 +348,6 @@ void PRINTPACKED(unsigned long *mstar)
#ifdef IBMPC
static unsigned int lochash(unsigned long *mstar)
#else
INLINE
static unsigned long lochash(unsigned long *mstar)
#endif
{
@@ -432,7 +431,6 @@ static struct ex_entry *hashinstall(unsigned long *mstar)
return(ex_tab[hashval] = np);
}
/* INLINE */
int Exists(int E1, int E2)
{
int i;
@@ -470,7 +468,6 @@ int InitializeExistTest(void)
return(1);
}
/* INLINE */
void AddToExistSet(int E1, int E2)
{
int i;
+5 -5
View File
@@ -170,7 +170,7 @@ char *ReadExt(char *fname, int doflat, int *fnum)
SetExtension(name, fname, EXT_EXTENSION);
if ((filenum = OpenParseFile(name, *fnum)) < 0) {
Printf("No file: %s\n",name);
Printf("Error in ext file read: No file %s\n",name);
*fnum = filenum;
return NULL;
}
@@ -544,10 +544,10 @@ void simCell(char *name, int filenum)
if (ob2 && ob2->type == PROPERTY) {
struct property *kl;
struct valuelist *vl;
kl = (struct property *)HashLookup("length", tp2->proptab, OBJHASHSIZE);
kl = (struct property *)HashLookup("length", &(tp2->propdict));
vl = (struct valuelist *)ob2->instance.name;
l = 1.0e6 * vl[kl->idx].value.dval; /* m -> um */
kl = (struct property *)HashLookup("width", tp2->proptab, OBJHASHSIZE);
kl = (struct property *)HashLookup("width", &(tp2->propdict));
w = 1.0e6 * vl[kl->idx].value.dval; /* m -> um */
}
FlushString(" %g %g\n", l, w);
@@ -579,7 +579,7 @@ void simCell(char *name, int filenum)
if (ob2 && ob2->type == PROPERTY) {
struct property *kl;
struct valuelist *vl;
kl = (struct property *)HashLookup("value", tp2->proptab, OBJHASHSIZE);
kl = (struct property *)HashLookup("value", &(tp2->propdict));
vl = (struct valuelist *)ob2->instance.name;
if (tp2->class == CLASS_CAP)
v = 1.0e15 * vl[kl->idx].value.dval; /* F -> fF */
@@ -643,7 +643,7 @@ char *ReadSim(char *fname, int *fnum)
SetExtension(name, fname, SIM_EXTENSION);
if (OpenParseFile(name, *fnum) < 0) {
Printf("No file: %s\n",name);
Printf("Error in ext file read: No file %s\n",name);
*fnum = filenum;
return NULL;
}
+411 -81
View File
@@ -24,6 +24,7 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "config.h"
#include <stdio.h>
#include <math.h>
#ifdef IBMPC
#include <alloc.h>
@@ -39,6 +40,8 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "print.h"
#include "netcmp.h"
extern struct hashdict spiceparams;
#define OLDPREFIX 1
void flattenCell(char *name, int file)
@@ -95,7 +98,7 @@ void flattenCell(char *name, int file)
if (ChildCell->dumped == 0) flattenCell(ParentParams->model.class,
ChildCell->file);
ChildObjList = CopyObjList(ChildCell->cell);
ChildObjList = CopyObjList(ChildCell->cell, 1);
/* update node numbers in child to unique numbers */
oldmax = 0;
@@ -177,7 +180,7 @@ void flattenCell(char *name, int file)
}
}
}
HashPtrInstall(tmp->name, tmp, ThisCell->objtab, OBJHASHSIZE);
HashPtrInstall(tmp->name, tmp, &(ThisCell->objdict));
continue;
}
@@ -198,9 +201,9 @@ void flattenCell(char *name, int file)
#endif
FreeString(tmp->instance.name);
tmp->instance.name = strsave(tmpstr);
HashPtrInstall(tmp->name, tmp, ThisCell->objtab, OBJHASHSIZE);
HashPtrInstall(tmp->name, tmp, &(ThisCell->objdict));
if (tmp->type == FIRSTPIN)
HashPtrInstall(tmp->instance.name, tmp, ThisCell->insttab, OBJHASHSIZE);
HashPtrInstall(tmp->instance.name, tmp, &(ThisCell->instdict));
}
/* splice instance out of parent */
@@ -249,6 +252,7 @@ void flattenCell(char *name, int file)
int flattenInstancesOf(char *name, int fnum, char *instance)
{
struct objlist *ParentParams;
struct objlist *ParentProps;
struct objlist *NextObj;
struct objlist *ChildObjList;
struct nlist *ThisCell;
@@ -308,12 +312,20 @@ int flattenInstancesOf(char *name, int fnum, char *instance)
if (ChildCell->class != CLASS_SUBCKT) continue;
if (ChildCell == ThisCell) continue; // Avoid infinite loop
/* Does the parent cell have properties? If so, save a pointer to them */
for (ParentProps = ParentParams->next; ParentProps &&
ParentProps->type != FIRSTPIN;
ParentProps = ParentProps->next) {
if (ParentProps->type == PROPERTY) break;
}
if (ParentProps && (ParentProps->type != PROPERTY)) ParentProps = NULL;
/* not primitive, so need to flatten this instance */
notdone = 1;
/* if this is a new instance, flatten it */
/* if (ChildCell->dumped == 0) flattenCell(ParentParams->model.class, file); */
ChildObjList = CopyObjList(ChildCell->cell);
ChildObjList = CopyObjList(ChildCell->cell, 1);
numflat++;
/* update node numbers in child to unique numbers */
@@ -381,7 +393,8 @@ int flattenInstancesOf(char *name, int fnum, char *instance)
/* delete all ports at beginning of list */
if (Debug) Printf("deleting leading port from child\n");
tmp = ChildObjList->next;
FreeObjectAndHash(ChildObjList, ChildCell);
// FreeObjectAndHash(ChildObjList, ChildCell);
FreeObject(ChildObjList);
ChildObjList = tmp;
}
tmp = ChildObjList;
@@ -389,7 +402,8 @@ int flattenInstancesOf(char *name, int fnum, char *instance)
if (IsPort(tmp->next)) {
ob2 = (tmp->next)->next;
if (Debug) Printf("deleting a port from child\n");
FreeObjectAndHash(tmp->next, ChildCell);
// FreeObjectAndHash(tmp->next, ChildCell);
FreeObject(tmp->next);
tmp->next = ob2;
}
else tmp = tmp->next;
@@ -404,7 +418,9 @@ int flattenInstancesOf(char *name, int fnum, char *instance)
prefixlength = strlen(tmpstr);
#endif
for (tmp = ChildObjList; tmp != NULL; tmp = tmp->next) {
if (tmp->type == PROPERTY) continue;
if (tmp->type == PROPERTY)
continue;
else if (IsGlobal(tmp)) {
/* Keep the name but search for node of same name in parent */
/* and replace the node number, if found. */
@@ -427,7 +443,7 @@ int flattenInstancesOf(char *name, int fnum, char *instance)
}
// Don't hash this if the parent had a port of this name
if (!ob2 || ob2->type != PORT)
HashPtrInstall(tmp->name, tmp, ThisCell->objtab, OBJHASHSIZE);
HashPtrInstall(tmp->name, tmp, &(ThisCell->objdict));
continue;
}
@@ -448,29 +464,52 @@ int flattenInstancesOf(char *name, int fnum, char *instance)
#endif
FreeString(tmp->instance.name);
tmp->instance.name = strsave(tmpstr);
HashPtrInstall(tmp->name, tmp, ThisCell->objtab, OBJHASHSIZE);
HashPtrInstall(tmp->name, tmp, &(ThisCell->objdict));
if (tmp->type == FIRSTPIN)
HashPtrInstall(tmp->instance.name, tmp, ThisCell->insttab, OBJHASHSIZE);
HashPtrInstall(tmp->instance.name, tmp, &(ThisCell->instdict));
}
/* Do property inheritance */
if (ParentProps) {
for (ob2 = ChildObjList; ob2 != NULL; ob2=ob2->next) {
/* If the parent cell has properties to declare, then */
/* pass them on to children. Use globals only if the */
/* spiceparams dictionary is active (during file reading */
/* only). */
if (ob2->type == PROPERTY)
ReduceExpressions(ob2, ParentProps, ChildCell,
(spiceparams.hashtab == NULL) ? 0 : 1);
}
}
/* splice instance out of parent */
if (ParentParams == ThisCell->cell) {
/* ParentParams are the very first thing in the list */
ThisCell->cell = ChildObjList;
for (ob2 = ChildObjList; ob2 && ob2->next != NULL; ob2 = ob2->next) ;
if ((ParentParams == ThisCell->cell) && (ChildObjList == NULL)) {
ThisCell->cell = ob2; /* Child cell was empty */
tmp = ob2;
}
else {
/* find ParentParams in ThisCell list */
for (ob2 = ThisCell->cell; ob2 && ob2->next != ParentParams; ob2=ob2->next);
if (ob2)
for (ob2->next = ChildObjList; ob2->next != NULL; ob2 = ob2->next) ;
if (ParentParams == ThisCell->cell) {
/* ParentParams are the very first thing in the list */
ThisCell->cell = ChildObjList;
for (ob2 = ChildObjList; ob2 && ob2->next != NULL; ob2 = ob2->next) ;
}
else {
/* find ParentParams in ThisCell list */
for (ob2 = ThisCell->cell; ob2 && ob2->next != ParentParams; ob2=ob2->next);
if (ob2)
for (ob2->next = ChildObjList; ob2->next != NULL; ob2 = ob2->next) ;
}
/* now, ob2 is last element in child list, so skip and reclaim parent */
tmp = ParentParams;
do {
tmp = tmp->next;
} while ((tmp != NULL) && ((tmp->type > FIRSTPIN) || (tmp->type == PROPERTY)));
if (ob2) ob2->next = tmp;
}
/* now, ob2 is last element in child list, so skip and reclaim parent */
tmp = ParentParams;
do {
tmp = tmp->next;
} while ((tmp != NULL) && (tmp->type > FIRSTPIN));
if (ob2) ob2->next = tmp;
while (ParentParams != tmp) {
ob2 = ParentParams->next;
FreeObjectAndHash(ParentParams, ThisCell);
@@ -487,8 +526,8 @@ int flattenInstancesOf(char *name, int fnum, char *instance)
void Flatten(char *name, int file)
{
ClearDumpedList(); /* keep track of flattened cells */
flattenCell(name, file);
ClearDumpedList(); /* keep track of flattened cells */
flattenCell(name, file);
}
@@ -499,9 +538,22 @@ int flattenoneentry(struct hashlist *p, int file)
struct nlist *ptr;
ptr = (struct nlist *)(p->ptr);
if (file == ptr->file)
if (file == ptr->file) {
if (!(*matchfunc)(ptr->name, model_to_flatten) && (ptr->class == CLASS_SUBCKT))
flattenInstancesOf(ptr->name, file, model_to_flatten);
else if (ptr->flags & CELL_DUPLICATE) {
char *bptr = strstr(ptr->name, "[[");
if (bptr != NULL) {
*bptr = '\0';
if (!(*matchfunc)(ptr->name, model_to_flatten)
&& (ptr->class == CLASS_SUBCKT)) {
*bptr = '[';
flattenInstancesOf(ptr->name, file, model_to_flatten);
}
*bptr = '[';
}
}
}
return(1);
}
@@ -652,7 +704,7 @@ void convertGlobalsOf(char *name, int fnum, char *instance)
newnode->instance.name = NULL;
newnode->model.class = NULL;
newpin->node = maxnode;
HashPtrInstall(newnode->name, newnode, ThisCell->objtab, OBJHASHSIZE);
HashPtrInstall(newnode->name, newnode, &(ThisCell->objdict));
}
// Remove any references to the net as a GLOBAL type in the instance
@@ -675,7 +727,7 @@ void convertGlobalsOf(char *name, int fnum, char *instance)
// Now there should be only one object of this name in the instance,
// which is the pin, and we will set the hash table to point to it.
HashPtrInstall(newpin->name, newpin, ThisCell->objtab, OBJHASHSIZE);
HashPtrInstall(newpin->name, newpin, &(ThisCell->objdict));
}
CacheNodeNames(ThisCell);
@@ -788,7 +840,7 @@ void ConvertGlobals(char *name, int filenum)
strsave(ObjList->instance.name) : NULL;
NewObj->name = (ObjList->name) ? strsave(ObjList->name) : NULL;
HashPtrInstall(NewObj->name, NewObj, ThisCell->objtab, OBJHASHSIZE);
HashPtrInstall(NewObj->name, NewObj, &(ThisCell->objdict));
/* Find all parent cells of this cell. Find the global node */
/* if it exists or create it if it doesn't. Add the node to */
@@ -907,15 +959,15 @@ struct nlist *uniquepins(struct hashlist *p, void *clientdata)
modified = 1;
// Check if the node we're about to remove is in the
// objtab hash table; if so, replace it with the one
// objdict hash table; if so, replace it with the one
// that we are going to keep.
if (LookupObject(ob->name, ptr) == ob) {
HashPtrInstall(ob->name, saveob, ptr->objtab, OBJHASHSIZE);
HashPtrInstall(ob->name, saveob, &(ptr->objdict));
}
}
tob = tob->next;
if (tob->type != PORT && tob->type != UNKNOWN) break;
if (tob == NULL || (tob->type != PORT && tob->type != UNKNOWN)) break;
}
/* 2nd pass---remove the pins */
@@ -941,12 +993,12 @@ struct nlist *uniquepins(struct hashlist *p, void *clientdata)
ob = ob->next;
}
tob = tob->next;
if (tob->type != PORT && tob->type != UNKNOWN) break;
if (tob == NULL || (tob->type != PORT && tob->type != UNKNOWN)) break;
}
// Renumber the pins in order. Since when removing duplicates, the
// first entry is always kept, the first pin is never changed, so
// the insttab record is never corrupted.
// the instdict record is never corrupted.
i = FIRSTPIN;
firstpin->type = i++;
@@ -1041,8 +1093,7 @@ int UniquePins(char *name, int filenum)
// The hash table is pointing at the cell we are
// about to delete. Hash the one we're keeping instead.
HashPtrInstall(ob->name, firstport[ob->node],
ThisCell->objtab, OBJHASHSIZE);
HashPtrInstall(ob->name, firstport[ob->node], &(ThisCell->objdict));
}
if (lob == NULL) {
@@ -1079,7 +1130,7 @@ int UniquePins(char *name, int filenum)
/* Callback function for CleanupPins */
/* Note that if the first pin of the instance is a */
/* disconnected node, then removing it invalidates the */
/* insttab hash. */
/* instdict hash. */
/*------------------------------------------------------*/
struct nlist *cleanuppins(struct hashlist *p, void *clientdata)
@@ -1129,9 +1180,9 @@ struct nlist *cleanuppins(struct hashlist *p, void *clientdata)
}
// Check if the node we're about to remove is in the
// objtab hash table
// objdict hash table
if (LookupObject(ob->name, ptr) == ob) {
HashDelete(ob->name, ptr->objtab, OBJHASHSIZE);
HashDelete(ob->name, &(ptr->objdict));
}
FREE(ob->name);
@@ -1147,10 +1198,9 @@ struct nlist *cleanuppins(struct hashlist *p, void *clientdata)
obt = obt->next;
}
/* Rehash the insttab, in case the first pin got removed */
/* Rehash the instdict, in case the first pin got removed */
if (firstpin && (firstpin->type == FIRSTPIN))
HashPtrInstall(firstpin->instance.name, firstpin, ptr->insttab,
OBJHASHSIZE);
HashPtrInstall(firstpin->instance.name, firstpin, &(ptr->instdict));
}
}
return NULL; /* Keep the search going */
@@ -1180,6 +1230,10 @@ int CleanupPins(char *name, int filenum)
return 0;
}
// If cell is type MODULE, this is a black-box circuit and
// pins are expected to be disconnected (so don't remove them).
if (ThisCell->class == CLASS_MODULE) return 0;
// Avoid a loop through all cells unless we have to do it.
for (ob = ThisCell->cell; ob != NULL; ob = ob->next) {
@@ -1204,7 +1258,11 @@ int CleanupPins(char *name, int filenum)
lob = NULL;
for (ob = ThisCell->cell; ob != NULL; ) {
if (ob->type == UNKNOWN) continue;
if (ob->type == UNKNOWN) {
lob = ob;
ob = ob->next;
continue;
}
else if (ob->type != PORT) break;
nob = ob->next;
if (ob->node == -1) {
@@ -1216,9 +1274,9 @@ int CleanupPins(char *name, int filenum)
}
// Check if the node we're about to remove is in the
// objtab hash table
// objdict hash table
if (LookupObject(ob->name, ThisCell) == ob) {
HashDelete(ob->name, ThisCell->objtab, OBJHASHSIZE);
HashDelete(ob->name, &(ThisCell->objdict));
}
FREE(ob->name);
@@ -1243,48 +1301,71 @@ typedef struct ecompare {
char refcount;
} ECompare;
typedef struct ecomplist *ECompListPtr;
typedef struct ecomplist {
ECompare *ecomp;
ECompListPtr next;
} ECompList;
/*------------------------------------------------------*/
/* Survey the contents of a cell and
/* Survey the contents of a cell and sort into a hash */
/*------------------------------------------------------*/
void
SurveyCell(struct nlist *tc, struct hashlist **comptab, int file1, int file2, int which)
SurveyCell(struct nlist *tc, struct hashdict *compdict, int file1, int file2, int which)
{
struct objlist *ob;
struct nlist *tsub, *teq;
ECompare *ecomp, *qcomp, *ncomp;
int file = (which == 0) ? file1 : file2;
int ofile = (which == 0) ? file2 : file1;
char *dstr;
for (ob = tc->cell; ob; ob = ob->next) {
if (ob->type == FIRSTPIN) {
tsub = LookupCellFile(ob->model.class, (which == 0) ? file1 : file2);
ecomp = (ECompare *)HashLookup(ob->model.class, comptab, OBJHASHSIZE);
tsub = LookupCellFile(ob->model.class, file);
if (tsub->flags & CELL_DUPLICATE) {
// Always register a duplicate under the original name
dstr = strstr(ob->model.class, "[[");
if (dstr) *dstr = '\0';
}
else dstr = NULL;
teq = LookupClassEquivalent(ob->model.class, file, ofile);
ecomp = (ECompare *)HashInt2Lookup(ob->model.class, file, compdict);
if (ecomp == NULL) {
ncomp = (ECompare *)MALLOC(sizeof(ECompare));
if (which == 0) {
ncomp->num1 = 1;
ncomp->num2 = 0;
ncomp->cell1 = tsub;
teq = LookupClassEquivalent(ob->model.class, file1, file2);
ncomp->cell2 = teq;
}
else {
ncomp->num1 = 0;
ncomp->num2 = 1;
ncomp->cell2 = tsub;
teq = LookupClassEquivalent(ob->model.class, file2, file1);
ncomp->cell1 = teq;
}
ncomp->add1 = 0;
ncomp->add2 = 0;
ncomp->refcount = (char)1;
HashPtrInstall(ob->model.class, ncomp, comptab, OBJHASHSIZE);
HashInt2PtrInstall(ob->model.class, file, ncomp, compdict);
if (teq != NULL) {
qcomp = (ECompare *)HashLookup(teq->name, comptab, OBJHASHSIZE);
char *bstr = NULL;
if (teq->flags & CELL_DUPLICATE) {
bstr = strstr(teq->name, "[[");
if (bstr) *bstr = '\0';
}
qcomp = (ECompare *)HashInt2Lookup(teq->name, ofile, compdict);
if (qcomp == NULL) {
HashPtrInstall(teq->name, ncomp, comptab, OBJHASHSIZE);
HashInt2PtrInstall(teq->name, ofile, ncomp, compdict);
ncomp->refcount++;
}
if (bstr) *bstr = '[';
}
}
else {
@@ -1293,6 +1374,7 @@ SurveyCell(struct nlist *tc, struct hashlist **comptab, int file1, int file2, in
else
ecomp->num2++;
}
if (dstr) *dstr = '[';
}
}
}
@@ -1309,7 +1391,7 @@ SurveyCell(struct nlist *tc, struct hashlist **comptab, int file1, int file2, in
/* */
/* If there is a mismatch between instances of low- */
/* level devices, determine if the mismatches can be */
/* resolved by parallel/serial combining, accoring to */
/* resolved by parallel/serial combining, according to */
/* combination rules. */
/* */
/* Return the number of modifications made. */
@@ -1318,10 +1400,11 @@ SurveyCell(struct nlist *tc, struct hashlist **comptab, int file1, int file2, in
int
PrematchLists(char *name1, int file1, char *name2, int file2)
{
struct nlist *tc1, *tc2, *teq, *tsub1, *tsub2;
struct nlist *tc1, *tc2, *tsub1, *tsub2;
struct objlist *ob1, *ob2, *lob;
struct hashlist **comptab;
struct hashdict compdict;
ECompare *ecomp, *ncomp;
ECompList *list0X, *listX0;
int match, modified = 0;
if (file1 == -1)
@@ -1334,33 +1417,39 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
else
tc2 = LookupCellFile(name2, file2);
if (tc1 == NULL || tc2 == NULL) return;
if (tc1 == NULL || tc2 == NULL) return 0;
comptab = (struct hashlist **)CALLOC(OBJHASHSIZE,
sizeof(struct hashlist *));
InitializeHashTable(&compdict, OBJHASHSIZE);
// Gather information about instances of cell "name1"
SurveyCell(tc1, comptab, file1, file2, 0);
SurveyCell(tc1, &compdict, file1, file2, 0);
// Gather information about instances of cell "name2"
SurveyCell(tc2, comptab, file1, file2, 1);
SurveyCell(tc2, &compdict, file1, file2, 1);
// Find all instances of one cell that have fewer in
// the compared circuit. Check whether subcircuits
// in the hierarchy of each instance contain devices
// or subcircuits that more in the compared circuit.
// or subcircuits that have more in the compared circuit.
ecomp = (ECompare *)HashFirst(comptab, OBJHASHSIZE);
listX0 = list0X = NULL;
ecomp = (ECompare *)HashFirst(&compdict);
while (ecomp != NULL) {
/* Case 1: Both cell1 and cell2 classes are subcircuits, */
/* and flattening both of them improves the matching. */
if ((ecomp->num1 != ecomp->num2) && (ecomp->cell2 != NULL) &&
(ecomp->cell2->class == CLASS_SUBCKT)) {
(ecomp->cell1 != NULL) &&
(ecomp->cell2->class == CLASS_SUBCKT) &&
(ecomp->cell1->class == CLASS_SUBCKT)) {
ecomp->add2 = -ecomp->num2;
ecomp->add1 = -ecomp->num1;
match = 1;
for (ob2 = ecomp->cell2->cell; ob2; ob2 = ob2->next) {
if (ob2->type == FIRSTPIN) {
ncomp = (ECompare *)HashLookup(ob2->model.class,
comptab, OBJHASHSIZE);
ncomp = (ECompare *)HashInt2Lookup(ob2->model.class,
ecomp->cell2->file, &compdict);
if (ncomp != NULL) {
if ((ncomp->num1 > ncomp->num2) &&
((ncomp->add2 + ecomp->num2) >=
@@ -1386,16 +1475,27 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
}
}
if (match) {
flattenInstancesOf(name2, file2, ecomp->cell2->name);
flattenInstancesOf(name1, file1, ecomp->cell1->name);
if (ecomp->cell1) {
Fprintf(stdout, "Flattening instances of %s in cell %s"
" makes a better match\n", ecomp->cell1->name,
name1);
flattenInstancesOf(name1, file1, ecomp->cell1->name);
}
if (ecomp->cell2) {
Fprintf(stdout, "Flattening instances of %s in cell %s"
" makes a better match\n", ecomp->cell2->name,
name2);
flattenInstancesOf(name2, file2, ecomp->cell2->name);
}
modified++;
}
/* Reset or apply the count adjustments */
if (ecomp->cell2)
for (ob2 = ecomp->cell2->cell; ob2; ob2 = ob2->next) {
if (ob2->type == FIRSTPIN) {
ncomp = (ECompare *)HashLookup(ob2->model.class,
comptab, OBJHASHSIZE);
ncomp = (ECompare *)HashInt2Lookup(ob2->model.class,
ecomp->cell2->file, &compdict);
if (ncomp != NULL) {
if (match) {
ncomp->num1 += ncomp->add1;
@@ -1412,14 +1512,151 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
}
ecomp->add1 = 0;
ecomp->add2 = 0;
/* If the pair was unresolved, and the number of */
/* instances is either N:0 or 0:M, add to a list so */
/* they can be cross-checked at the end. */
if ((ecomp->num1 != 0) && (ecomp->num2 == 0)) {
ECompList *newcomplist;
newcomplist = (ECompList *)MALLOC(sizeof(ECompList));
newcomplist->ecomp = ecomp;
newcomplist->next = listX0;
listX0 = newcomplist;
}
else if ((ecomp->num1 == 0) && (ecomp->num2 != 0)) {
ECompList *newcomplist;
newcomplist = (ECompList *)MALLOC(sizeof(ECompList));
newcomplist->ecomp = ecomp;
newcomplist->next = list0X;
list0X = newcomplist;
}
}
ecomp = (ECompare *)HashNext(comptab, OBJHASHSIZE);
}
/* Case 2: Cell2 class is a subcircuit, and flattening */
/* (it without regard to cell1) improves the matching. */
else if ((ecomp->num1 != ecomp->num2) && (ecomp->cell2 != NULL) &&
(ecomp->cell2->class == CLASS_SUBCKT)) {
ecomp->add2 = -ecomp->num2;
match = 1;
for (ob2 = ecomp->cell2->cell; ob2; ob2 = ob2->next) {
if (ob2->type == FIRSTPIN) {
ncomp = (ECompare *)HashInt2Lookup(ob2->model.class,
ecomp->cell2->file, &compdict);
if (ncomp != NULL) {
if ((ncomp->num1 > ncomp->num2) &&
((ncomp->add2 + ecomp->num2) <=
ncomp->num1)) {
ncomp->add2 += ecomp->num2;
}
else {
match = 0;
break;
}
}
else {
match = 0;
break;
}
}
}
if (match) {
if (ecomp->cell2) {
Fprintf(stdout, "Flattening instances of %s in cell %s"
" makes a better match\n", ecomp->cell2->name,
name2);
flattenInstancesOf(name2, file2, ecomp->cell2->name);
}
modified++;
}
/* Reset or apply the count adjustments */
if (ecomp->cell2)
for (ob2 = ecomp->cell2->cell; ob2; ob2 = ob2->next) {
if (ob2->type == FIRSTPIN) {
ncomp = (ECompare *)HashInt2Lookup(ob2->model.class,
ecomp->cell2->file, &compdict);
if (ncomp != NULL) {
if (match) {
ncomp->num2 += ncomp->add2;
}
ncomp->add2 = 0;
}
}
}
if (match) {
ecomp->num2 = 0;
}
ecomp->add2 = 0;
}
/* Case 3: Cell1 class is a subcircuit, and flattening */
/* (it without regard to cell1) improves the matching. */
else if ((ecomp->num1 != ecomp->num2) && (ecomp->cell1 != NULL) &&
(ecomp->cell1->class == CLASS_SUBCKT)) {
ecomp->add1 = -ecomp->num1;
match = 1;
for (ob2 = ecomp->cell1->cell; ob2; ob2 = ob2->next) {
if (ob2->type == FIRSTPIN) {
ncomp = (ECompare *)HashInt2Lookup(ob2->model.class,
ecomp->cell1->file, &compdict);
if (ncomp != NULL) {
if ((ncomp->num2 > ncomp->num1) &&
((ncomp->add1 + ecomp->num1) <=
ncomp->num2)) {
ncomp->add1 += ecomp->num1;
}
else {
match = 0;
break;
}
}
else {
match = 0;
break;
}
}
}
if (match) {
if (ecomp->cell1) {
Fprintf(stdout, "Flattening instances of %s in cell %s"
" makes a better match\n", ecomp->cell1->name,
name1);
flattenInstancesOf(name1, file1, ecomp->cell1->name);
}
modified++;
}
/* Reset or apply the count adjustments */
if (ecomp->cell1)
for (ob2 = ecomp->cell1->cell; ob2; ob2 = ob2->next) {
if (ob2->type == FIRSTPIN) {
ncomp = (ECompare *)HashInt2Lookup(ob2->model.class,
ecomp->cell1->file, &compdict);
if (ncomp != NULL) {
if (match) {
ncomp->num1 += ncomp->add1;
}
ncomp->add1 = 0;
}
}
}
if (match) {
ecomp->num1 = 0;
}
ecomp->add1 = 0;
}
ecomp = (ECompare *)HashNext(&compdict);
}
// Remove non-matching zero-value devices. This can
// be done on a per-instance basis.
ecomp = (ECompare *)HashFirst(comptab, OBJHASHSIZE);
ecomp = (ECompare *)HashFirst(&compdict);
while (ecomp != NULL) {
if ((ecomp->num1 != ecomp->num2) && (ecomp->cell1 != NULL) &&
(ecomp->cell1->class == CLASS_RES)) {
@@ -1466,6 +1703,11 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
if (found) break;
}
if (found) {
Fprintf(stdout, "Removing zero-valued device"
"%s from cell %s makes a better match\n",
tsub1->name,
tc1->name);
/* merge node of endpoints */
for (ob2 = tc1->cell; ob2; ob2 = ob2->next) {
if (ob2->node == node2)
@@ -1565,6 +1807,11 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
if (found) break;
}
if (found) {
Fprintf(stdout, "Removing zero-valued device"
"%s from cell %s makes a better match\n",
tsub2->name,
tc2->name);
/* merge node of endpoints */
for (ob1 = tc2->cell; ob1; ob1 = ob1->next) {
if (ob1->node == node2)
@@ -1616,19 +1863,102 @@ PrematchLists(char *name1, int file1, char *name2, int file2)
}
}
}
ecomp = (ECompare *)HashNext(&compdict);
}
ecomp = (ECompare *)HashNext(comptab, OBJHASHSIZE);
// Finally, check all entries in listX0 vs. all entries in list0X to see
// if flattening one side will improve the matching. Ignore entries
// that are duplicates (already matched). Also do this only if there
// are no other modifications, as this rule is relaxed compared to other
// rules, and the other rules should be exhaustively applied first.
if ((listX0 != NULL) && (list0X != NULL) && (modified == 0)) {
ECompare *ecomp0X, *ecompX0;
ECompList *elist0X, *elistX0;
for (elistX0 = listX0; elistX0; elistX0 = elistX0->next) {
ecompX0 = elistX0->ecomp;
for (elist0X = list0X; elist0X; elist0X = elist0X->next) {
ecomp0X = elist0X->ecomp;
// Check that this has not already been processed and flattened
if (ecompX0->num1 > 0 && ecomp0X->num2 > 0) {
// Are any components of ecompX0->cell1 in the ecomp0X list?
for (ob1 = ecompX0->cell1->cell; ob1; ob1 = ob1->next) {
if (ob1->type == FIRSTPIN) {
char *dstr = NULL;
tc1 = LookupCellFile(ob1->model.class, ecompX0->cell1->file);
if (tc1->flags & CELL_DUPLICATE) {
dstr = strstr(ob1->model.class, "[[");
if (dstr) *dstr = '\0';
}
ncomp = (ECompare *)HashInt2Lookup(ob1->model.class,
ecompX0->cell1->file, &compdict);
if (dstr) *dstr = '[';
if ((ncomp == ecomp0X) && (ecomp0X->num2 <= ecompX0->num1)) {
Fprintf(stdout, "Flattening instances of %s in cell %s"
" makes a better match\n", ecompX0->cell1->name,
name1);
flattenInstancesOf(name1, file1, ecompX0->cell1->name);
ecompX0->num1 = 0;
ecomp0X->num1 += ecompX0->num1;
modified++;
break;
}
}
}
// Are any components of ecomp0X->cell2 in the ecompX0 list?
for (ob2 = ecomp0X->cell2->cell; ob2; ob2 = ob2->next) {
if (ob2->type == FIRSTPIN) {
char *dstr = NULL;
tc2 = LookupCellFile(ob2->model.class, ecomp0X->cell2->file);
if (tc2->flags & CELL_DUPLICATE) {
dstr = strstr(ob1->model.class, "[[");
if (dstr) *dstr = '\0';
}
ncomp = (ECompare *)HashInt2Lookup(ob2->model.class,
ecomp0X->cell2->file, &compdict);
if (dstr) *dstr = '[';
if ((ncomp == ecompX0) && (ecompX0->num1 <= ecomp0X->num2)) {
Fprintf(stdout, "Flattening instances of %s in cell %s"
" makes a better match\n", ecomp0X->cell2->name,
name2);
flattenInstancesOf(name2, file2, ecomp0X->cell2->name);
ecomp0X->num2 = 0;
ecompX0->num2 += ecomp0X->num2;
modified++;
break;
}
}
}
}
}
}
}
// Free the hash table and its contents.
ecomp = (ECompare *)HashFirst(comptab, OBJHASHSIZE);
ecomp = (ECompare *)HashFirst(&compdict);
while (ecomp != NULL) {
if (--ecomp->refcount == (char)0) FREE(ecomp);
ecomp = (ECompare *)HashNext(comptab, OBJHASHSIZE);
ecomp = (ECompare *)HashNext(&compdict);
}
HashKill(comptab, OBJHASHSIZE);
FREE(comptab);
HashKill(&compdict);
// Free the 0:X and X:0 lists
while (listX0 != NULL) {
ECompList *nextptr = listX0->next;
FREE(listX0);
listX0 = nextptr;
}
while (list0X != NULL) {
ECompList *nextptr = list0X->next;
FREE(list0X);
list0X = nextptr;
}
return modified;
}
+134 -71
View File
@@ -33,22 +33,25 @@ unsigned long (*hashfunc)(char *, int) = NULL;
int (*matchfunc)(char *, char *) = NULL;
int (*matchintfunc)(char *, char *, int, int) = NULL;
void InitializeHashTable(struct hashlist **tab, int size)
void InitializeHashTable(struct hashdict *dict, int size)
{
int i;
for (i = 0; i < size; i++) tab[i] = NULL;
struct hashlist **hashtab;
dict->hashtab = (struct hashlist **)CALLOC(size, sizeof(struct hashlist *));
dict->hashsize = size;
dict->hashfirstindex = 0;
dict->hashfirstptr = NULL;
}
int RecurseHashTable(struct hashlist **hashtab, int hashsize,
int (*func)(struct hashlist *elem))
int RecurseHashTable(struct hashdict *dict, int (*func)(struct hashlist *elem))
/* returns the sum of the return values of (*func) */
{
int i, sum;
struct hashlist *p;
sum = 0;
for (i = 0; i < hashsize; i++)
for (p = hashtab[i]; p != NULL; p = p->next)
for (i = 0; i < dict->hashsize; i++)
for (p = dict->hashtab[i]; p != NULL; p = p->next)
sum += (*func)(p);
return(sum);
}
@@ -57,15 +60,15 @@ int RecurseHashTable(struct hashlist **hashtab, int hashsize,
* type int value to the function.
*/
int RecurseHashTableValue(struct hashlist **hashtab, int hashsize,
int RecurseHashTableValue(struct hashdict *dict,
int (*func)(struct hashlist *elem, int), int value)
{
int i, sum;
struct hashlist *p;
sum = 0;
for (i = 0; i < hashsize; i++)
for (p = hashtab[i]; p != NULL; p = p->next)
for (i = 0; i < dict->hashsize; i++)
for (p = dict->hashtab[i]; p != NULL; p = p->next)
sum += (*func)(p, value);
return(sum);
}
@@ -76,7 +79,7 @@ int RecurseHashTableValue(struct hashlist **hashtab, int hashsize,
* function through that structure.
*/
struct nlist *RecurseHashTablePointer(struct hashlist **hashtab, int hashsize,
struct nlist *RecurseHashTablePointer(struct hashdict *dict,
struct nlist *(*func)(struct hashlist *elem, void *),
void *pointer)
{
@@ -84,8 +87,8 @@ struct nlist *RecurseHashTablePointer(struct hashlist **hashtab, int hashsize,
struct hashlist *p;
struct nlist *tp;
for (i = 0; i < hashsize; i++) {
for (p = hashtab[i]; p != NULL; p = p->next) {
for (i = 0; i < dict->hashsize; i++) {
for (p = dict->hashtab[i]; p != NULL; p = p->next) {
tp = (*func)(p, pointer);
if (tp != NULL) return tp;
}
@@ -150,19 +153,28 @@ unsigned long hash(char *s, int hashsize)
return (hashsize == 0) ? hashval : (hashval % hashsize);
}
unsigned long genhash(char *s, int c, int hashsize)
{
unsigned long hashval;
for (hashval = (unsigned long)c; *s != '\0'; )
hashval = (*s++) + (hashval << 6) + (hashval << 16) - hashval;
return (hashsize == 0) ? hashval : (hashval % hashsize);
}
/*----------------------------------------------------------------------*/
/* HashLookup -- */
/* return the 'ptr' field of the hash table entry, or NULL if not found */
/*----------------------------------------------------------------------*/
void *HashLookup(char *s, struct hashlist **hashtab, int hashsize)
void *HashLookup(char *s, struct hashdict *dict)
{
struct hashlist *np;
unsigned long hashval;
hashval = (*hashfunc)(s, hashsize);
hashval = (*hashfunc)(s, dict->hashsize);
for (np = hashtab[hashval]; np != NULL; np = np->next)
for (np = dict->hashtab[hashval]; np != NULL; np = np->next)
if ((*matchfunc)(s, np->name)) return (np->ptr); /* correct match */
return (NULL); /* not found */
}
@@ -174,14 +186,14 @@ void *HashLookup(char *s, struct hashlist **hashtab, int hashsize)
/* passed integer value i */
/*----------------------------------------------------------------------*/
void *HashIntLookup(char *s, int i, struct hashlist **hashtab, int hashsize)
void *HashIntLookup(char *s, int i, struct hashdict *dict)
{
struct hashlist *np;
unsigned long hashval;
hashval = (*hashfunc)(s, hashsize);
hashval = (*hashfunc)(s, dict->hashsize);
for (np = hashtab[hashval]; np != NULL; np = np->next) {
for (np = dict->hashtab[hashval]; np != NULL; np = np->next) {
if (np->ptr == NULL) {
if ((*matchintfunc)(s, np->name, i, -1))
return NULL;
@@ -195,17 +207,37 @@ void *HashIntLookup(char *s, int i, struct hashlist **hashtab, int hashsize)
}
/*----------------------------------------------------------------------*/
/* return the hashlist entry, after (re)initializing its 'ptr' field */
/* Similar to HashIntLookup, but HashInt2Lookup adds the integer c as */
/* part of the hash, using a special hash function to hash the char */
/* first, then the character string. */
/*----------------------------------------------------------------------*/
struct hashlist *HashPtrInstall(char *name, void *ptr,
struct hashlist **hashtab, int hashsize)
void *HashInt2Lookup(char *s, int c, struct hashdict *dict)
{
struct hashlist *np;
unsigned long hashval;
hashval = (*hashfunc)(name,hashsize);
for (np = hashtab[hashval]; np != NULL; np = np->next)
hashval = genhash(s, c, dict->hashsize);
for (np = dict->hashtab[hashval]; np != NULL; np = np->next)
if (!strcmp(s, np->name))
return (np->ptr); /* correct match */
return (NULL); /* not found */
}
/*----------------------------------------------------------------------*/
/* return the hashlist entry, after (re)initializing its 'ptr' field */
/*----------------------------------------------------------------------*/
struct hashlist *HashPtrInstall(char *name, void *ptr, struct hashdict *dict)
{
struct hashlist *np;
unsigned long hashval;
hashval = (*hashfunc)(name, dict->hashsize);
for (np = dict->hashtab[hashval]; np != NULL; np = np->next)
if ((*matchfunc)(name, np->name)) {
np->ptr = ptr;
return (np); /* match found in hash table */
@@ -216,8 +248,8 @@ struct hashlist *HashPtrInstall(char *name, void *ptr,
return (NULL);
if ((np->name = strsave(name)) == NULL) return (NULL);
np->ptr = ptr;
np->next = hashtab[hashval];
return(hashtab[hashval] = np);
np->next = dict->hashtab[hashval];
return(dict->hashtab[hashval] = np);
}
/*----------------------------------------------------------------------*/
@@ -226,13 +258,13 @@ struct hashlist *HashPtrInstall(char *name, void *ptr,
/*----------------------------------------------------------------------*/
struct hashlist *HashIntPtrInstall(char *name, int value, void *ptr,
struct hashlist **hashtab, int hashsize)
struct hashdict *dict)
{
struct hashlist *np;
unsigned long hashval;
hashval = (*hashfunc)(name,hashsize);
for (np = hashtab[hashval]; np != NULL; np = np->next)
hashval = (*hashfunc)(name, dict->hashsize);
for (np = dict->hashtab[hashval]; np != NULL; np = np->next)
if ((*matchintfunc)(name, np->name, value, (int)(*((int *)np->ptr)))) {
np->ptr = ptr;
return (np); /* match found in hash table */
@@ -243,27 +275,57 @@ struct hashlist *HashIntPtrInstall(char *name, int value, void *ptr,
return (NULL);
if ((np->name = strsave(name)) == NULL) return (NULL);
np->ptr = ptr;
np->next = hashtab[hashval];
return(hashtab[hashval] = np);
np->next = dict->hashtab[hashval];
return(dict->hashtab[hashval] = np);
}
/*----------------------------------------------------------------------*/
/* And the following is used with HashInt2. */
/*----------------------------------------------------------------------*/
struct hashlist *HashInt2PtrInstall(char *name, int c, void *ptr,
struct hashdict *dict)
{
struct hashlist *np;
unsigned long hashval;
hashval = genhash(name, c, dict->hashsize);
for (np = dict->hashtab[hashval]; np != NULL; np = np->next)
if (!strcmp(name, np->name)) {
np->ptr = ptr;
return (np); /* match found in hash table */
}
/* not in table, so install it */
if ((np = (struct hashlist *) CALLOC(1,sizeof(struct hashlist))) == NULL)
return (NULL);
if ((np->name = strsave(name)) == NULL) return (NULL);
np->ptr = ptr;
np->next = dict->hashtab[hashval];
return(dict->hashtab[hashval] = np);
}
/*----------------------------------------------------------------------*/
/* destroy a hash table, freeing associated memory */
/*----------------------------------------------------------------------*/
void *HashKill(struct hashlist **hashtab, int hashsize)
void HashKill(struct hashdict *dict)
{
struct hashlist *np, *p;
int i;
for (i = 0; i < hashsize; i++) {
for (p = hashtab[i]; p != NULL; ) {
if (dict->hashtab == NULL) return; // Hash not initialized
for (i = 0; i < dict->hashsize; i++) {
for (p = dict->hashtab[i]; p != NULL; ) {
np = p->next;
FREE(p->name);
FREE(p);
p = np;
}
}
FREE(dict->hashtab);
dict->hashtab = NULL;
}
/*----------------------------------------------------------------------*/
@@ -271,14 +333,13 @@ void *HashKill(struct hashlist **hashtab, int hashsize)
/* to the new hash entry. */
/*----------------------------------------------------------------------*/
struct hashlist *HashInstall(char *name,
struct hashlist **hashtab, int hashsize)
struct hashlist *HashInstall(char *name, struct hashdict *dict)
{
struct hashlist *np;
unsigned long hashval;
hashval = (*hashfunc)(name,hashsize);
for (np = hashtab[hashval]; np != NULL; np = np->next)
hashval = (*hashfunc)(name, dict->hashsize);
for (np = dict->hashtab[hashval]; np != NULL; np = np->next)
if ((*matchfunc)(name, np->name)) return (np); /* match found in hash table */
/* not in table, so install it */
@@ -286,27 +347,27 @@ struct hashlist *HashInstall(char *name,
return (NULL);
if ((np->name = strsave(name)) == NULL) return (NULL);
np->ptr = NULL;
np->next = hashtab[hashval];
return(hashtab[hashval] = np);
np->next = dict->hashtab[hashval];
return(dict->hashtab[hashval] = np);
}
/*----------------------------------------------------------------------*/
/* frees a hash table entry, (but not the 'ptr' field) */
/*----------------------------------------------------------------------*/
void HashDelete(char *name, struct hashlist **hashtab, int hashsize)
void HashDelete(char *name, struct hashdict *dict)
{
unsigned long hashval;
struct hashlist *np;
struct hashlist *np2;
hashval = (*hashfunc)(name, hashsize);
np = hashtab[hashval];
hashval = (*hashfunc)(name, dict->hashsize);
np = dict->hashtab[hashval];
if (np == NULL) return;
if ((*matchfunc)(name, np->name)) {
/* it is the first element in the list */
hashtab[hashval] = np->next;
dict->hashtab[hashval] = np->next;
FREE(np->name);
FREE(np);
return;
@@ -329,19 +390,19 @@ void HashDelete(char *name, struct hashlist **hashtab, int hashsize)
/* HashDelete with additional integer value matching */
/*----------------------------------------------------------------------*/
void HashIntDelete(char *name, int value, struct hashlist **hashtab, int hashsize)
void HashIntDelete(char *name, int value, struct hashdict *dict)
{
unsigned long hashval;
struct hashlist *np;
struct hashlist *np2;
hashval = (*hashfunc)(name, hashsize);
np = hashtab[hashval];
hashval = (*hashfunc)(name, dict->hashsize);
np = dict->hashtab[hashval];
if (np == NULL) return;
if ((*matchintfunc)(name, np->name, value, (int)(*((int *)np->ptr)))) {
/* it is the first element in the list */
hashtab[hashval] = np->next;
dict->hashtab[hashval] = np->next;
FREE(np->name);
FREE(np);
return;
@@ -361,33 +422,35 @@ void HashIntDelete(char *name, int value, struct hashlist **hashtab, int hashsiz
}
}
/*----------------------------------------------------------------------*/
/* Hash key iterator */
/* returns 'ptr' field of next element, NULL when done */
/*----------------------------------------------------------------------*/
static int hashfirstindex; /* was long */
static struct hashlist *hashfirstptr;
void *HashNext(struct hashlist **hashtab, int hashsize)
/* returns 'ptr' field of next element, NULL when done */
void *HashNext(struct hashdict *dict)
{
if (hashfirstptr != NULL && hashfirstptr->next != NULL) {
hashfirstptr = hashfirstptr->next;
return(hashfirstptr->ptr);
}
while (hashfirstindex < hashsize) {
if ((hashfirstptr = hashtab[hashfirstindex++]) != NULL) {
return(hashfirstptr->ptr);
}
}
hashfirstindex = 0;
hashfirstptr = NULL;
return(NULL);
if (dict->hashfirstptr != NULL && dict->hashfirstptr->next != NULL) {
dict->hashfirstptr = dict->hashfirstptr->next;
return(dict->hashfirstptr->ptr);
}
while (dict->hashfirstindex < dict->hashsize) {
if ((dict->hashfirstptr = dict->hashtab[dict->hashfirstindex++]) != NULL) {
return(dict->hashfirstptr->ptr);
}
}
dict->hashfirstindex = 0;
dict->hashfirstptr = NULL;
return(NULL);
}
void *HashFirst(struct hashlist **hashtab, int hashsize)
/*----------------------------------------------------------------------*/
/* Hash key iterator setup */
/*----------------------------------------------------------------------*/
void *HashFirst(struct hashdict *dict)
{
hashfirstindex = 0;
hashfirstptr = NULL;
return(HashNext(hashtab,hashsize));
dict->hashfirstindex = 0;
dict->hashfirstptr = NULL;
return HashNext(dict);
}
+27 -17
View File
@@ -7,35 +7,45 @@ struct hashlist {
struct hashlist *next;
};
extern void InitializeHashTable(struct hashlist **tab, int size);
extern int RecurseHashTable(struct hashlist **hashtab, int hashsize,
struct hashdict {
int hashsize;
int hashfirstindex;
struct hashlist *hashfirstptr;
struct hashlist **hashtab;
};
extern void InitializeHashTable(struct hashdict *dict, int size);
extern int RecurseHashTable(struct hashdict *dict,
int (*func)(struct hashlist *elem));
extern int RecurseHashTableValue(struct hashlist **hashtab, int hashsize,
extern int RecurseHashTableValue(struct hashdict *dict,
int (*func)(struct hashlist *elem, int), int);
extern struct nlist *RecurseHashTablePointer(struct hashlist **hashtab,
int hashsize, struct nlist *(*func)(struct hashlist *elem,
void *), void *pointer);
extern struct nlist *RecurseHashTablePointer(struct hashdict *dict,
struct nlist *(*func)(struct hashlist *elem, void *),
void *pointer);
extern void HashDelete(char *name, struct hashdict *dict);
extern void HashIntDelete(char *name, int value, struct hashdict *dict);
extern void HashKill(struct hashdict *dict);
extern int CountHashTableEntries(struct hashlist *p);
extern int CountHashTableBinsUsed(struct hashlist *p);
extern void HashDelete(char *name, struct hashlist **hashtab, int hashsize);
extern void HashIntDelete(char *name, int value, struct hashlist **hashtab,
int hashsize);
/* these functions return a pointer to a hash list element */
extern struct hashlist *HashInstall(char *name, struct hashlist **hashtab,
int hashsize);
extern struct hashlist *HashInstall(char *name, struct hashdict *dict);
extern struct hashlist *HashPtrInstall(char *name, void *ptr,
struct hashlist **hashtab, int hashsize);
struct hashdict *dict);
extern struct hashlist *HashIntPtrInstall(char *name, int value, void *ptr,
struct hashlist **hashtab, int hashsize);
struct hashdict *dict);
extern struct hashlist *HashInt2PtrInstall(char *name, int c, void *ptr,
struct hashdict *dict);
/* these functions return the ->ptr field of a struct hashlist */
extern void *HashLookup(char *s, struct hashlist **hashtab, int hashsize);
extern void *HashIntLookup(char *s, int i, struct hashlist **hashtab, int hashsize);
extern void *HashFirst(struct hashlist **hashtab, int hashsize);
extern void *HashNext(struct hashlist **hashtab, int hashsize);
extern void *HashLookup(char *s, struct hashdict *dict);
extern void *HashIntLookup(char *s, int i, struct hashdict *dict);
extern void *HashInt2Lookup(char *s, int c, struct hashdict *dict);
extern void *HashFirst(struct hashdict *dict);
extern void *HashNext(struct hashdict *dict);
extern unsigned long hashnocase(char *s, int hashsize);
extern unsigned long hash(char *s, int hashsize);
+2353 -333
View File
File diff suppressed because it is too large Load Diff
+6423
View File
File diff suppressed because it is too large Load Diff
+10 -4
View File
@@ -9,6 +9,7 @@ extern struct nlist *Circuit2;
extern int ExhaustiveSubdivision;
#ifdef TCL_NETGEN
#include <tcl.h>
extern int InterruptPending;
#endif
@@ -17,10 +18,11 @@ extern int InterruptPending;
extern void PrintElementClasses(struct ElementClass *EC, int type, int dolist);
extern void PrintNodeClasses(struct NodeClass *NC, int type, int dolist);
extern void SummarizeNodeClasses(struct NodeClass *NC);
extern void PrintPropertyResults(void);
extern void PrintPropertyResults(int do_list);
extern void PrintCoreStats(void);
extern void ResetState(void);
extern void CreateTwoLists(char *name1, int file1, char *name2, int file2);
extern void CreateTwoLists(char *name1, int file1, char *name2, int file2,
int dolist);
extern int Iterate(void);
extern int VerifyMatching(void);
extern void PrintAutomorphisms(void);
@@ -32,8 +34,9 @@ extern int PermuteForget(char *model, int filenum, char *pin1, char *pin2);
extern int EquivalenceElements(char *name1, int file1, char *name2, int file2);
extern int EquivalenceNodes(char *name1, int file1, char *name2, int file2);
extern int EquivalenceClasses(char *name1, int file1, char *name2, int file2);
extern int IgnoreClass(char *name, int file);
extern int MatchPins(struct nlist *tp1, struct nlist *tp2);
extern int IgnoreClass(char *name, int file, unsigned char type);
extern int MatchPins(struct nlist *tp1, struct nlist *tp2, int dolist);
extern int PropertyOptimize(struct objlist *ob, struct nlist *tp, int run, int serial);
extern int CreateCompareQueue(char *, int, char *, int);
extern int GetCompareQueueTop(char **, int *, char **, int *);
@@ -50,5 +53,8 @@ extern int EquivalentElement();
extern void enable_interrupt();
extern void disable_interrupt();
extern Tcl_Obj *ListNodeClasses(int legal);
extern Tcl_Obj *ListElementClasses(int legal);
#endif
+67 -5
View File
@@ -77,8 +77,9 @@ extern char *SetExtension(char *buffer, char *path, char *extension)
strcat(tmpbuf, extension);
/* step 4: lower-case the entire name */
for (pt = tmpbuf; *pt != '\0'; pt++)
if (isupper(*pt)) *pt = tolower(*pt);
/* (Commented out because this is really stupid.) */
// for (pt = tmpbuf; *pt != '\0'; pt++)
// if (isupper(*pt)) *pt = tolower(*pt);
if (buffer != NULL) {
strcpy(buffer, tmpbuf);
@@ -192,6 +193,67 @@ static struct filestack *OpenFiles = NULL;
#define TOKEN_DELIMITER " \t\n\r"
/*----------------------------------------------------------------------*/
/* TrimQuoted() --- */
/* Remove spaces from inside single- or double-quoted strings. */
/*----------------------------------------------------------------------*/
void TrimQuoted(char *line)
{
char *qstart, *qend, *lptr;
int slen;
int changed;
/* Single-quoted entries */
changed = TRUE;
lptr = line;
while (changed)
{
changed = FALSE;
qstart = strchr(lptr, '\'');
if (qstart)
{
qend = strchr(qstart + 1, '\'');
if (qend && (qend > qstart)) {
slen = strlen(lptr);
for (lptr = qstart + 1; lptr < qend; lptr++) {
if (*lptr == ' ') {
memmove(lptr, lptr + 1, slen);
qend--;
changed = TRUE;
}
}
lptr++;
}
}
}
/* Double-quoted entries */
changed = TRUE;
lptr = line;
while (changed)
{
changed = FALSE;
qstart = strchr(lptr, '\"');
if (qstart)
{
qend = strchr(qstart + 1, '\"');
if (qend && (qend > qstart)) {
slen = strlen(lptr);
for (lptr = qstart + 1; lptr < qend; lptr++) {
if (*lptr == ' ') {
memmove(lptr, lptr + 1, slen);
qend--;
changed = TRUE;
}
}
lptr++;
}
}
}
}
/*----------------------------------------------------------------------*/
/* GetNextLineNoNewline() */
/* */
@@ -232,6 +294,7 @@ int GetNextLineNoNewline()
}
linenum++;
strcpy(linetok, line);
TrimQuoted(linetok);
nexttok = strtok(linetok, TOKEN_DELIMITER);
return 0;
@@ -567,7 +630,7 @@ char *ReadNetgenFile (char *fname, int *fnum)
if ((filenum = OpenParseFile(fname, *fnum)) < 0) {
SetExtension(name, fname, NETGEN_EXTENSION);
if ((filenum = OpenParseFile(name, *fnum)) < 0) {
Printf("No file: %s\n",name);
Printf("Error in netgen read: No file %s\n",name);
*fnum = -1;
return NULL;
}
@@ -730,7 +793,6 @@ char *readbuf;
int bytes_in_buffer;
char *bufptr;
INLINE
int READ(void *buf, int bytes)
{
if (bytes_in_buffer >= bytes) {
@@ -804,7 +866,7 @@ char *ReadNetgenFile (char *fname, int *fnum)
if ((File = open(fname, O_RDONLY, FILE_ACCESS_BITS)) == -1) {
SetExtension(name, fname, NETGEN_EXTENSION);
if ((File = open(name, O_RDONLY, FILE_ACCESS_BITS)) == -1) {
Printf("No file: %s\n",name);
Printf("Error in netgen read: No file %s\n",name);
return NULL;
}
}
+1172 -350
View File
File diff suppressed because it is too large Load Diff
+13 -5
View File
@@ -33,16 +33,19 @@ extern struct property *PropertyDouble(char *name, int fnum, char *key,
extern struct property *PropertyInteger(char *name, int fnum, char *key,
int slop, int pdefault);
extern struct property *PropertyString(char *name, int fnum, char *key,
int range, char *pdefault);
double slop, char *pdefault);
extern int PropertyDelete(char *name, int fnum, char *key);
extern void SetParallelCombine(int value);
extern int PropertyTolerance(char *name, int fnum, char *key, int ival,
double dval);
extern int PropertyMerge(char *name, int fnum, char *key, int merge_type);
extern void ResolveProperties(char *name1, int file1, char *name2, int file2);
extern void CopyProperties(struct objlist *obj_to, struct objlist *obj_from);
extern int PromoteProperty(struct property *, struct valuelist *);
extern int SetPropertyDefault(struct property *, struct valuelist *);
extern struct objlist *LinkProperties(char *model, struct keyvalue *topptr);
extern int ReduceExpressions(struct objlist *instprop, struct nlist *parent,
int glob);
extern int ReduceExpressions(struct objlist *instprop, struct objlist *parprops,
struct nlist *parent, int glob);
extern void Node(char *name);
extern void Global(char *name);
extern void UniqueGlobal(char *name);
@@ -51,6 +54,8 @@ extern void PortList(char *prefix, char *list_template);
extern char *Cell(char *inststr, char *model, ...);
extern int IsIgnored(char *, int);
extern int auto_blackbox; /* For handling empty subcircuits */
/* netcmp.c */
extern struct nlist *LookupClassEquivalent(char *model, int file1, int file2);
extern void AssignCircuits(char *name1, int file1, char *name2, int file2);
@@ -98,9 +103,9 @@ extern char *Res(char *fname, char *inststr, char *, char *);
extern char *XLine(char *fname, char *inststr, char *, char *, char *, char *);
extern char *Inductor(char *fname, char *inststr, char *, char *);
extern int StringIsValue(char *);
extern int StringIsValue(char *);
extern char *ConvertParam(char *);
extern int ConvertStringToFloat(char *, double *);
extern int ConvertStringToFloat(char *, double *);
extern char *ScaleStringFloatValue(char *, double);
extern void join(char *node1, char *node2);
extern void Connect(char *tplt1, char *tplt2);
@@ -114,6 +119,8 @@ extern void FlattenCurrent();
extern void ConvertGlobals(char *name, int fnum);
extern int CleanupPins(char *name, int fnum);
extern void ConnectAllNodes(char *model, int fnum);
extern int CombineParallel(char *model, int fnum);
extern int CombineSerial(char *model, int fnum);
extern int NoDisconnectedNodes;
extern int PropertyKeyMatch(char *, char *);
extern int PropertyValueMatch(char *, char *);
@@ -128,6 +135,7 @@ extern int IgnoreRC; /* set this to 1 to ignore capacitance and resistance */
extern int NoOutput; /* set this to 1 to disable stdout output */
extern int Composition; /* direction of composition */
extern int UnixWildcards; /* TRUE if *,?,{},[] only; false if full REGEXP */
extern int GlobalParallelNone; /* If TRUE, don't parallel combine any cells */
/* magic internal flag to restrict searches to recently placed cells */
extern int QuickSearch;
/* does re"CellDef"ing a cell add to it or overwrite it??? */
+1 -1
View File
@@ -186,7 +186,7 @@ char *ReadNtk (char *fname, int *fnum)
if ((filenum = OpenParseFile(fname, *fnum)) < 0) {
SetExtension(name, fname, NTK_EXTENSION);
if ((filenum = OpenParseFile(name, *fnum)) < 0) {
Printf("No file: %s\n",name);
Printf("Error in ntk file read: No file %s\n",name);
*fnum = filenum;
return NULL;
}
+119 -64
View File
@@ -251,18 +251,18 @@ void PrintMemoryStats(void)
#define CELLHASHSIZE 1000
static struct hashlist *cell_hashtab[CELLHASHSIZE];
static struct hashdict cell_dict;
void InitCellHashTable(void)
{
hashfunc = hash;
matchfunc = match;
InitializeHashTable(cell_hashtab, CELLHASHSIZE);
hashfunc = hash;
matchfunc = match;
InitializeHashTable(&cell_dict, CELLHASHSIZE);
}
struct nlist *LookupCell(char *s)
{
return((struct nlist *)HashLookup(s, cell_hashtab, CELLHASHSIZE));
return((struct nlist *)HashLookup(s, &cell_dict));
}
/* Similar hash lookup to the above, but will check if the matching */
@@ -274,7 +274,7 @@ struct nlist *LookupCellFile(char *s, int f)
struct nlist *he;
if (f == -1) return LookupCell(s);
return HashIntLookup(s, f, cell_hashtab, CELLHASHSIZE);
return HashIntLookup(s, f, &cell_dict);
}
struct nlist *InstallInCellHashTable(char *name, int fnum)
@@ -291,34 +291,23 @@ struct nlist *InstallInCellHashTable(char *name, int fnum)
if (p == NULL) return(NULL);
if ((p->name = strsave(name)) == NULL) goto fail;
p->file = fnum;
if ((p->objtab = (struct hashlist **)CALLOC(OBJHASHSIZE,
sizeof(struct hashlist *))) == NULL) goto fail;
if ((p->insttab = (struct hashlist **)CALLOC(OBJHASHSIZE,
sizeof(struct hashlist *))) == NULL) goto fail;
if ((p->proptab = (struct hashlist **)CALLOC(OBJHASHSIZE,
sizeof(struct hashlist *))) == NULL) goto fail;
InitializeHashTable(&(p->objdict), OBJHASHSIZE);
InitializeHashTable(&(p->instdict), OBJHASHSIZE);
InitializeHashTable(&(p->propdict), OBJHASHSIZE);
p->permutes = NULL;
// Hash size 0 indicates to hash function that no binning is being done
p->classhash = (*hashfunc)(name, 0);
ptr = HashIntPtrInstall(name, fnum, p, cell_hashtab, CELLHASHSIZE);
ptr = HashIntPtrInstall(name, fnum, p, &cell_dict);
if (ptr == NULL) return(NULL);
return(p);
fail:
if (p->name != NULL) FREE(p->name);
if (p->objtab != NULL) {
HashKill(p->objtab, OBJHASHSIZE);
FREE(p->objtab);
}
if (p->insttab != NULL) {
HashKill(p->insttab, OBJHASHSIZE);
FREE(p->insttab);
}
if (p->proptab != NULL) {
HashKill(p->proptab, OBJHASHSIZE);
FREE(p->proptab);
}
HashKill(&(p->objdict));
HashKill(&(p->instdict));
RecurseHashTable(&(p->propdict), freeprop);
HashKill(&(p->propdict));
FREE(p);
return(NULL);
}
@@ -341,9 +330,9 @@ void CellRehash(char *name, char *newname, int file)
FREE(tp->name);
tp->name = strsave(newname);
ptr = HashIntPtrInstall(newname, file, (void *)tp, cell_hashtab, CELLHASHSIZE);
ptr = HashIntPtrInstall(newname, file, (void *)tp, &cell_dict);
if (ptr != NULL)
HashIntDelete(name, file, cell_hashtab, CELLHASHSIZE);
HashIntDelete(name, file, &cell_dict);
// Change the classhash to reflect the new name
tp->classhash = (*hashfunc)(newname, 0);
@@ -351,6 +340,71 @@ void CellRehash(char *name, char *newname, int file)
struct nlist *OldCell;
int removeshorted(struct hashlist *p, int file)
{
struct nlist *ptr;
struct objlist *ob, *lob, *nob, *tob;
unsigned char shorted;
ptr = (struct nlist *)(p->ptr);
if ((file != -1) && (ptr->file != file)) return 0;
lob = NULL;
for (ob = ptr->cell; ob != NULL;) {
nob = ob->next;
if ((ob->type == FIRSTPIN) && (ob->model.class != NULL)) {
if ((*matchfunc)(ob->model.class, OldCell->name)) {
shorted = (unsigned char)1;
for (tob = nob; tob->type > FIRSTPIN; tob = tob->next) {
if (tob->node != ob->node) {
shorted = (unsigned char)0;
break;
}
}
if (shorted == (unsigned char)0) {
lob = ob;
ob = nob;
continue;
}
HashDelete(ob->instance.name, &(ptr->instdict));
while (1) {
FreeObjectAndHash(ob, ptr);
ob = nob;
if (ob == NULL) break;
nob = ob->next;
if (ob->type != PROPERTY && ob->type <= FIRSTPIN) break;
}
if (lob == NULL)
ptr->cell = ob;
else
lob->next = ob;
}
else {
lob = ob;
ob = nob;
}
}
else {
lob = ob;
ob = nob;
}
}
}
/* Remove shorted instances of class "class" from the database */
void RemoveShorted(char *class, int file)
{
if (file == -1)
OldCell = LookupCell(class);
else
OldCell = LookupCellFile(class, file);
if (OldCell == NULL) return;
RecurseCellFileHashTable(removeshorted, file);
}
int deleteclass(struct hashlist *p, int file)
{
struct nlist *ptr;
@@ -358,20 +412,20 @@ int deleteclass(struct hashlist *p, int file)
ptr = (struct nlist *)(p->ptr);
if ((file != -1) && (ptr->file != file)) return;
if ((file != -1) && (ptr->file != file)) return 0;
lob = NULL;
for (ob = ptr->cell; ob != NULL;) {
nob = ob->next;
if ((ob->type == FIRSTPIN) && (ob->model.class != NULL)) {
if ((*matchfunc)(ob->model.class, OldCell->name)) {
HashDelete(ob->instance.name, ptr->insttab, OBJHASHSIZE);
HashDelete(ob->instance.name, &(ptr->instdict));
while (1) {
FreeObjectAndHash(ob, ptr);
ob = nob;
if (ob == NULL) break;
nob = ob->next;
if (ob->type <= FIRSTPIN) break;
if (ob->type != PROPERTY && ob->type <= FIRSTPIN) break;
}
if (lob == NULL)
ptr->cell = ob;
@@ -415,7 +469,7 @@ int renameinstances(struct hashlist *p, int file)
ptr = (struct nlist *)(p->ptr);
if ((file != -1) && (ptr->file != file)) return;
if ((file != -1) && (ptr->file != file)) return 0;
for (ob = ptr->cell; ob != NULL; ob = ob->next) {
if ((ob->type >= FIRSTPIN) && (ob->model.class != NULL)) {
@@ -482,22 +536,13 @@ void CellDelete(char *name, int fnum)
return;
}
HashIntDelete(name, fnum, cell_hashtab, CELLHASHSIZE);
HashIntDelete(name, fnum, &cell_dict);
/* now make sure that we free all the fields of the nlist struct */
if (tp->name != NULL) FREE(tp->name);
if (tp->objtab != NULL) {
HashKill(tp->objtab, OBJHASHSIZE);
FREE(tp->objtab);
}
if (tp->insttab != NULL) {
HashKill(tp->insttab, OBJHASHSIZE);
FREE(tp->insttab);
}
if (tp->proptab != NULL) {
RecurseHashTable(tp->proptab, OBJHASHSIZE, freeprop);
HashKill(tp->proptab, OBJHASHSIZE);
FREE(tp->proptab);
}
HashKill(&(tp->objdict));
HashKill(&(tp->instdict));
RecurseHashTable(&(tp->propdict), freeprop);
HashKill(&(tp->propdict));
FreeNodeNames(tp);
ob = tp->cell;
while (ob != NULL) {
@@ -518,8 +563,11 @@ static int PrintCellHashTableElement(struct hashlist *p)
/* only print primitive cells if Debug is enabled */
if (Debug == 1) Printf("Cell: %s (instanced %d times); Primitive\n",
ptr->name, ptr->number);
else if (Debug == 3) { /* list */
Tcl_AppendElement(netgeninterp, ptr->name);
}
}
else if (Debug == 2) { /* list only */
else if ((Debug == 2) || (Debug == 3)) { /* list only */
#ifdef TCL_NETGEN
Tcl_AppendElement(netgeninterp, ptr->name);
#else
@@ -548,30 +596,30 @@ void PrintCellHashTable(int full, int filenum)
TopFile = filenum;
bins = RecurseHashTable(cell_hashtab, CELLHASHSIZE, CountHashTableBinsUsed);
total = RecurseHashTable(cell_hashtab, CELLHASHSIZE, CountHashTableEntries);
if (full != 2)
bins = RecurseHashTable(&cell_dict, CountHashTableBinsUsed);
total = RecurseHashTable(&cell_dict, CountHashTableEntries);
if (full < 2)
Printf("Hash table: %d of %d bins used; %d cells total (%.2f per bin)\n",
bins, CELLHASHSIZE, total, (bins == 0) ? 0 :
(float)((float)total / (float)bins));
OldDebug = Debug;
Debug = full;
RecurseHashTable(cell_hashtab, CELLHASHSIZE, PrintCellHashTableElement);
RecurseHashTable(&cell_dict, PrintCellHashTableElement);
Debug = OldDebug;
#ifndef TCL_NETGEN
if (full == 2) Printf("\n");
if (full >= 2) Printf("\n");
#endif
}
struct nlist *FirstCell(void)
{
return((struct nlist *)HashFirst(cell_hashtab, CELLHASHSIZE));
return((struct nlist *)HashFirst(&cell_dict));
}
struct nlist *NextCell(void)
{
return((struct nlist *)HashNext(cell_hashtab, CELLHASHSIZE));
return((struct nlist *)HashNext(&cell_dict));
}
static int ClearDumpedElement(struct hashlist *np)
@@ -585,17 +633,17 @@ static int ClearDumpedElement(struct hashlist *np)
void ClearDumpedList(void)
{
RecurseHashTable(cell_hashtab, CELLHASHSIZE, ClearDumpedElement);
RecurseHashTable(&cell_dict, ClearDumpedElement);
}
int RecurseCellHashTable(int (*foo)(struct hashlist *np))
{
return RecurseHashTable(cell_hashtab, CELLHASHSIZE, foo);
return RecurseHashTable(&cell_dict, foo);
}
int RecurseCellFileHashTable(int (*foo)(struct hashlist *, int), int value)
{
return RecurseHashTableValue(cell_hashtab, CELLHASHSIZE, foo, value);
return RecurseHashTableValue(&cell_dict, foo, value);
}
/* Yet another version, passing one parameter that is a pointer */
@@ -603,7 +651,7 @@ int RecurseCellFileHashTable(int (*foo)(struct hashlist *, int), int value)
struct nlist *RecurseCellHashTable2(struct nlist *(*foo)(struct hashlist *,
void *), void *pointer)
{
return RecurseHashTablePointer(cell_hashtab, CELLHASHSIZE, foo, pointer);
return RecurseHashTablePointer(&cell_dict, foo, pointer);
}
/************************** WILD-CARD STUFF *******************************/
@@ -863,7 +911,7 @@ int ListLength(char *list_template)
struct objlist *CopyObjList(struct objlist *oldlist)
struct objlist *CopyObjList(struct objlist *oldlist, unsigned char doforall)
/* copies list pointed to by oldlist, creating
a list whose head pointer is returned */
{
@@ -900,6 +948,13 @@ struct objlist *CopyObjList(struct objlist *oldlist)
tail->next = newob;
tail = newob;
tmp = tmp->next;
// If "doforall" is 0, then only copy one object; otherwise,
// copy to the end of the list.
if (!doforall) {
if ((tmp == NULL) || ((tmp->type <= FIRSTPIN) && (tmp->type != PROPERTY)))
break;
}
}
return (head);
}
@@ -914,13 +969,13 @@ struct objlist *CopyObjList(struct objlist *oldlist)
struct objlist *LookupObject(char *name, struct nlist *WhichCell)
{
return((struct objlist *)HashLookup(name, WhichCell->objtab, OBJHASHSIZE));
return((struct objlist *)HashLookup(name, &(WhichCell->objdict)));
}
struct objlist *LookupInstance(char *name, struct nlist *WhichCell)
/* searches for exact match of instance 'name' in cell 'WhichCell' */
{
return((struct objlist *)HashLookup(name, WhichCell->insttab, OBJHASHSIZE));
return((struct objlist *)HashLookup(name, &(WhichCell->instdict)));
}
@@ -939,7 +994,7 @@ void AddToCurrentCell(struct objlist *ob)
/* add to object hash table for this cell */
if (CurrentCell != NULL) {
HashPtrInstall(ob->name, ob, CurrentCell->objtab, OBJHASHSIZE);
HashPtrInstall(ob->name, ob, &(CurrentCell->objdict));
}
}
@@ -966,13 +1021,13 @@ void AddToCurrentCellNoHash(struct objlist *ob)
void AddInstanceToCurrentCell(struct objlist *ob)
{
/* add to instance hash table for this cell */
HashPtrInstall(ob->instance.name, ob, CurrentCell->insttab, OBJHASHSIZE);
HashPtrInstall(ob->instance.name, ob, &(CurrentCell->instdict));
}
void FreeObject(struct objlist *ob)
{
/* This just frees the object record. Beware of pointer left */
/* in the objtab hash table. Hash table records should be */
/* in the objlist hash table. Hash table records should be */
/* removed first. */
if (ob->name != NULL) FreeString(ob->name);
@@ -1013,7 +1068,7 @@ void FreeObject(struct objlist *ob)
void FreeObjectAndHash(struct objlist *ob, struct nlist *ptr)
{
HashDelete(ob->name, ptr->objtab, OBJHASHSIZE);
HashDelete(ob->name, &(ptr->objdict));
FreeObject(ob);
}
+33 -7
View File
@@ -3,6 +3,10 @@
#ifndef _OBJLIST_H
#define _OBJLIST_H
#ifndef _HASH_H
#include "hash.h"
#endif
#define SEPARATOR "/"
#define INSTANCE_DELIMITER "#"
#define PORT_DELIMITER "."
@@ -99,10 +103,24 @@ struct valuelist {
/* Part 3: Keys & Defaults (kept in the cell record as a hash table) */
#define MERGE_NONE 0 /* Property does not change when devices merge */
#define MERGE_ADD 1 /* Properties sum with device parallel merge */
#define MERGE_ADD_CRIT 2 /* Properties sum with device parallel merge */
#define MERGE_PAR 3 /* Properties add in parallel with device merge */
#define MERGE_PAR_CRIT 4 /* Properties add in parallel with device merge */
#define MERGE_SER 5 /* Properties sum with device parallel merge */
#define MERGE_SER_CRIT 6 /* Properties sum with device parallel merge */
/* Note: A "critical" merge means that the property causes the number of */
/* devices to change. e.g., transistor width is critical; transistor drain */
/* area sums when devices are merged, but does not change the number of devices.*/
/* More than one property can be critical. e.g., width and number of fingers. */
struct property {
char *key; /* name of the property */
unsigned char idx; /* index into valuelist */
unsigned char type; /* string, integer, double, value, expression */
unsigned char merge; /* how property changes when devices are merged */
union {
char *string;
double dval;
@@ -143,9 +161,16 @@ extern struct objlist *LastPlaced;
struct IgnoreList {
char *class;
int file;
unsigned char type;
struct IgnoreList *next;
};
/* Types used by IgnoreList above */
#define IGNORE_NONE (unsigned char)0
#define IGNORE_CLASS (unsigned char)1
#define IGNORE_SHORTED (unsigned char)2
/* Record structure for handling pin permutations in a cell */
/* Linked list structure allows multiple permutations per cell. */
@@ -172,9 +197,9 @@ struct nlist {
unsigned long classhash; /* randomized hash value for cell class */
struct Permutation *permutes; /* list of permuting pins */
struct objlist *cell;
struct hashlist **objtab; /* hash table of object names */
struct hashlist **insttab; /* hash table of instance names */
struct hashlist **proptab; /* hash table of property keys */
struct hashdict objdict; /* hash table of object names */
struct hashdict instdict; /* hash table of instance names */
struct hashdict propdict; /* hash table of property keys */
struct objlist **nodename_cache;
long nodename_cache_maxnodenum; /* largest node number in cache */
void *embedding; /* this will be cast to the appropriate data structure */
@@ -188,11 +213,12 @@ struct nlist {
#define CELL_TOP 0x04 /* cell is a top-level cell */
#define CELL_PLACEHOLDER 0x08 /* cell is a placeholder cell */
#define CELL_PROPSMATCHED 0x10 /* properties matched to matching cell */
#define CELL_DUPLICATE 0x20 /* cell has a duplicate */
/* Flags for combination allowances */
/* Flags for combination allowances and prohibitions */
#define COMB_SERIAL 0x20
#define COMB_PARALLEL 0x40
#define COMB_SERIAL 0x40
#define COMB_NO_PARALLEL 0x80
extern struct nlist *CurrentCell;
extern struct objlist *CurrentTail;
@@ -215,7 +241,7 @@ extern int ListLength(char *list_template);
extern struct nlist *LookupPrematchedClass(struct nlist *, int);
extern struct objlist *LookupObject(char *name, struct nlist *WhichCell);
extern struct objlist *LookupInstance(char *name, struct nlist *WhichCell);
extern struct objlist *CopyObjList(struct objlist *oldlist);
extern struct objlist *CopyObjList(struct objlist *oldlist, unsigned char doforall);
extern void UpdateNodeNumbers(struct objlist *lst, int from, int to);
/* Function pointer to List or ListExact, allowing regular expressions */
-3
View File
@@ -315,7 +315,6 @@ void PrintE(FILE *outfile, int E)
#if 0
INLINE
int UsedLeaves(int E1, int E2)
/* returns the number of leaves in E1 + E2, which are assumed independent */
{
@@ -327,7 +326,6 @@ int UsedLeaves(int E1, int E2)
#endif
INLINE
int CommonNodes(int E1, int E2, int IncludeGlobals)
/* returns the number of nodes that E1 and E2 share */
/* if IncludeGlobals == 0, do not count large connectivity nodes */
@@ -350,7 +348,6 @@ int CommonNodes(int E1, int E2, int IncludeGlobals)
return(result);
}
INLINE
int GlobalNodes(int E)
/* return the number of global nodes that E contacts */
/* for now, global nodes are just cell ports */
+12 -7
View File
@@ -345,7 +345,7 @@ void ElementNodes(char *cell, char *element, int fnum)
struct nlist *np;
struct objlist *ob, *nob, *nob2;
int ckto;
char *elementname;
char *elementname, *obname;
if ((fnum == -1) && (Circuit1 != NULL) && (Circuit2 != NULL)) {
ElementNodes(cell, element, Circuit1->file);
@@ -368,8 +368,10 @@ void ElementNodes(char *cell, char *element, int fnum)
ckto = strlen(elementname);
for (ob = np->cell; ob != NULL; ob = ob->next) {
if (!strncmp(elementname, ob->name, ckto))
if (*(ob->name + ckto) == '/' || *(ob->name + ckto) == '\0')
obname = ob->name;
if (*obname == '/') obname++;
if (!strncmp(elementname, obname, ckto))
if (*(obname + ckto) == '/' || *(obname + ckto) == '\0')
break;
}
if (ob == NULL) {
@@ -379,13 +381,15 @@ void ElementNodes(char *cell, char *element, int fnum)
Printf("Device '%s' Pins:\n", elementname);
for (; ob != NULL; ob = ob->next) {
if (!strncmp(elementname, ob->name, ckto)) {
if (*(ob->name + ckto) != '/' && *(ob->name + ckto) != '\0')
obname = ob->name;
if (*obname == '/') obname++;
if (!strncmp(elementname, obname, ckto)) {
if (*(obname + ckto) != '/' && *(obname + ckto) != '\0')
continue;
Printf(" ");
PrintObjectType(ob->type);
Printf(" (%s)", ob->name + ckto + 1);
Printf(" (%s)", obname + ckto + 1);
for (nob = np->cell; nob != NULL; nob = nob->next) {
if (nob->node == ob->node) {
if (nob->type == NODE) {
@@ -797,8 +801,9 @@ void DescribeInstance(char *name, int file)
{
if (ob->node > nodemax) nodemax = ob->node;
else if ((ob->node == -1) && (ob->model.port != PROXY)) {
if (disconnectednodes == 0) Fprintf(stderr, "\n");
disconnectednodes++;
Fprintf(stderr, " disconnected node: %s\n", ob->name);
Fprintf(stderr, "Cell %s disconnected node: %s\n", tp->name, ob->name);
}
}
instlist = (unsigned char *) CALLOC((nodemax + 1), sizeof(unsigned char));
+213 -190
View File
@@ -25,8 +25,10 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include <stdarg.h> /* what about varargs, like in pdutils.c ??? */
#endif
#ifdef IBMPC
#include <stdlib.h> /* for calloc(), free() */
#include <stdlib.h> /* for calloc(), free(), getenv() */
#ifndef IBMPC
#include <sys/types.h> /* for getpwnam() tilde expansion */
#include <pwd.h>
#endif
#ifdef TCL_NETGEN
@@ -40,7 +42,25 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#include "print.h"
// Global storage for parameters from .PARAM
struct hashlist **spiceparams;
struct hashdict spiceparams;
// Global setting for auto-detect of empty subcircuits as
// black-box subcells.
int auto_blackbox = FALSE;
// Check if a token represents a numerical value (with
// units) or an expression. This is basically a hack
// to see if it either passes StringIsValue() or is
// enclosed in braces. Probably should attempt to
// parse the expression, to be pedantic. Not sure all
// expressions have to be in braces.
int StringIsValueOrExpression(char *token)
{
if (StringIsValue(token)) return TRUE;
else if (*token == '{') return TRUE;
else return FALSE;
}
void SpiceSubCell(struct nlist *tp, int IsSubCell)
{
@@ -73,7 +93,7 @@ void SpiceSubCell(struct nlist *tp, int IsSubCell)
for (ob = tp->cell; ob != NULL; ob = ob->next)
if (ob->node > maxnode) maxnode = ob->node;
/* was: for (node = 0; node <= maxnode; node++) */
/* was: for (node = 0; node <= maxnode; node++) */
for (node = 1; node <= maxnode; node++)
FlushString("# %3d = %s\n", node, NodeName(tp, node));
@@ -154,7 +174,6 @@ void SpiceSubCell(struct nlist *tp, int IsSubCell)
/* caps and resistors, print out device value */
/* print out device type (model/subcircuit name) */
switch (tp2->class) {
@@ -358,6 +377,12 @@ int renamepins(struct hashlist *p, int file)
obp = ob;
for (ob2 = tc->cell; ob2 != NULL; ob2 = ob2->next) {
if (ob2->type != PORT) break;
else if ((obp->type < FIRSTPIN) || (obp->type == FIRSTPIN && obp != ob)) {
Fprintf(stderr, "Pin count mismatch between cell and instance of %s\n",
tc->name);
InputParseError(stderr);
break;
}
if (!matchnocase(ob2->name, obp->name + strlen(obp->instance.name) + 1)) {
// Printf("Cell %s pin correspondence: %s vs. %s\n",
// tc->name, obp->name, ob2->name);
@@ -379,6 +404,7 @@ int renamepins(struct hashlist *p, int file)
void CleanupSubcell() {
int maxnode = 0;
int has_devices = FALSE;
struct objlist *sobj, *nobj, *lobj, *pobj;
if (CurrentCell == NULL) return;
@@ -390,6 +416,8 @@ void CleanupSubcell() {
lobj = NULL;
for (sobj = CurrentCell->cell; sobj != NULL;) {
nobj = sobj->next;
if (sobj->type == FIRSTPIN)
has_devices = TRUE;
if (sobj->node < 0) {
if (IsGlobal(sobj)) {
if (lobj != NULL)
@@ -418,6 +446,8 @@ void CleanupSubcell() {
lobj = sobj;
sobj = nobj;
}
if ((has_devices == FALSE) && (auto_blackbox == TRUE))
SetClass(CLASS_MODULE);
}
/*------------------------------------------------------*/
@@ -467,7 +497,7 @@ extern void IncludeSpice(char *, int, struct cellstack **, int);
void ReadSpiceFile(char *fname, int filenum, struct cellstack **CellStackPtr,
int blackbox)
{
int cdnum = 1, rdnum = 1, ndev, multi;
int cdnum = 1, rdnum = 1;
int warnings = 0, update = 0, hasports = 0;
char *eqptr, devtype, in_subckt;
struct keyvalue *kvlist = NULL;
@@ -520,6 +550,10 @@ void ReadSpiceFile(char *fname, int filenum, struct cellstack **CellStackPtr,
int n;
char *ds;
// NOTE: Use this to ignore the new definition---should be
// an option to netgen.
/* goto skip_ends; */
ds = strrchr(model, '[');
if ((ds != NULL) && (*(ds + 1) == '['))
sscanf(ds + 2, "%d", &n);
@@ -530,6 +564,7 @@ void ReadSpiceFile(char *fname, int filenum, struct cellstack **CellStackPtr,
}
Printf("Duplicate cell %s in file\n", nexttok);
tp->flags |= CELL_DUPLICATE;
while (tp != NULL) {
n++;
/* Append "[[n]]" to the preexisting model name to force uniqueness */
@@ -591,7 +626,7 @@ void ReadSpiceFile(char *fname, int filenum, struct cellstack **CellStackPtr,
}
SpiceTokNoNewline();
}
SetClass((blackbox) ? CLASS_MODULE : CLASS_SUBCKT);
SetClass((blackbox) ? CLASS_MODULE : CLASS_SUBCKT);
if (hasports == 0) {
// If the cell defines no ports, then create a proxy
@@ -719,7 +754,7 @@ skip_ends:
SpiceSkipNewLine();
}
else if (matchnocase(nexttok, ".INCLUDE")) {
char *iname, *iptr, *quotptr, *pathend;
char *iname, *iptr, *quotptr, *pathend, *userpath = NULL;
SpiceTokNoNewline();
if (nexttok == NULL) continue; /* Ignore if no filename */
@@ -731,12 +766,44 @@ skip_ends:
pathend = strrchr(fname, '/');
iptr = nexttok;
while (*iptr == '\'' || *iptr == '\"' || *iptr == '`') iptr++;
if ((pathend != NULL) && (*iptr != '/')) {
if ((pathend != NULL) && (*iptr != '/') && (*iptr != '~')) {
*pathend = '\0';
iname = (char *)MALLOC(strlen(fname) + strlen(iptr) + 2);
sprintf(iname, "%s/%s", fname, iptr);
*pathend = '/';
}
#ifndef IBMPC
else if ((*iptr == '~') && (*(iptr + 1) == '/')) {
/* For ~/<path>, substitute tilde from $HOME */
userpath = getenv("HOME");
iname = (char *)MALLOC(strlen(userpath) + strlen(iptr));
sprintf(iname, "%s%s", userpath, iptr + 1);
}
else if (*iptr == '~') {
/* For ~<user>/<path>, substitute tilde from getpwnam() */
struct passwd *passwd;
char *pathstart;
pathstart = strchr(iptr, '/');
if (pathstart) *pathstart = '\0';
passwd = getpwnam(iptr + 1);
if (passwd != NULL) {
userpath = passwd->pw_dir;
if (pathstart) {
*pathstart = '/';
iname = (char *)MALLOC(strlen(userpath) + strlen(pathstart) + 1);
sprintf(iname, "%s%s", userpath, pathstart);
}
else {
/* Almost certainly an error, but make the substitution anyway */
iname = STRDUP(userpath);
}
}
else {
/* Probably an error, but copy the filename verbatim */
iname = STRDUP(iptr);
}
}
#endif
else
iname = STRDUP(iptr);
@@ -771,9 +838,9 @@ skip_ends:
kl->key = strsave(nexttok);
kl->idx = 0;
kl->type = PROP_STRING;
kl->slop.ival = 0;
kl->slop.dval = 0.0;
kl->pdefault.string = strsave(eqptr + 1);
HashPtrInstall(nexttok, kl, spiceparams, OBJHASHSIZE);
HashPtrInstall(nexttok, kl, &spiceparams);
}
}
}
@@ -810,7 +877,6 @@ skip_ends:
/* Read the device model */
snprintf(model, 99, "%s", nexttok);
ndev = 1;
while (nexttok != NULL)
{
/* Parse for M and other parameters */
@@ -820,10 +886,7 @@ skip_ends:
if ((eqptr = strchr(nexttok, '=')) != NULL)
{
*eqptr = '\0';
if (!strcasecmp(nexttok, "M"))
sscanf(eqptr + 1, "%d", &ndev);
else
AddProperty(&kvlist, nexttok, eqptr + 1);
AddProperty(&kvlist, nexttok, eqptr + 1);
}
}
@@ -832,6 +895,7 @@ skip_ends:
Port("collector");
Port("base");
Port("emitter");
PropertyInteger(model, filenum, "M", 0, 1);
SetClass(CLASS_BJT);
EndCell();
ReopenCellDef((*CellStackPtr)->cellname, filenum); /* Reopen */
@@ -842,16 +906,10 @@ skip_ends:
goto baddevice;
}
multi = (ndev > 1) ? 1 : 0;
if (!multi) snprintf(instname, 255, "%s%s", model, inst);
while (ndev > 0)
{
if (multi) snprintf(instname, 255, "%s%s.%d", model, inst, ndev);
Cell(instname, model, collector, base, emitter);
pobj = LinkProperties(model, kvlist);
ReduceExpressions(pobj, CurrentCell, TRUE);
ndev--;
}
snprintf(instname, 255, "%s%s", model, inst);
Cell(instname, model, collector, base, emitter);
pobj = LinkProperties(model, kvlist);
ReduceExpressions(pobj, NULL, CurrentCell, TRUE);
DeleteProperties(&kvlist);
}
else if (toupper(nexttok[0]) == 'M') {
@@ -885,7 +943,6 @@ skip_ends:
/* Read the device model */
snprintf(model, 99, "%s", nexttok);
ndev = 1;
while (nexttok != NULL)
{
/* Parse for parameters; treat "M" separately */
@@ -895,14 +952,7 @@ skip_ends:
if ((eqptr = strchr(nexttok, '=')) != NULL)
{
*eqptr = '\0';
if (!strcasecmp(nexttok, "M"))
sscanf(eqptr + 1, "%d", &ndev);
else if (!strcasecmp(nexttok, "L"))
AddProperty(&kvlist, "length", eqptr + 1);
else if (!strcasecmp(nexttok, "W"))
AddProperty(&kvlist, "width", eqptr + 1);
else
AddProperty(&kvlist, nexttok, eqptr + 1);
AddProperty(&kvlist, nexttok, eqptr + 1);
}
}
@@ -916,8 +966,9 @@ skip_ends:
Port("gate");
Port("source");
Port("bulk");
PropertyDouble(model, filenum, "length", 0.01, 0.0);
PropertyDouble(model, filenum, "width", 0.01, 0.0);
PropertyDouble(model, filenum, "L", 0.01, 0.0);
PropertyDouble(model, filenum, "W", 0.01, 0.0);
PropertyInteger(model, filenum, "M", 0, 1);
SetClass(CLASS_FET);
EndCell();
ReopenCellDef((*CellStackPtr)->cellname, filenum); /* Reopen */
@@ -928,16 +979,10 @@ skip_ends:
goto baddevice;
}
multi = (ndev > 1) ? 1 : 0;
if (!multi) snprintf(instname, 255, "%s%s", model, inst);
while (ndev > 0)
{
if (multi) snprintf(instname, 255, "%s%s.%d", model, inst, ndev);
Cell(instname, model, drain, gate, source, bulk);
pobj = LinkProperties(model, kvlist);
ReduceExpressions(pobj, CurrentCell, TRUE);
ndev--;
}
snprintf(instname, 255, "%s%s", model, inst);
Cell(instname, model, drain, gate, source, bulk);
pobj = LinkProperties(model, kvlist);
ReduceExpressions(pobj, NULL, CurrentCell, TRUE);
DeleteProperties(&kvlist);
SpiceSkipNewLine();
}
@@ -968,7 +1013,7 @@ skip_ends:
/* Get capacitor value (if present), save as property "value" */
if (nexttok != NULL) {
if (StringIsValue(nexttok)) {
if (StringIsValueOrExpression(nexttok)) {
AddProperty(&kvlist, "value", nexttok);
SpiceTokNoNewline();
}
@@ -982,17 +1027,13 @@ skip_ends:
snprintf(model, 99, "%s", nexttok);
/* Any other device properties? */
ndev = 1;
while (nexttok != NULL)
{
SpiceTokNoNewline();
if ((nexttok == NULL) || (nexttok[0] == '\0')) break;
if ((eqptr = strchr(nexttok, '=')) != NULL) {
*eqptr = '\0';
if (!strcasecmp(nexttok, "M"))
sscanf(eqptr + 1, "%d", &ndev);
else
AddProperty(&kvlist, nexttok, eqptr + 1);
AddProperty(&kvlist, nexttok, eqptr + 1);
}
else if (!strncmp(nexttok, "$[", 2)) {
// Support for CDL modeled capacitor format
@@ -1000,7 +1041,7 @@ skip_ends:
if ((eqptr = strchr(model, ']')) != NULL)
*eqptr = '\0';
}
else if (StringIsValue(nexttok)) {
else if (StringIsValueOrExpression(nexttok)) {
// Suport for value passed to modeled capacitor
AddProperty(&kvlist, "value", nexttok);
}
@@ -1015,6 +1056,7 @@ skip_ends:
Port("top");
Port("bottom");
PropertyValue(model, filenum, "value", 0.01, 0.0);
PropertyInteger(model, filenum, "M", 0, 1);
SetClass(CLASS_CAP);
EndCell();
ReopenCellDef((*CellStackPtr)->cellname, filenum); /* Reopen */
@@ -1028,19 +1070,13 @@ skip_ends:
usemodel = 1;
}
multi = (ndev > 1) ? 1 : 0;
if (!multi) snprintf(instname, 255, "%s%s", model, inst);
while (ndev > 0) {
if (multi) snprintf(instname, 255, "%s%s.%d", model, inst, ndev);
if (usemodel)
Cell(instname, model, ctop, cbot);
else
Cap((*CellStackPtr)->cellname, instname, ctop, cbot);
pobj = LinkProperties(model, kvlist);
ReduceExpressions(pobj, CurrentCell, TRUE);
ndev--;
}
snprintf(instname, 255, "%s%s", model, inst);
if (usemodel)
Cell(instname, model, ctop, cbot);
else
Cap((*CellStackPtr)->cellname, instname, ctop, cbot);
pobj = LinkProperties(model, kvlist);
ReduceExpressions(pobj, NULL, CurrentCell, TRUE);
DeleteProperties(&kvlist);
}
}
@@ -1071,7 +1107,7 @@ skip_ends:
/* Get resistor value (if present); save as property "value" */
if (nexttok != NULL) {
if (StringIsValue(nexttok)) {
if (StringIsValueOrExpression(nexttok)) {
AddProperty(&kvlist, "value", nexttok);
SpiceTokNoNewline();
}
@@ -1085,16 +1121,12 @@ skip_ends:
snprintf(model, 99, "%s", nexttok);
/* Any other device properties? */
ndev = 1;
while (nexttok != NULL) {
SpiceTokNoNewline();
if ((nexttok == NULL) || (nexttok[0] == '\0')) break;
if ((eqptr = strchr(nexttok, '=')) != NULL) {
*eqptr = '\0';
if (!strcasecmp(nexttok, "M"))
sscanf(eqptr + 1, "%d", &ndev);
else
AddProperty(&kvlist, nexttok, eqptr + 1);
AddProperty(&kvlist, nexttok, eqptr + 1);
}
else if (!strncmp(nexttok, "$[", 2)) {
// Support for CDL modeled resistor format
@@ -1102,7 +1134,7 @@ skip_ends:
if ((eqptr = strchr(model, ']')) != NULL)
*eqptr = '\0';
}
else if (StringIsValue(nexttok)) {
else if (StringIsValueOrExpression(nexttok)) {
// Suport for value passed to modeled resistor
AddProperty(&kvlist, "value", nexttok);
}
@@ -1115,6 +1147,7 @@ skip_ends:
Port("end_a");
Port("end_b");
PropertyValue(model, filenum, "value", 0.01, 0.0);
PropertyInteger(model, filenum, "M", 0, 1);
SetClass(CLASS_RES);
EndCell();
ReopenCellDef((*CellStackPtr)->cellname, filenum); /* Reopen */
@@ -1130,19 +1163,13 @@ skip_ends:
else
strcpy(model, "r"); /* Use default resistor model */
multi = (ndev > 1) ? 1 : 0;
if (!multi) snprintf(instname, 255, "%s%s", model, inst);
while (ndev > 0) {
if (multi) snprintf(instname, 255, "%s%s.%d", model, inst, ndev);
if (usemodel)
Cell(instname, model, rtop, rbot);
else
Res((*CellStackPtr)->cellname, instname, rtop, rbot);
pobj = LinkProperties(model, kvlist);
ReduceExpressions(pobj, CurrentCell, TRUE);
ndev--;
}
snprintf(instname, 255, "%s%s", model, inst);
if (usemodel)
Cell(instname, model, rtop, rbot);
else
Res((*CellStackPtr)->cellname, instname, rtop, rbot);
pobj = LinkProperties(model, kvlist);
ReduceExpressions(pobj, NULL, CurrentCell, TRUE);
DeleteProperties(&kvlist);
}
}
@@ -1167,7 +1194,6 @@ skip_ends:
/* Read the device model */
snprintf(model, 99, "%s", nexttok);
ndev = 1;
while (nexttok != NULL)
{
/* Parse for M and other parameters */
@@ -1177,10 +1203,7 @@ skip_ends:
if ((eqptr = strchr(nexttok, '=')) != NULL)
{
*eqptr = '\0';
if (!strcasecmp(nexttok, "M"))
sscanf(eqptr + 1, "%d", &ndev);
else
AddProperty(&kvlist, nexttok, eqptr + 1);
AddProperty(&kvlist, nexttok, eqptr + 1);
}
}
@@ -1188,6 +1211,7 @@ skip_ends:
CellDefNoCase(model, filenum);
Port("anode");
Port("cathode");
PropertyInteger(model, filenum, "M", 0, 1);
SetClass(CLASS_DIODE);
EndCell();
ReopenCellDef((*CellStackPtr)->cellname, filenum); /* Reopen */
@@ -1197,16 +1221,10 @@ skip_ends:
Fprintf(stderr, "Device \"%s\" has wrong number of ports for a diode.\n");
goto baddevice;
}
multi = (ndev > 1) ? 1 : 0;
if (!multi) snprintf(instname, 255, "%s%s", model, inst);
while (ndev > 0)
{
if (multi) snprintf(instname, 255, "%s%s.%d", model, inst, ndev);
Cell(instname, model, anode, cathode);
pobj = LinkProperties(model, kvlist);
ReduceExpressions(pobj, CurrentCell, TRUE);
ndev--;
}
snprintf(instname, 255, "%s%s", model, inst);
Cell(instname, model, anode, cathode);
pobj = LinkProperties(model, kvlist);
ReduceExpressions(pobj, NULL, CurrentCell, TRUE);
DeleteProperties(&kvlist);
}
else if (toupper(nexttok[0]) == 'T') { /* transmission line */
@@ -1249,16 +1267,12 @@ skip_ends:
snprintf(model, 99, "%s", nexttok);
/* Any other device properties? */
ndev = 1;
while (nexttok != NULL) {
SpiceTokNoNewline();
if ((nexttok == NULL) || (nexttok[0] == '\0')) break;
if ((eqptr = strchr(nexttok, '=')) != NULL) {
*eqptr = '\0';
if (!strcasecmp(nexttok, "M"))
sscanf(eqptr + 1, "%d", &ndev);
else
AddProperty(&kvlist, nexttok, eqptr + 1);
AddProperty(&kvlist, nexttok, eqptr + 1);
}
}
@@ -1270,6 +1284,7 @@ skip_ends:
Port("node2");
Port("node3");
Port("node4");
PropertyInteger(model, filenum, "M", 0, 1);
SetClass(CLASS_XLINE);
EndCell();
ReopenCellDef((*CellStackPtr)->cellname, filenum); /* Reopen */
@@ -1285,20 +1300,15 @@ skip_ends:
else
strcpy(model, "t"); /* Use default xline model */
multi = (ndev > 1) ? 1 : 0;
if (!multi) snprintf(instname, 255, "%s%s", model, inst);
snprintf(instname, 255, "%s%s", model, inst);
while (ndev > 0) {
if (multi) snprintf(instname, 255, "%s%s.%d", model, inst, ndev);
if (usemodel)
Cell(instname, model, node1, node2, node3, node4);
else
XLine((*CellStackPtr)->cellname, instname, node1, node2,
if (usemodel)
Cell(instname, model, node1, node2, node3, node4);
else
XLine((*CellStackPtr)->cellname, instname, node1, node2,
node3, node4);
pobj = LinkProperties(model, kvlist);
ReduceExpressions(pobj, CurrentCell, TRUE);
ndev--;
}
pobj = LinkProperties(model, kvlist);
ReduceExpressions(pobj, NULL, CurrentCell, TRUE);
DeleteProperties(&kvlist);
}
}
@@ -1324,7 +1334,7 @@ skip_ends:
/* Get inductance value (if present); save as property "value" */
if (nexttok != NULL) {
if (StringIsValue(nexttok)) {
if (StringIsValueOrExpression(nexttok)) {
AddProperty(&kvlist, "value", nexttok);
SpiceTokNoNewline();
}
@@ -1338,7 +1348,6 @@ skip_ends:
snprintf(model, 99, "%s", nexttok);
/* Any other device properties? */
ndev = 1;
while (nexttok != NULL)
{
/* Parse for M and other parameters */
@@ -1348,10 +1357,7 @@ skip_ends:
if ((eqptr = strchr(nexttok, '=')) != NULL)
{
*eqptr = '\0';
if (!strcasecmp(nexttok, "M"))
sscanf(eqptr + 1, "%d", &ndev);
else
AddProperty(&kvlist, nexttok, eqptr + 1);
AddProperty(&kvlist, nexttok, eqptr + 1);
}
}
@@ -1361,6 +1367,7 @@ skip_ends:
CellDefNoCase(model, filenum);
Port("end_a");
Port("end_b");
PropertyInteger(model, filenum, "M", 0, 1);
SetClass(CLASS_INDUCTOR);
EndCell();
ReopenCellDef((*CellStackPtr)->cellname, filenum); /* Reopen */
@@ -1376,19 +1383,13 @@ skip_ends:
else
strcpy(model, "l"); /* Use default inductor model */
multi = (ndev > 1) ? 1 : 0;
if (!multi) snprintf(instname, 255, "%s%s", model, inst);
while (ndev > 0)
{
if (multi) snprintf(instname, 255, "%s%s.%d", model, inst, ndev);
if (usemodel)
Cell(instname, model, end_a, end_b);
else
Inductor((*CellStackPtr)->cellname, instname, end_a, end_b);
pobj = LinkProperties(model, kvlist);
ReduceExpressions(pobj, CurrentCell, TRUE);
ndev--;
}
snprintf(instname, 255, "%s%s", model, inst);
if (usemodel)
Cell(instname, model, end_a, end_b);
else
Inductor((*CellStackPtr)->cellname, instname, end_a, end_b);
pobj = LinkProperties(model, kvlist);
ReduceExpressions(pobj, NULL, CurrentCell, TRUE);
DeleteProperties(&kvlist);
}
@@ -1424,7 +1425,7 @@ skip_ends:
*eqptr = '\0';
AddProperty(&kvlist, nexttok, eqptr + 1);
}
else if (StringIsValue(nexttok)) {
else if (StringIsValueOrExpression(nexttok)) {
AddProperty(&kvlist, "value", nexttok);
SpiceTokNoNewline();
}
@@ -1434,6 +1435,7 @@ skip_ends:
CellDefNoCase(model, filenum);
Port("pos");
Port("neg");
PropertyInteger(model, filenum, "M", 0, 1);
SetClass(CLASS_MODULE);
EndCell();
ReopenCellDef((*CellStackPtr)->cellname, filenum); /* Reopen */
@@ -1446,7 +1448,7 @@ skip_ends:
}
Cell(instname, model, pos, neg);
pobj = LinkProperties(model, kvlist);
ReduceExpressions(pobj, CurrentCell, TRUE);
ReduceExpressions(pobj, NULL, CurrentCell, TRUE);
DeleteProperties(&kvlist);
}
else if (toupper(nexttok[0]) == 'I') { /* current source */
@@ -1477,7 +1479,7 @@ skip_ends:
*eqptr = '\0';
AddProperty(&kvlist, nexttok, eqptr + 1);
}
else if (StringIsValue(nexttok)) {
else if (StringIsValueOrExpression(nexttok)) {
AddProperty(&kvlist, "value", nexttok);
SpiceTokNoNewline();
}
@@ -1487,6 +1489,7 @@ skip_ends:
CellDefNoCase(model, filenum);
Port("pos");
Port("neg");
PropertyInteger(model, filenum, "M", 0, 1);
SetClass(CLASS_MODULE);
EndCell();
ReopenCellDef((*CellStackPtr)->cellname, filenum); /* Reopen */
@@ -1499,7 +1502,7 @@ skip_ends:
}
Cell(instname, model, pos, neg);
pobj = LinkProperties(model, kvlist);
ReduceExpressions(pobj, CurrentCell, TRUE);
ReduceExpressions(pobj, NULL, CurrentCell, TRUE);
DeleteProperties(&kvlist);
}
else if (toupper(nexttok[0]) == 'E') { /* controlled voltage source */
@@ -1539,7 +1542,7 @@ skip_ends:
*eqptr = '\0';
AddProperty(&kvlist, nexttok, eqptr + 1);
}
else if (StringIsValue(nexttok)) {
else if (StringIsValueOrExpression(nexttok)) {
AddProperty(&kvlist, "value", nexttok);
SpiceTokNoNewline();
}
@@ -1551,6 +1554,7 @@ skip_ends:
Port("neg");
Port("ctrlp");
Port("ctrln");
PropertyInteger(model, filenum, "M", 0, 1);
SetClass(CLASS_MODULE);
EndCell();
ReopenCellDef((*CellStackPtr)->cellname, filenum); /* Reopen */
@@ -1563,12 +1567,14 @@ skip_ends:
}
Cell(instname, model, pos, neg, ctrlp, ctrln);
pobj = LinkProperties(model, kvlist);
ReduceExpressions(pobj, CurrentCell, TRUE);
ReduceExpressions(pobj, NULL, CurrentCell, TRUE);
DeleteProperties(&kvlist);
}
else if (toupper(nexttok[0]) == 'X') { /* subcircuit instances */
char instancename[100], subcktname[100];
int itype;
instancename[99] = '\0';
subcktname[99] = '\0';
@@ -1590,7 +1596,6 @@ skip_ends:
head = NULL;
tail = NULL;
SpiceTokNoNewline();
ndev = 1;
while (nexttok != NULL) {
/* must still be a node or a parameter */
struct portelement *new_port;
@@ -1618,10 +1623,7 @@ skip_ends:
((tp = LookupCellFile(nexttok, filenum)) == NULL))
{
*eqptr = '\0';
if (!strcasecmp(nexttok, "M"))
sscanf(eqptr + 1, "%d", &ndev);
else
AddProperty(&kvlist, nexttok, eqptr + 1);
AddProperty(&kvlist, nexttok, eqptr + 1);
}
else
{
@@ -1645,6 +1647,34 @@ skip_ends:
if (scan->next != NULL) scan = scan->next;
tail->next = NULL;
/* Check for ignored class */
if ((itype = IsIgnored(subcktname, filenum)) == IGNORE_CLASS) {
Printf("Class '%s' instanced in input but is being ignored.\n", model);
return;
}
/* Check for shorted pins */
if ((itype == IGNORE_SHORTED) && (head != NULL)) {
unsigned char shorted = (unsigned char)1;
struct portelement *p;
for (p = head->next; p; p = p->next) {
if (strcasecmp(head->name, p->name))
shorted = (unsigned char)0;
break;
}
if (shorted == (unsigned char)1) {
Printf("Instance of '%s' is shorted, ignoring.\n", subcktname);
while (head) {
p = head->next;
FREE(head);
head = p;
}
return;
}
}
/* Create cell name and revise instance name based on the cell name */
/* For clarity, if "instancename" does not contain the cellname, */
/* then prepend the cellname to the instance name. HOWEVER, if any */
@@ -1693,6 +1723,7 @@ skip_ends:
if (head == NULL) {
Port((char *)NULL); // Must have something for pin 1
}
PropertyInteger(subcktname, filenum, "M", 0, 1);
SetClass(CLASS_MODULE);
EndCell();
ReopenCellDef((*CellStackPtr)->cellname, filenum); /* Reopen */
@@ -1700,38 +1731,31 @@ skip_ends:
}
/* nexttok is now NULL, scan->name points to class */
multi = (ndev > 1) ? 1 : 0;
if (multi) strcat(instancename, ".");
while (ndev > 0) {
if (multi) {
char *dotptr = strrchr(instancename, '.');
sprintf(dotptr + 1, "%d", ndev);
}
Instance(subcktname, instancename);
pobj = LinkProperties(subcktname, kvlist);
ReduceExpressions(pobj, CurrentCell, TRUE);
ndev--;
/* (Diagnostic) */
/* Fprintf(stderr, "instancing subcell: %s (%s):", subcktname, instancename); */
/*
Instance(subcktname, instancename);
pobj = LinkProperties(subcktname, kvlist);
ReduceExpressions(pobj, NULL, CurrentCell, TRUE);
/* (Diagnostic) */
/* Fprintf(stderr, "instancing subcell: %s (%s):", subcktname, instancename); */
/*
for (scan = head; scan != NULL; scan = scan->next)
Fprintf(stderr," %s", scan->name);
Fprintf(stderr," %s", scan->name);
Fprintf(stderr,"\n");
*/
*/
obptr = LookupInstance(instancename, CurrentCell);
if (obptr != NULL) {
scan = head;
if (scan != NULL)
do {
if (LookupObject(scan->name, CurrentCell) == NULL) Node(scan->name);
join(scan->name, obptr->name);
obptr = obptr->next;
scan = scan->next;
} while (obptr != NULL && obptr->type > FIRSTPIN && scan != NULL);
obptr = LookupInstance(instancename, CurrentCell);
if (obptr != NULL) {
scan = head;
if (scan != NULL)
do {
if (LookupObject(scan->name, CurrentCell) == NULL) Node(scan->name);
join(scan->name, obptr->name);
obptr = obptr->next;
scan = scan->next;
} while (obptr != NULL && obptr->type > FIRSTPIN && scan != NULL);
if ((obptr == NULL && scan != NULL) ||
if ((obptr == NULL && scan != NULL) ||
(obptr != NULL && scan == NULL && obptr->type > FIRSTPIN)) {
if (warnings <= 100) {
Fprintf(stderr,"Parameter list mismatch in %s: ", instancename);
@@ -1745,8 +1769,7 @@ skip_ends:
Fprintf(stderr, "Too many warnings. . . will not report any more.\n");
}
warnings++;
}
} // repeat over ndev
}
}
DeleteProperties(&kvlist);
@@ -1828,7 +1851,7 @@ char *ReadSpiceTop(char *fname, int *fnum, int blackbox)
SetExtension(name, fname, SPICE_EXTENSION);
if ((filenum = OpenParseFile(name, *fnum)) < 0) {
Fprintf(stderr,"No file: %s\n",name);
Fprintf(stderr,"Error in SPICE file read: No file %s\n",name);
*fnum = filenum;
return NULL;
}
@@ -1839,8 +1862,7 @@ char *ReadSpiceTop(char *fname, int *fnum, int blackbox)
matchintfunc = matchfilenocase;
hashfunc = hashnocase;
spiceparams = (struct hashlist **)CALLOC(OBJHASHSIZE,
sizeof(struct hashlist *));
InitializeHashTable(&spiceparams, OBJHASHSIZE);
/* All spice files should start with a comment line, */
/* but we won't depend upon it. Any comment line */
@@ -1852,10 +1874,8 @@ char *ReadSpiceTop(char *fname, int *fnum, int blackbox)
// Cleanup
while (CellStack != NULL) PopStack(&CellStack);
RecurseHashTable(spiceparams, OBJHASHSIZE, freeprop);
HashKill(spiceparams, OBJHASHSIZE);
FREE(spiceparams);
spiceparams = NULL;
RecurseHashTable(&spiceparams, freeprop);
HashKill(&spiceparams);
// Important: If the file is a library, containing subcircuit
// definitions but no components, then it needs to be registered
@@ -1921,12 +1941,15 @@ void IncludeSpice(char *fname, int parent, struct cellstack **CellStackPtr,
if ((filenum = OpenParseFile(fname, parent)) < 0) {
/* If that fails, see if a standard SPICE extension */
/* helps. But really, we're getting desperate at this */
/* point. */
/* helps, if the file didn't have an extension. But */
/* really, we're getting desperate at this point. */
SetExtension(name, fname, SPICE_EXTENSION);
if ((filenum = OpenParseFile(name, parent)) < 0) {
Fprintf(stderr,"No file: %s\n",name);
if (strchr(fname, '.') == NULL) {
SetExtension(name, fname, SPICE_EXTENSION);
filenum = OpenParseFile(name, parent);
}
if (filenum < 0) {
Fprintf(stderr,"Error in SPICE file include: No file %s\n",name);
return;
}
}
+3 -2
View File
@@ -36,7 +36,7 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#define XILINXHASHSIZE 99
static long xilinxhashbase = 0xA00;
static struct hashlist *xilinxnametab[XILINXHASHSIZE];
static struct hashdict xilinxnamedict;
static FILE *xilinxfile;
char *gndnet = "0";
@@ -132,6 +132,7 @@ char *xilinx_class(model)
}
return(model);
}
void
Xilinx(cellname, filename)
char *cellname;
char *filename;
@@ -156,7 +157,7 @@ Xilinx(cellname, filename)
return;
}
ClearDumpedList();
InitializeHashTable(xilinxnametab, XILINXHASHSIZE);
InitializeHashTable(&xilinxnamedict, XILINXHASHSIZE);
if (LookupCell(cellname) != NULL)
xilinxCell(cellname);
CloseFile(FileName);
+1 -1
View File
@@ -271,7 +271,7 @@ void initialize_netcmp_datastructures(Widget w, Widget textwidget,
{
X_START();
Printf("Comparing cells '%s' and '%s'\n", get_cell(), get_other());
CreateTwoLists(get_cell(), get_other());
CreateTwoLists(get_cell(), get_other(), 0);
Permute();
#ifdef DEBUG_ALLOC
PrintCoreStats();
+19 -17
View File
@@ -24,8 +24,8 @@ INSTALL_DATA = ${INSTALL} -m 644
INSTALL_SCRIPT = ${INSTALL}
# Override standard "make" target when compiling under TCL
ALL_TARGET = standard
INSTALL_TARGET = install-netgen
ALL_TARGET = tcl
INSTALL_TARGET = install-tcl
# Change CADDIR to install in a different place
BINDIR = ${bindir}
@@ -34,16 +34,16 @@ LIBDIR = ${libdir}
DOCDIR = ${libdir}/netgen/doc
TCLDIR = ${libdir}/netgen/tcl
MAIN_EXTRA_LIBS =
MAIN_EXTRA_LIBS = ${NETGENDIR}/tcltk/libtcltk.o
LD_EXTRA_LIBS =
LD_SHARED =
TOP_EXTRA_LIBS =
SUB_EXTRA_LIBS =
MODULES +=
UNUSED_MODULES += tcltk
PROGRAMS += netgen
INSTALL_CAD_DIRS +=
MODULES += tcltk
UNUSED_MODULES +=
PROGRAMS += tcltk
INSTALL_CAD_DIRS += tcltk
RM = rm -f
CP = cp
@@ -53,29 +53,31 @@ LINK = /bin/ld -r
LD = /bin/ld
M4 = /bin/m4
RANLIB = ranlib
SHDLIB_EXT =
LDDL_FLAGS =
SHDLIB_EXT = .so
LDDL_FLAGS = -shared -Wl,-soname,$@ -Wl,--version-script=${NETGENDIR}/netgen/symbol.map
LD_RUN_PATH =
LIB_SPECS =
WISH_EXE =
TCL_LIB_DIR =
LIB_SPECS = -L/usr/lib64 -ltkstub8.6 -L/usr/lib64 -ltclstub8.6
LIB_SPECS_NOSTUB = -L/usr/lib64 -ltk8.6 -L/usr/lib64 -ltcl8.6
WISH_EXE = /usr/bin/wish
TCL_LIB_DIR = /usr/lib
CC = gcc
CPP = gcc -E -x c
CXX = @CXX@
CPPFLAGS = -I. -I${NETGENDIR}
DFLAGS = -DCAD_DIR=\"${LIBDIR}\" -DPACKAGE_NAME=\"netgen\" -DPACKAGE_TARNAME=\"netgen\" -DPACKAGE_VERSION=\"1.3\" -DPACKAGE_STRING=\"netgen\ 1.3\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"47\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -Dlinux=1 -DSYSV=1 -DISC=1 -DSHDLIB_EXT=\"\" -DNDEBUG
CFLAGS = -g -m64 -fPIC
DFLAGS = -DCAD_DIR=\"${LIBDIR}\" -DTCL_DIR=\"${TCLDIR}\" -DUSE_TCL_STUBS -DUSE_TK_STUBS -DPACKAGE_NAME=\"netgen\" -DPACKAGE_TARNAME=\"netgen\" -DPACKAGE_VERSION=\"1.3\" -DPACKAGE_STRING=\"netgen\ 1.3\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"90\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1 -DSHDLIB_EXT=\".so\" -DNDEBUG
DFLAGS_NOSTUB = -DCAD_DIR=\"${LIBDIR}\" -DTCL_DIR=\"${TCLDIR}\" -DPACKAGE_NAME=\"netgen\" -DPACKAGE_TARNAME=\"netgen\" -DPACKAGE_VERSION=\"1.3\" -DPACKAGE_STRING=\"netgen\ 1.3\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"90\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1 -DSHDLIB_EXT=\".so\" -DNDEBUG
CFLAGS = -g -m64 -fPIC -fPIC
DEPEND_FILE = Depend
DEPEND_FLAG = -MM
EXEEXT =
GR_CFLAGS =
GR_DFLAGS = -DNDEBUG
GR_LIBS =
GR_SRCS =
GR_DFLAGS = -DX11 -DXLIB -DNDEBUG
GR_LIBS = -lX11
GR_SRCS = ${TK_SRCS}
OBJS = ${SRCS:.c=.o}
LIB_OBJS = ${LIB_SRCS:.c=.o}
-668
View File
@@ -1,668 +0,0 @@
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgen.tcl
cp netgen.tcl /usr/local/lib/netgen/tcl/netgen.tcl
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgen.tcl
cp netgen.tcl /usr/local/lib/netgen/tcl/netgen.tcl
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgen.tcl
cp netgen.tcl /usr/local/lib/netgen/tcl/netgen.tcl
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgen.tcl
cp netgen.tcl /usr/local/lib/netgen/tcl/netgen.tcl
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgen.tcl
cp netgen.tcl /usr/local/lib/netgen/tcl/netgen.tcl
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgen.tcl
cp netgen.tcl /usr/local/lib/netgen/tcl/netgen.tcl
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgen.tcl
cp netgen.tcl /usr/local/lib/netgen/tcl/netgen.tcl
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgen.tcl
cp netgen.tcl /usr/local/lib/netgen/tcl/netgen.tcl
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
make[1]: Entering directory '/home/tim/gitsrc/netgen-1.5'
./scripts/mkdirs /usr/local/bin /usr/local/share/man \
/usr/local/lib/netgen/tcl
for dir in lib doc tcltk netgen tcltk; do \
(cd $dir && make install-tcl); done
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Nothing to be done for 'install-tcl'.
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/lib'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/doc'
../scripts/mkdirs /usr/local/share/man /usr/local/share/man/man1
../scripts/mkdirs /usr/local/lib/netgen/doc
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/doc'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgen.tcl
cp netgen.tcl /usr/local/lib/netgen/tcl/netgen.tcl
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/netgen'
rm -f /usr/local/lib/netgen/tcl/tclnetgen.so
cp tclnetgen.so /usr/local/lib/netgen/tcl/tclnetgen.so
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/netgen'
make[2]: Entering directory '/home/tim/gitsrc/netgen-1.5/tcltk'
rm -f /usr/local/bin/netgen.sh /usr/local/bin/netgen
cp netgen.sh /usr/local/bin/netgen
(cd /usr/local/bin; chmod 0755 netgen)
rm -f /usr/local/lib/netgen/tcl/netgenexec
cp netgenexec /usr/local/lib/netgen/tcl/netgenexec
make[2]: Leaving directory '/home/tim/gitsrc/netgen-1.5/tcltk'
make[1]: Leaving directory '/home/tim/gitsrc/netgen-1.5'
-2305
View File
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -22,8 +22,8 @@ tclnetgen${SHDLIB_EXT}: ${EXTRA_LIBS}
@echo --- making netgen Tcl library \(tclnetgen${SHDLIB_EXT}\)
${RM} tclnetgen${SHDLIB_EXT}
${CC} ${CFLAGS} ${CPPFLAGS} -o $@ ${LDDL_FLAGS} \
${LD_RUN_PATH} ${EXTRA_LIBS} ${LD_EXTRA_LIBS} -lc ${LIBS} \
${TCL_LIB_SPEC} ${LDFLAGS}
${LD_RUN_PATH} ${EXTRA_LIBS} ${LD_EXTRA_LIBS} \
-lc ${LIBS} ${LIB_SPECS} ${LDFLAGS}
$(DESTDIR)${BINDIR}/netgen:
${RM} $@
Binary file not shown.
+285 -274
View File
@@ -4,7 +4,7 @@ running configure, to aid debugging if configure makes a mistake.
It was created by netgen configure 1.3, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ ./configure --without-tcl
$ ./configure
## --------- ##
## Platform. ##
@@ -12,9 +12,9 @@ generated by GNU Autoconf 2.69. Invocation command line was
hostname = stravinsky
uname -m = x86_64
uname -r = 3.18.3-201.fc21.x86_64
uname -r = 4.1.13-100.fc21.x86_64
uname -s = Linux
uname -v = #1 SMP Mon Jan 19 15:59:31 UTC 2015
uname -v = #1 SMP Tue Nov 10 13:13:20 UTC 2015
/usr/bin/uname -p = x86_64
/bin/uname -X = unknown
@@ -39,83 +39,83 @@ PATH: /usr/local/bin
## Core tests. ##
## ----------- ##
configure:2395: checking build system type
configure:2409: result: x86_64-unknown-linux-gnu
configure:2429: checking host system type
configure:2442: result: x86_64-unknown-linux-gnu
configure:2462: checking target system type
configure:2475: result: x86_64-unknown-linux-gnu
configure:2566: checking for gcc
configure:2582: found /bin/gcc
configure:2593: result: gcc
configure:2822: checking for C compiler version
configure:2831: gcc --version >&5
gcc (GCC) 4.9.2 20141101 (Red Hat 4.9.2-1)
configure:2397: checking build system type
configure:2411: result: x86_64-unknown-linux-gnu
configure:2431: checking host system type
configure:2444: result: x86_64-unknown-linux-gnu
configure:2464: checking target system type
configure:2477: result: x86_64-unknown-linux-gnu
configure:2568: checking for gcc
configure:2584: found /bin/gcc
configure:2595: result: gcc
configure:2824: checking for C compiler version
configure:2833: gcc --version >&5
gcc (GCC) 4.9.2 20150212 (Red Hat 4.9.2-6)
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
configure:2842: $? = 0
configure:2831: gcc -v >&5
configure:2844: $? = 0
configure:2833: gcc -v >&5
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.9.2/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.9.2-20141101/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.9.2-20141101/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --enable-multilib --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.9.2-20150212/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.9.2-20150212/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=i686 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.9.2 20141101 (Red Hat 4.9.2-1) (GCC)
configure:2842: $? = 0
configure:2831: gcc -V >&5
gcc version 4.9.2 20150212 (Red Hat 4.9.2-6) (GCC)
configure:2844: $? = 0
configure:2833: gcc -V >&5
gcc: error: unrecognized command line option '-V'
gcc: fatal error: no input files
compilation terminated.
configure:2842: $? = 4
configure:2831: gcc -qversion >&5
configure:2844: $? = 4
configure:2833: gcc -qversion >&5
gcc: error: unrecognized command line option '-qversion'
gcc: fatal error: no input files
compilation terminated.
configure:2842: $? = 4
configure:2862: checking whether the C compiler works
configure:2884: gcc -g conftest.c >&5
configure:2888: $? = 0
configure:2936: result: yes
configure:2939: checking for C compiler default output file name
configure:2941: result: a.out
configure:2947: checking for suffix of executables
configure:2954: gcc -o conftest -g conftest.c >&5
configure:2958: $? = 0
configure:2980: result:
configure:3002: checking whether we are cross compiling
configure:3010: gcc -o conftest -g conftest.c >&5
configure:3014: $? = 0
configure:3021: ./conftest
configure:3025: $? = 0
configure:3040: result: no
configure:3045: checking for suffix of object files
configure:3067: gcc -c -g conftest.c >&5
configure:3071: $? = 0
configure:3092: result: o
configure:3096: checking whether we are using the GNU C compiler
configure:3115: gcc -c -g conftest.c >&5
configure:3115: $? = 0
configure:3124: result: yes
configure:3133: checking whether gcc accepts -g
configure:3153: gcc -c -g conftest.c >&5
configure:3153: $? = 0
configure:3194: result: yes
configure:3211: checking for gcc option to accept ISO C89
configure:3274: gcc -c -g conftest.c >&5
configure:3274: $? = 0
configure:3287: result: none needed
configure:3312: checking how to run the C preprocessor
configure:3343: gcc -E conftest.c
configure:3343: $? = 0
configure:3357: gcc -E conftest.c
configure:2844: $? = 4
configure:2864: checking whether the C compiler works
configure:2886: gcc -g conftest.c >&5
configure:2890: $? = 0
configure:2938: result: yes
configure:2941: checking for C compiler default output file name
configure:2943: result: a.out
configure:2949: checking for suffix of executables
configure:2956: gcc -o conftest -g conftest.c >&5
configure:2960: $? = 0
configure:2982: result:
configure:3004: checking whether we are cross compiling
configure:3012: gcc -o conftest -g conftest.c >&5
configure:3016: $? = 0
configure:3023: ./conftest
configure:3027: $? = 0
configure:3042: result: no
configure:3047: checking for suffix of object files
configure:3069: gcc -c -g conftest.c >&5
configure:3073: $? = 0
configure:3094: result: o
configure:3098: checking whether we are using the GNU C compiler
configure:3117: gcc -c -g conftest.c >&5
configure:3117: $? = 0
configure:3126: result: yes
configure:3135: checking whether gcc accepts -g
configure:3155: gcc -c -g conftest.c >&5
configure:3155: $? = 0
configure:3196: result: yes
configure:3213: checking for gcc option to accept ISO C89
configure:3276: gcc -c -g conftest.c >&5
configure:3276: $? = 0
configure:3289: result: none needed
configure:3314: checking how to run the C preprocessor
configure:3345: gcc -E conftest.c
configure:3345: $? = 0
configure:3359: gcc -E conftest.c
conftest.c:11:28: fatal error: ac_nonexistent.h: No such file or directory
#include <ac_nonexistent.h>
^
compilation terminated.
configure:3357: $? = 1
configure:3359: $? = 1
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "netgen"
@@ -125,18 +125,18 @@ configure: failed program was:
| #define PACKAGE_BUGREPORT "[email protected]"
| #define PACKAGE_URL ""
| #define NETGEN_VERSION "1.5"
| #define NETGEN_REVISION "47"
| #define NETGEN_REVISION "90"
| /* end confdefs.h. */
| #include <ac_nonexistent.h>
configure:3382: result: gcc -E
configure:3402: gcc -E conftest.c
configure:3402: $? = 0
configure:3416: gcc -E conftest.c
configure:3384: result: gcc -E
configure:3404: gcc -E conftest.c
configure:3404: $? = 0
configure:3418: gcc -E conftest.c
conftest.c:11:28: fatal error: ac_nonexistent.h: No such file or directory
#include <ac_nonexistent.h>
^
compilation terminated.
configure:3416: $? = 1
configure:3418: $? = 1
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "netgen"
@@ -146,104 +146,104 @@ configure: failed program was:
| #define PACKAGE_BUGREPORT "[email protected]"
| #define PACKAGE_URL ""
| #define NETGEN_VERSION "1.5"
| #define NETGEN_REVISION "47"
| #define NETGEN_REVISION "90"
| /* end confdefs.h. */
| #include <ac_nonexistent.h>
configure:3445: checking for library containing strerror
configure:3476: gcc -o conftest -g conftest.c >&5
configure:3476: $? = 0
configure:3493: result: none required
configure:3515: checking for a BSD-compatible install
configure:3583: result: /bin/install -c
configure:3637: checking for ranlib
configure:3653: found /bin/ranlib
configure:3664: result: ranlib
configure:3691: checking for gm4
configure:3724: result: no
configure:3691: checking for gnum4
configure:3724: result: no
configure:3691: checking for m4
configure:3709: found /bin/m4
configure:3721: result: /bin/m4
configure:3762: checking for ld used by GCC
configure:3825: result: /bin/ld
configure:3832: checking if the linker (/bin/ld) is GNU ld
configure:3447: checking for library containing strerror
configure:3478: gcc -o conftest -g conftest.c >&5
configure:3478: $? = 0
configure:3495: result: none required
configure:3517: checking for a BSD-compatible install
configure:3585: result: /bin/install -c
configure:3639: checking for ranlib
configure:3655: found /bin/ranlib
configure:3666: result: ranlib
configure:3693: checking for gm4
configure:3726: result: no
configure:3693: checking for gnum4
configure:3726: result: no
configure:3693: checking for m4
configure:3711: found /bin/m4
configure:3723: result: /bin/m4
configure:3764: checking for ld used by GCC
configure:3827: result: /bin/ld
configure:3834: checking if the linker (/bin/ld) is GNU ld
GNU ld version 2.24
configure:3844: result: yes
configure:3851: checking for grep that handles long lines and -e
configure:3909: result: /bin/grep
configure:3914: checking for egrep
configure:3976: result: /bin/grep -E
configure:3981: checking for ANSI C header files
configure:4001: gcc -c -g conftest.c >&5
configure:4001: $? = 0
configure:4074: gcc -o conftest -g conftest.c >&5
configure:4074: $? = 0
configure:4074: ./conftest
configure:4074: $? = 0
configure:4085: result: yes
configure:4098: checking for sys/types.h
configure:4098: gcc -c -g conftest.c >&5
configure:4098: $? = 0
configure:4098: result: yes
configure:4098: checking for sys/stat.h
configure:4098: gcc -c -g conftest.c >&5
configure:4098: $? = 0
configure:4098: result: yes
configure:4098: checking for stdlib.h
configure:4098: gcc -c -g conftest.c >&5
configure:4098: $? = 0
configure:4098: result: yes
configure:4098: checking for string.h
configure:4098: gcc -c -g conftest.c >&5
configure:4098: $? = 0
configure:4098: result: yes
configure:4098: checking for memory.h
configure:4098: gcc -c -g conftest.c >&5
configure:4098: $? = 0
configure:4098: result: yes
configure:4098: checking for strings.h
configure:4098: gcc -c -g conftest.c >&5
configure:4098: $? = 0
configure:4098: result: yes
configure:4098: checking for inttypes.h
configure:4098: gcc -c -g conftest.c >&5
configure:4098: $? = 0
configure:4098: result: yes
configure:4098: checking for stdint.h
configure:4098: gcc -c -g conftest.c >&5
configure:4098: $? = 0
configure:4098: result: yes
configure:4098: checking for unistd.h
configure:4098: gcc -c -g conftest.c >&5
configure:4098: $? = 0
configure:4098: result: yes
configure:4114: checking size of void *
configure:4119: gcc -o conftest -g conftest.c >&5
configure:4119: $? = 0
configure:4119: ./conftest
configure:4119: $? = 0
configure:4133: result: 8
configure:4147: checking size of unsigned int
configure:4152: gcc -o conftest -g conftest.c >&5
configure:4152: $? = 0
configure:4152: ./conftest
configure:4152: $? = 0
configure:4166: result: 4
configure:4180: checking size of unsigned long
configure:4185: gcc -o conftest -g conftest.c >&5
configure:4185: $? = 0
configure:4185: ./conftest
configure:4185: $? = 0
configure:4199: result: 8
configure:4213: checking size of unsigned long long
configure:4218: gcc -o conftest -g conftest.c >&5
configure:4218: $? = 0
configure:4218: ./conftest
configure:4218: $? = 0
configure:4232: result: 8
configure:4243: checking whether byte ordering is bigendian
configure:4258: gcc -c -g conftest.c >&5
configure:3846: result: yes
configure:3853: checking for grep that handles long lines and -e
configure:3911: result: /bin/grep
configure:3916: checking for egrep
configure:3978: result: /bin/grep -E
configure:3983: checking for ANSI C header files
configure:4003: gcc -c -g conftest.c >&5
configure:4003: $? = 0
configure:4076: gcc -o conftest -g conftest.c >&5
configure:4076: $? = 0
configure:4076: ./conftest
configure:4076: $? = 0
configure:4087: result: yes
configure:4100: checking for sys/types.h
configure:4100: gcc -c -g conftest.c >&5
configure:4100: $? = 0
configure:4100: result: yes
configure:4100: checking for sys/stat.h
configure:4100: gcc -c -g conftest.c >&5
configure:4100: $? = 0
configure:4100: result: yes
configure:4100: checking for stdlib.h
configure:4100: gcc -c -g conftest.c >&5
configure:4100: $? = 0
configure:4100: result: yes
configure:4100: checking for string.h
configure:4100: gcc -c -g conftest.c >&5
configure:4100: $? = 0
configure:4100: result: yes
configure:4100: checking for memory.h
configure:4100: gcc -c -g conftest.c >&5
configure:4100: $? = 0
configure:4100: result: yes
configure:4100: checking for strings.h
configure:4100: gcc -c -g conftest.c >&5
configure:4100: $? = 0
configure:4100: result: yes
configure:4100: checking for inttypes.h
configure:4100: gcc -c -g conftest.c >&5
configure:4100: $? = 0
configure:4100: result: yes
configure:4100: checking for stdint.h
configure:4100: gcc -c -g conftest.c >&5
configure:4100: $? = 0
configure:4100: result: yes
configure:4100: checking for unistd.h
configure:4100: gcc -c -g conftest.c >&5
configure:4100: $? = 0
configure:4100: result: yes
configure:4116: checking size of void *
configure:4121: gcc -o conftest -g conftest.c >&5
configure:4121: $? = 0
configure:4121: ./conftest
configure:4121: $? = 0
configure:4135: result: 8
configure:4149: checking size of unsigned int
configure:4154: gcc -o conftest -g conftest.c >&5
configure:4154: $? = 0
configure:4154: ./conftest
configure:4154: $? = 0
configure:4168: result: 4
configure:4182: checking size of unsigned long
configure:4187: gcc -o conftest -g conftest.c >&5
configure:4187: $? = 0
configure:4187: ./conftest
configure:4187: $? = 0
configure:4201: result: 8
configure:4215: checking size of unsigned long long
configure:4220: gcc -o conftest -g conftest.c >&5
configure:4220: $? = 0
configure:4220: ./conftest
configure:4220: $? = 0
configure:4234: result: 8
configure:4245: checking whether byte ordering is bigendian
configure:4260: gcc -c -g conftest.c >&5
conftest.c:26:9: error: unknown type name 'not'
not a universal capable compiler
^
@@ -251,7 +251,7 @@ conftest.c:26:15: error: expected '=', ',', ';', 'asm' or '__attribute__' before
not a universal capable compiler
^
conftest.c:26:15: error: unknown type name 'universal'
configure:4258: $? = 1
configure:4260: $? = 1
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "netgen"
@@ -261,7 +261,7 @@ configure: failed program was:
| #define PACKAGE_BUGREPORT "[email protected]"
| #define PACKAGE_URL ""
| #define NETGEN_VERSION "1.5"
| #define NETGEN_REVISION "47"
| #define NETGEN_REVISION "90"
| #define STDC_HEADERS 1
| #define HAVE_SYS_TYPES_H 1
| #define HAVE_SYS_STAT_H 1
@@ -282,9 +282,9 @@ configure: failed program was:
| #endif
| typedef int dummy;
|
configure:4303: gcc -c -g conftest.c >&5
configure:4303: $? = 0
configure:4321: gcc -c -g conftest.c >&5
configure:4305: gcc -c -g conftest.c >&5
configure:4305: $? = 0
configure:4323: gcc -c -g conftest.c >&5
conftest.c: In function 'main':
conftest.c:32:4: error: unknown type name 'not'
not big endian
@@ -292,7 +292,7 @@ conftest.c:32:4: error: unknown type name 'not'
conftest.c:32:12: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'endian'
not big endian
^
configure:4321: $? = 1
configure:4323: $? = 1
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "netgen"
@@ -302,7 +302,7 @@ configure: failed program was:
| #define PACKAGE_BUGREPORT "[email protected]"
| #define PACKAGE_URL ""
| #define NETGEN_VERSION "1.5"
| #define NETGEN_REVISION "47"
| #define NETGEN_REVISION "90"
| #define STDC_HEADERS 1
| #define HAVE_SYS_TYPES_H 1
| #define HAVE_SYS_STAT_H 1
@@ -331,48 +331,48 @@ configure: failed program was:
| ;
| return 0;
| }
configure:4449: result: no
configure:4468: checking for ANSI C header files
configure:4572: result: yes
configure:4584: checking for setenv
configure:4584: gcc -o conftest -g conftest.c >&5
configure:4584: $? = 0
configure:4584: result: yes
configure:4584: checking for putenv
configure:4584: gcc -o conftest -g conftest.c >&5
configure:4584: $? = 0
configure:4584: result: yes
configure:4594: checking for vfork
configure:4594: gcc -o conftest -g conftest.c >&5
configure:4594: $? = 0
configure:4594: result: yes
configure:4602: checking dirent.h usability
configure:4602: gcc -c -g conftest.c >&5
configure:4602: $? = 0
configure:4602: result: yes
configure:4602: checking dirent.h presence
configure:4602: gcc -E -x c conftest.c
configure:4602: $? = 0
configure:4602: result: yes
configure:4602: checking for dirent.h
configure:4602: result: yes
configure:4615: checking limits.h usability
configure:4615: gcc -c -g conftest.c >&5
configure:4615: $? = 0
configure:4615: result: yes
configure:4615: checking limits.h presence
configure:4615: gcc -E -x c conftest.c
configure:4615: $? = 0
configure:4615: result: yes
configure:4615: checking for limits.h
configure:4615: result: yes
configure:4628: checking param.h usability
configure:4628: gcc -c -g conftest.c >&5
configure:4451: result: no
configure:4470: checking for ANSI C header files
configure:4574: result: yes
configure:4586: checking for setenv
configure:4586: gcc -o conftest -g conftest.c >&5
configure:4586: $? = 0
configure:4586: result: yes
configure:4586: checking for putenv
configure:4586: gcc -o conftest -g conftest.c >&5
configure:4586: $? = 0
configure:4586: result: yes
configure:4596: checking for vfork
configure:4596: gcc -o conftest -g conftest.c >&5
configure:4596: $? = 0
configure:4596: result: yes
configure:4604: checking dirent.h usability
configure:4604: gcc -c -g conftest.c >&5
configure:4604: $? = 0
configure:4604: result: yes
configure:4604: checking dirent.h presence
configure:4604: gcc -E -x c conftest.c
configure:4604: $? = 0
configure:4604: result: yes
configure:4604: checking for dirent.h
configure:4604: result: yes
configure:4617: checking limits.h usability
configure:4617: gcc -c -g conftest.c >&5
configure:4617: $? = 0
configure:4617: result: yes
configure:4617: checking limits.h presence
configure:4617: gcc -E -x c conftest.c
configure:4617: $? = 0
configure:4617: result: yes
configure:4617: checking for limits.h
configure:4617: result: yes
configure:4630: checking param.h usability
configure:4630: gcc -c -g conftest.c >&5
conftest.c:63:19: fatal error: param.h: No such file or directory
#include <param.h>
^
compilation terminated.
configure:4628: $? = 1
configure:4630: $? = 1
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "netgen"
@@ -382,7 +382,7 @@ configure: failed program was:
| #define PACKAGE_BUGREPORT "[email protected]"
| #define PACKAGE_URL ""
| #define NETGEN_VERSION "1.5"
| #define NETGEN_REVISION "47"
| #define NETGEN_REVISION "90"
| #define STDC_HEADERS 1
| #define HAVE_SYS_TYPES_H 1
| #define HAVE_SYS_STAT_H 1
@@ -437,14 +437,14 @@ configure: failed program was:
| # include <unistd.h>
| #endif
| #include <param.h>
configure:4628: result: no
configure:4628: checking param.h presence
configure:4628: gcc -E -x c conftest.c
configure:4630: result: no
configure:4630: checking param.h presence
configure:4630: gcc -E -x c conftest.c
conftest.c:30:19: fatal error: param.h: No such file or directory
#include <param.h>
^
compilation terminated.
configure:4628: $? = 1
configure:4630: $? = 1
configure: failed program was:
| /* confdefs.h */
| #define PACKAGE_NAME "netgen"
@@ -454,7 +454,7 @@ configure: failed program was:
| #define PACKAGE_BUGREPORT "[email protected]"
| #define PACKAGE_URL ""
| #define NETGEN_VERSION "1.5"
| #define NETGEN_REVISION "47"
| #define NETGEN_REVISION "90"
| #define STDC_HEADERS 1
| #define HAVE_SYS_TYPES_H 1
| #define HAVE_SYS_STAT_H 1
@@ -476,44 +476,52 @@ configure: failed program was:
| #define HAVE_LIMITS_H 1
| /* end confdefs.h. */
| #include <param.h>
configure:4628: result: no
configure:4628: checking for param.h
configure:4628: result: no
configure:4639: checking for va_copy
configure:4657: gcc -o conftest -g conftest.c >&5
configure:4657: $? = 0
configure:4666: result: yes
configure:4674: checking for __va_copy
configure:4692: gcc -o conftest -g conftest.c >&5
configure:4692: $? = 0
configure:4701: result: yes
configure:5288: checking for X
configure:5427: gcc -o conftest -g conftest.c -lX11 >&5
configure:5427: $? = 0
configure:5477: result: libraries , headers
configure:5576: gcc -o conftest -g conftest.c -lX11 >&5
configure:5576: $? = 0
configure:5674: checking for gethostbyname
configure:5674: gcc -o conftest -g conftest.c >&5
configure:5674: $? = 0
configure:5674: result: yes
configure:5771: checking for connect
configure:5771: gcc -o conftest -g conftest.c >&5
configure:5771: $? = 0
configure:5771: result: yes
configure:5820: checking for remove
configure:5820: gcc -o conftest -g conftest.c >&5
configure:5820: $? = 0
configure:5820: result: yes
configure:5869: checking for shmat
configure:5869: gcc -o conftest -g conftest.c >&5
configure:5869: $? = 0
configure:5869: result: yes
configure:5927: checking for IceConnectionNumber in -lICE
configure:5952: gcc -o conftest -g conftest.c -lICE >&5
configure:5952: $? = 0
configure:5961: result: yes
configure:6675: creating ./config.status
configure:4630: result: no
configure:4630: checking for param.h
configure:4630: result: no
configure:4641: checking for va_copy
configure:4659: gcc -o conftest -g conftest.c >&5
configure:4659: $? = 0
configure:4668: result: yes
configure:4676: checking for __va_copy
configure:4694: gcc -o conftest -g conftest.c >&5
configure:4694: $? = 0
configure:4703: result: yes
configure:4834: checking for tclConfig.sh
configure:4906: result: /usr/lib64/tclConfig.sh
configure:4922: checking for tkConfig.sh
configure:4995: result: /usr/lib64/tkConfig.sh
configure:5128: checking for wish executable
configure:5155: result: /usr/bin/wish
configure:5161: checking for tclsh executable
configure:5187: result: /usr/bin/tclsh
configure:5310: checking for X
configure:5449: gcc -o conftest -g conftest.c -lX11 >&5
configure:5449: $? = 0
configure:5499: result: libraries , headers
configure:5598: gcc -o conftest -g conftest.c -lX11 >&5
configure:5598: $? = 0
configure:5696: checking for gethostbyname
configure:5696: gcc -o conftest -g conftest.c >&5
configure:5696: $? = 0
configure:5696: result: yes
configure:5793: checking for connect
configure:5793: gcc -o conftest -g conftest.c >&5
configure:5793: $? = 0
configure:5793: result: yes
configure:5842: checking for remove
configure:5842: gcc -o conftest -g conftest.c >&5
configure:5842: $? = 0
configure:5842: result: yes
configure:5891: checking for shmat
configure:5891: gcc -o conftest -g conftest.c >&5
configure:5891: $? = 0
configure:5891: result: yes
configure:5949: checking for IceConnectionNumber in -lICE
configure:5974: gcc -o conftest -g conftest.c -lICE >&5
configure:5974: $? = 0
configure:5983: result: yes
configure:6704: creating ./config.status
## ---------------------- ##
## Running config.status. ##
@@ -530,8 +538,8 @@ generated by GNU Autoconf 2.69. Invocation command line was
on stravinsky
config.status:781: creating defs.mak
config.status:884: WARNING: 'defs.mak.in' seems to ignore the --datarootdir setting
config.status:783: creating defs.mak
config.status:886: WARNING: 'defs.mak.in' seems to ignore the --datarootdir setting
## ---------------- ##
## Cache variables. ##
@@ -608,32 +616,33 @@ ac_cv_target=x86_64-unknown-linux-gnu
## Output variables. ##
## ----------------- ##
ALL_TARGET='standard'
ALL_TARGET='tcl'
CC='gcc'
CFLAGS='-g -m64 -fPIC'
CPP='gcc -E -x c'
CPPFLAGS=''
DEFS='-DPACKAGE_NAME=\"netgen\" -DPACKAGE_TARNAME=\"netgen\" -DPACKAGE_VERSION=\"1.3\" -DPACKAGE_STRING=\"netgen\ 1.3\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"47\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -Dlinux=1 -DSYSV=1 -DISC=1'
DEFS='-DPACKAGE_NAME=\"netgen\" -DPACKAGE_TARNAME=\"netgen\" -DPACKAGE_VERSION=\"1.3\" -DPACKAGE_STRING=\"netgen\ 1.3\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"90\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1'
DEPEND_FLAG='-MM'
ECHO_C=''
ECHO_N='printf'
ECHO_T=''
EGREP='/bin/grep -E'
EXEEXT=''
EXTRA_LIB_SPECS=''
EXTRA_LIB_SPECS='-ldl'
GREP='/bin/grep'
INC_SPECS=''
INSTALL_DATA='${INSTALL} -m 644'
INSTALL_PROGRAM='${INSTALL}'
INSTALL_SCRIPT='${INSTALL}'
INSTALL_TARGET='install-netgen'
INSTALL_TARGET='install-tcl'
LD='/bin/ld'
LDDL_FLAGS=''
LDDL_FLAGS=' -shared -Wl,-soname,$@ -Wl,--version-script=${NETGENDIR}/netgen/symbol.map'
LDFLAGS=''
LD_RUN_PATH=''
LIBOBJS=''
LIBS=''
LIB_SPECS=''
LIB_SPECS=' -L/usr/lib64 -ltkstub8.6 -L/usr/lib64 -ltclstub8.6'
LIB_SPECS_NOSTUB=' -L/usr/lib64 -ltk8.6 -L/usr/lib64 -ltcl8.6'
LTLIBOBJS=''
M4='/bin/m4'
OBJEXT='o'
@@ -647,15 +656,15 @@ PACKAGE_VERSION='1.3'
PATH_SEPARATOR=':'
RANLIB='ranlib'
SCRIPTS=''
SHDLIB_EXT=''
SHDLIB_EXT='.so'
SHELL='/bin/sh'
SHLIB_CFLAGS=''
SHLIB_CFLAGS='-fPIC'
SHLIB_LD=''
SHLIB_LIB_SPECS=''
TCLSH_EXE=''
TCL_LIB_DIR=''
TCLSH_EXE='/usr/bin/tclsh'
TCL_LIB_DIR='/usr/lib'
VERSION=''
WISH_EXE=''
WISH_EXE='/usr/bin/wish'
XMKMF=''
X_CFLAGS=''
X_EXTRA_LIBS=''
@@ -668,18 +677,18 @@ build_alias=''
build_cpu='x86_64'
build_os='linux-gnu'
build_vendor='unknown'
cadinstall=''
cadinstall=' tcltk'
datadir='${datarootdir}'
datarootdir='${prefix}/share'
docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
dvidir='${docdir}'
exec_prefix='${prefix}'
extra_defs=' -DCAD_DIR=\"${LIBDIR}\"'
extra_libs=''
extra_defs=' -DCAD_DIR=\"${LIBDIR}\" -DTCL_DIR=\"${TCLDIR}\"'
extra_libs=' ${NETGENDIR}/tcltk/libtcltk.o'
gr_cflags=''
gr_dflags=''
gr_libs=''
gr_srcs=''
gr_dflags=' -DX11 -DXLIB'
gr_libs=' -lX11'
gr_srcs=' ${TK_SRCS}'
host='x86_64-unknown-linux-gnu'
host_alias=''
host_cpu='x86_64'
@@ -695,15 +704,16 @@ libexecdir='${exec_prefix}/libexec'
localedir='${datarootdir}/locale'
localstatedir='${prefix}/var'
mandir='${datarootdir}/man'
modules=''
modules=' tcltk'
oldincludedir='/usr/include'
pdfdir='${docdir}'
prefix='/usr/local'
program_transform_name='s,x,x,'
programs=' netgen'
programs=' tcltk'
psdir='${docdir}'
sbindir='${exec_prefix}/sbin'
sharedstatedir='${prefix}/com'
stub_defs=' -DUSE_TCL_STUBS -DUSE_TK_STUBS'
sub_extra_libs=''
sysconfdir='${prefix}/etc'
target='x86_64-unknown-linux-gnu'
@@ -712,7 +722,7 @@ target_cpu='x86_64'
target_os='linux-gnu'
target_vendor='unknown'
top_extra_libs=''
unused=' tcltk'
unused=''
## ----------- ##
## confdefs.h. ##
@@ -726,7 +736,7 @@ unused=' tcltk'
#define PACKAGE_BUGREPORT "[email protected]"
#define PACKAGE_URL ""
#define NETGEN_VERSION "1.5"
#define NETGEN_REVISION "47"
#define NETGEN_REVISION "90"
#define STDC_HEADERS 1
#define HAVE_SYS_TYPES_H 1
#define HAVE_SYS_STAT_H 1
@@ -749,6 +759,7 @@ unused=' tcltk'
#define HAVE_VA_COPY 1
#define HAVE___VA_COPY 1
#define DBUG_OFF 1
#define TCL_NETGEN 1
#define linux 1
#define SYSV 1
#define ISC 1
+25 -23
View File
@@ -417,7 +417,7 @@ $config_files
Report bugs to <[email protected]>."
ac_cs_config="'--without-tcl' 'CFLAGS=-g'"
ac_cs_config="'CFLAGS=-g'"
ac_cs_version="\
netgen config.status 1.3
configured by ./configure, generated by GNU Autoconf 2.69,
@@ -496,7 +496,7 @@ if $ac_cs_silent; then
fi
if $ac_cs_recheck; then
set X /bin/sh './configure' '--without-tcl' 'CFLAGS=-g' $ac_configure_extra_args --no-create --no-recursion
set X /bin/sh './configure' 'CFLAGS=-g' $ac_configure_extra_args --no-create --no-recursion
shift
$as_echo "running CONFIG_SHELL=/bin/sh $*" >&6
CONFIG_SHELL='/bin/sh'
@@ -584,39 +584,41 @@ echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
cat >>"$ac_tmp/subs1.awk" <<\_ACAWK &&
S["LTLIBOBJS"]=""
S["LIBOBJS"]=""
S["INSTALL_TARGET"]="install-netgen"
S["ALL_TARGET"]="standard"
S["INSTALL_TARGET"]="install-tcl"
S["ALL_TARGET"]="tcl"
S["LD_RUN_PATH"]=""
S["SHLIB_CFLAGS"]=""
S["SHLIB_CFLAGS"]="-fPIC"
S["DEPEND_FLAG"]="-MM"
S["gr_srcs"]=""
S["gr_libs"]=""
S["gr_dflags"]=""
S["gr_srcs"]=" ${TK_SRCS}"
S["gr_libs"]=" -lX11"
S["gr_dflags"]=" -DX11 -DXLIB"
S["gr_cflags"]=""
S["cadinstall"]=""
S["programs"]=" netgen"
S["unused"]=" tcltk"
S["modules"]=""
S["cadinstall"]=" tcltk"
S["programs"]=" tcltk"
S["unused"]=""
S["modules"]=" tcltk"
S["sub_extra_libs"]=""
S["top_extra_libs"]=""
S["ld_extra_objs"]=""
S["ld_extra_libs"]=""
S["extra_defs"]=" -DCAD_DIR=\\\"${LIBDIR}\\\""
S["extra_libs"]=""
S["stub_defs"]=" -DUSE_TCL_STUBS -DUSE_TK_STUBS"
S["extra_defs"]=" -DCAD_DIR=\\\"${LIBDIR}\\\" -DTCL_DIR=\\\"${TCLDIR}\\\""
S["extra_libs"]=" ${NETGENDIR}/tcltk/libtcltk.o"
S["SCRIPTS"]=""
S["PACKAGE"]="netgen"
S["VERSION"]=""
S["TCL_LIB_DIR"]=""
S["TCLSH_EXE"]=""
S["WISH_EXE"]=""
S["LIB_SPECS"]=""
S["TCL_LIB_DIR"]="/usr/lib"
S["TCLSH_EXE"]="/usr/bin/tclsh"
S["WISH_EXE"]="/usr/bin/wish"
S["LIB_SPECS_NOSTUB"]=" -L/usr/lib64 -ltk8.6 -L/usr/lib64 -ltcl8.6"
S["LIB_SPECS"]=" -L/usr/lib64 -ltkstub8.6 -L/usr/lib64 -ltclstub8.6"
S["INC_SPECS"]=""
S["EXTRA_LIB_SPECS"]=""
S["EXTRA_LIB_SPECS"]="-ldl"
S["SHLIB_LIB_SPECS"]=""
S["LDDL_FLAGS"]=""
S["LDDL_FLAGS"]=" -shared -Wl,-soname,$@ -Wl,--version-script=${NETGENDIR}/netgen/symbol.map"
S["LD"]="/bin/ld"
S["SHLIB_LD"]=""
S["SHDLIB_EXT"]=""
S["SHDLIB_EXT"]=".so"
S["X_EXTRA_LIBS"]=""
S["X_LIBS"]=""
S["X_PRE_LIBS"]=" -lSM -lICE"
@@ -657,10 +659,10 @@ S["ECHO_T"]=""
S["ECHO_N"]="-n"
S["ECHO_C"]=""
S["DEFS"]="-DPACKAGE_NAME=\\\"netgen\\\" -DPACKAGE_TARNAME=\\\"netgen\\\" -DPACKAGE_VERSION=\\\"1.3\\\" -DPACKAGE_STRING=\\\"netgen\\ 1.3\\\" -DPACKAGE_BUGREPORT=\\\"eda-dev@open"\
"circuitdesign.com\\\" -DPACKAGE_URL=\\\"\\\" -DNETGEN_VERSION=\\\"1.5\\\" -DNETGEN_REVISION=\\\"47\\\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -"\
"circuitdesign.com\\\" -DPACKAGE_URL=\\\"\\\" -DNETGEN_VERSION=\\\"1.5\\\" -DNETGEN_REVISION=\\\"90\\\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -"\
"DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -D"\
"SIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHA"\
"VE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -Dlinux=1 -DSYSV=1 -DISC=1"
"VE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1"
S["mandir"]="${datarootdir}/man"
S["localedir"]="${datarootdir}/locale"
S["libdir"]="${exec_prefix}/lib"
+37 -8
View File
@@ -641,6 +641,7 @@ sub_extra_libs
top_extra_libs
ld_extra_objs
ld_extra_libs
stub_defs
extra_defs
extra_libs
SCRIPTS
@@ -649,6 +650,7 @@ VERSION
TCL_LIB_DIR
TCLSH_EXE
WISH_EXE
LIB_SPECS_NOSTUB
LIB_SPECS
INC_SPECS
EXTRA_LIB_SPECS
@@ -4712,6 +4714,7 @@ fi
$as_echo "#define DBUG_OFF 1" >>confdefs.h
stub_defs=""
extra_defs="$extra_defs -DCAD_DIR=\\\"\${LIBDIR}\\\""
X_LIBS=
X_CFLAGS=
@@ -4861,7 +4864,7 @@ $as_echo_n "checking for tclConfig.sh... " >&6; }
# 1. Search previously named locations.
for dir in \
$prefix \
$ac_default_prefix \
$exec_prefix
do
if test -r "$dir/tclConfig.sh" ; then
@@ -4948,7 +4951,7 @@ $as_echo_n "checking for tkConfig.sh... " >&6; }
# 1. Search previously named locations.
#
for dir in \
$prefix \
$ac_default_prefix \
$exec_prefix
do
if test -r "$dir/tkConfig.sh" ; then
@@ -5007,6 +5010,25 @@ if test $usingTcl ; then
. $tcl_config_sh
. $tk_config_sh
# Should probably trust the config file contents, but this configure
# file checks the Tcl and Tk include and lib directories. Since
# the config file doesn't separate out the libraries from the strings
# passed to the compiler/linker, do it manually here.
#
# Extract TCL_LIB_DIR from TCL_LIB_SPEC
# Extract TK_LIB_DIR from TK_LIB_SPEC
# Extract TCL_INC_DIR from TCL_INCLUDE_SPEC
# Extract TK_INC_DIR from TK_INCLUDE_SPEC
#
# These will be the defaults unless overridden by configure command line
tmpstr=${TCL_LIB_SPEC#*-L}
TCL_LIB_DIR=${tmpstr% -l*}
tmpstr=${TK_LIB_SPEC#*-L}
TK_LIB_DIR=${tmpstr% -l*}
TCL_INC_DIR=${TCL_INCLUDE_SPEC#*-I}
TK_INC_DIR=${TK_INCLUDE_SPEC#*-I}
if test "$TCL_VERSION" = "7.6" -a "$TK_VERSION" = "4.2" ; then
:
elif test "$TCL_VERSION" = "7.5" -a "$TK_VERSION" = "4.1" ; then
@@ -5992,6 +6014,7 @@ if test $usingTcl ; then
extra_libs="$extra_libs \${NETGENDIR}/tcltk/libtcltk.o"
extra_defs="$extra_defs -DTCL_DIR=\\\"\${TCLDIR}\\\""
stub_defs="$stub_defs -DUSE_TCL_STUBS -DUSE_TK_STUBS"
else
programs="$programs netgen"
unused="$unused tcltk"
@@ -6058,8 +6081,7 @@ case $target in
;;
*darwin*)
$as_echo "#define macosx 1" >>confdefs.h
$as_echo "#define macosx macos" >> confdefs.h
if test "$CPP" = "cc -E" ; then
CPPFLAGS="$CPPFLAGS -no-cpp-precomp"
fi
@@ -6070,6 +6092,7 @@ esac
# -----------------------------------------------------------------------
if test $usingTcl ; then
LIB_SPECS_NOSTUB="${LIB_SPECS}"
# -----------------------------------------------------------------------
#
@@ -6081,9 +6104,11 @@ if test $usingTcl ; then
fi
if test "${TK_LIB_DIR}" = "/usr/lib" -o \
"${TK_LIB_DIR}" = "/usr/lib64" ; then
LIB_SPECS="${LIB_SPECS} ${TK_LIB_SPEC}"
LIB_SPECS_NOSTUB="${LIB_SPECS_NOSTUB} ${TK_LIB_SPEC}"
LIB_SPECS="${LIB_SPECS} ${TK_STUB_LIB_SPEC}"
else
LIB_SPECS="${LIB_SPECS} -L${TK_LIB_DIR} ${TK_LIB_SPEC}"
LIB_SPECS_NOSTUB="${LIB_SPECS_NOSTUB} -L${TK_LIB_DIR} ${TK_LIB_SPEC}"
LIB_SPECS="${LIB_SPECS} -L${TK_LIB_DIR} ${TK_STUB_LIB_SPEC}"
if test "x${loader_run_path}" = "x" ; then
loader_run_path="${TK_LIB_DIR}"
else
@@ -6107,9 +6132,11 @@ if test $usingTcl ; then
if test "${TCL_LIB_DIR}" = "/usr/lib" -o \
"${TCL_LIB_DIR}" = "/usr/lib64" -o \
"${TCL_LIB_DIR}" = "${TK_LIB_DIR}" ; then
LIB_SPECS="${LIB_SPECS} ${TCL_LIB_SPEC}"
LIB_SPECS_NOSTUB="${LIB_SPECS_NOSTUB} ${TCL_LIB_SPEC}"
LIB_SPECS="${LIB_SPECS} ${TCL_STUB_LIB_SPEC}"
else
LIB_SPECS="${LIB_SPECS} -L${TCL_LIB_DIR} ${TCL_LIB_SPEC}"
LIB_SPECS_NOSTUB="${LIB_SPECS_NOSTUB} -L${TCL_LIB_DIR} ${TCL_LIB_SPEC}"
LIB_SPECS="${LIB_SPECS} -L${TCL_LIB_DIR} ${TCL_STUB_LIB_SPEC}"
if test "x${loader_run_path}" = "x" ; then
loader_run_path="${TCL_LIB_DIR}"
else
@@ -6482,6 +6509,7 @@ fi
fi
if test "$GCC" = "yes" ; then
@@ -6517,6 +6545,7 @@ fi
ac_config_files="$ac_config_files defs.mak"
+33 -5
View File
@@ -195,6 +195,7 @@ fi
# not ANSI-compliant and won't compile without quite a bit of work.
AC_DEFINE(DBUG_OFF)
stub_defs=""
extra_defs="$extra_defs -DCAD_DIR=\\\"\${LIBDIR}\\\""
X_LIBS=
X_CFLAGS=
@@ -472,6 +473,25 @@ if test $usingTcl ; then
. $tcl_config_sh
. $tk_config_sh
# Should probably trust the config file contents, but this configure
# file checks the Tcl and Tk include and lib directories. Since
# the config file doesn't separate out the libraries from the strings
# passed to the compiler/linker, do it manually here.
#
# Extract TCL_LIB_DIR from TCL_LIB_SPEC
# Extract TK_LIB_DIR from TK_LIB_SPEC
# Extract TCL_INC_DIR from TCL_INCLUDE_SPEC
# Extract TK_INC_DIR from TK_INCLUDE_SPEC
#
# These will be the defaults unless overridden by configure command line
tmpstr=${TCL_LIB_SPEC#*-L}
TCL_LIB_DIR=${tmpstr% -l*}
tmpstr=${TK_LIB_SPEC#*-L}
TK_LIB_DIR=${tmpstr% -l*}
TCL_INC_DIR=${TCL_INCLUDE_SPEC#*-I}
TK_INC_DIR=${TK_INCLUDE_SPEC#*-I}
if test "$TCL_VERSION" = "7.6" -a "$TK_VERSION" = "4.2" ; then
:
elif test "$TCL_VERSION" = "7.5" -a "$TK_VERSION" = "4.1" ; then
@@ -779,6 +799,7 @@ if test $usingTcl ; then
AC_DEFINE(TCL_NETGEN)
extra_libs="$extra_libs \${NETGENDIR}/tcltk/libtcltk.o"
extra_defs="$extra_defs -DTCL_DIR=\\\"\${TCLDIR}\\\""
stub_defs="$stub_defs -DUSE_TCL_STUBS -DUSE_TK_STUBS"
else
programs="$programs netgen"
unused="$unused tcltk"
@@ -847,7 +868,7 @@ case $target in
AC_DEFINE(i386)
;;
*darwin*)
AC_DEFINE(macosx)
$as_echo "#define macosx macos" >> confdefs.h
if test "$CPP" = "cc -E" ; then
CPPFLAGS="$CPPFLAGS -no-cpp-precomp"
fi
@@ -858,6 +879,7 @@ esac
# -----------------------------------------------------------------------
if test $usingTcl ; then
LIB_SPECS_NOSTUB="${LIB_SPECS}"
# -----------------------------------------------------------------------
#
@@ -869,9 +891,11 @@ if test $usingTcl ; then
fi
if test "${TK_LIB_DIR}" = "/usr/lib" -o \
"${TK_LIB_DIR}" = "/usr/lib64" ; then
LIB_SPECS="${LIB_SPECS} ${TK_LIB_SPEC}"
LIB_SPECS_NOSTUB="${LIB_SPECS_NOSTUB} ${TK_LIB_SPEC}"
LIB_SPECS="${LIB_SPECS} ${TK_STUB_LIB_SPEC}"
else
LIB_SPECS="${LIB_SPECS} -L${TK_LIB_DIR} ${TK_LIB_SPEC}"
LIB_SPECS_NOSTUB="${LIB_SPECS_NOSTUB} -L${TK_LIB_DIR} ${TK_LIB_SPEC}"
LIB_SPECS="${LIB_SPECS} -L${TK_LIB_DIR} ${TK_STUB_LIB_SPEC}"
if test "x${loader_run_path}" = "x" ; then
loader_run_path="${TK_LIB_DIR}"
else
@@ -895,9 +919,11 @@ if test $usingTcl ; then
if test "${TCL_LIB_DIR}" = "/usr/lib" -o \
"${TCL_LIB_DIR}" = "/usr/lib64" -o \
"${TCL_LIB_DIR}" = "${TK_LIB_DIR}" ; then
LIB_SPECS="${LIB_SPECS} ${TCL_LIB_SPEC}"
LIB_SPECS_NOSTUB="${LIB_SPECS_NOSTUB} ${TCL_LIB_SPEC}"
LIB_SPECS="${LIB_SPECS} ${TCL_STUB_LIB_SPEC}"
else
LIB_SPECS="${LIB_SPECS} -L${TCL_LIB_DIR} ${TCL_LIB_SPEC}"
LIB_SPECS_NOSTUB="${LIB_SPECS_NOSTUB} -L${TCL_LIB_DIR} ${TCL_LIB_SPEC}"
LIB_SPECS="${LIB_SPECS} -L${TCL_LIB_DIR} ${TCL_STUB_LIB_SPEC}"
if test "x${loader_run_path}" = "x" ; then
loader_run_path="${TCL_LIB_DIR}"
else
@@ -1216,6 +1242,7 @@ if test $usingTcl ; then
AC_SUBST(LDFLAGS)
AC_SUBST(INC_SPECS)
AC_SUBST(LIB_SPECS)
AC_SUBST(LIB_SPECS_NOSTUB)
AC_SUBST(WISH_EXE)
AC_SUBST(TCLSH_EXE)
AC_SUBST(TCL_LIB_DIR)
@@ -1233,6 +1260,7 @@ AC_SUBST(PACKAGE)
AC_SUBST(SCRIPTS)
AC_SUBST(extra_libs)
AC_SUBST(extra_defs)
AC_SUBST(stub_defs)
AC_SUBST(ld_extra_libs)
AC_SUBST(ld_extra_objs)
AC_SUBST(top_extra_libs)
+19 -17
View File
@@ -24,8 +24,8 @@ INSTALL_DATA = ${INSTALL} -m 644
INSTALL_SCRIPT = ${INSTALL}
# Override standard "make" target when compiling under TCL
ALL_TARGET = standard
INSTALL_TARGET = install-netgen
ALL_TARGET = tcl
INSTALL_TARGET = install-tcl
# Change CADDIR to install in a different place
BINDIR = ${bindir}
@@ -34,16 +34,16 @@ LIBDIR = ${libdir}
DOCDIR = ${libdir}/netgen/doc
TCLDIR = ${libdir}/netgen/tcl
MAIN_EXTRA_LIBS =
MAIN_EXTRA_LIBS = ${NETGENDIR}/tcltk/libtcltk.o
LD_EXTRA_LIBS =
LD_SHARED =
TOP_EXTRA_LIBS =
SUB_EXTRA_LIBS =
MODULES +=
UNUSED_MODULES += tcltk
PROGRAMS += netgen
INSTALL_CAD_DIRS +=
MODULES += tcltk
UNUSED_MODULES +=
PROGRAMS += tcltk
INSTALL_CAD_DIRS += tcltk
RM = rm -f
CP = cp
@@ -53,29 +53,31 @@ LINK = /bin/ld -r
LD = /bin/ld
M4 = /bin/m4
RANLIB = ranlib
SHDLIB_EXT =
LDDL_FLAGS =
SHDLIB_EXT = .so
LDDL_FLAGS = -shared -Wl,-soname,$@ -Wl,--version-script=${NETGENDIR}/netgen/symbol.map
LD_RUN_PATH =
LIB_SPECS =
WISH_EXE =
TCL_LIB_DIR =
LIB_SPECS = -L/usr/lib64 -ltkstub8.6 -L/usr/lib64 -ltclstub8.6
LIB_SPECS_NOSTUB = -L/usr/lib64 -ltk8.6 -L/usr/lib64 -ltcl8.6
WISH_EXE = /usr/bin/wish
TCL_LIB_DIR = /usr/lib
CC = gcc
CPP = gcc -E -x c
CXX = @CXX@
CPPFLAGS = -I. -I${NETGENDIR}
DFLAGS = -DCAD_DIR=\"${LIBDIR}\" -DPACKAGE_NAME=\"netgen\" -DPACKAGE_TARNAME=\"netgen\" -DPACKAGE_VERSION=\"1.3\" -DPACKAGE_STRING=\"netgen\ 1.3\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"47\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -Dlinux=1 -DSYSV=1 -DISC=1 -DSHDLIB_EXT=\"\" -DNDEBUG
CFLAGS = -g -m64 -fPIC
DFLAGS = -DCAD_DIR=\"${LIBDIR}\" -DTCL_DIR=\"${TCLDIR}\" -DUSE_TCL_STUBS -DUSE_TK_STUBS -DPACKAGE_NAME=\"netgen\" -DPACKAGE_TARNAME=\"netgen\" -DPACKAGE_VERSION=\"1.3\" -DPACKAGE_STRING=\"netgen\ 1.3\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"90\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1 -DSHDLIB_EXT=\".so\" -DNDEBUG
DFLAGS_NOSTUB = -DCAD_DIR=\"${LIBDIR}\" -DTCL_DIR=\"${TCLDIR}\" -DPACKAGE_NAME=\"netgen\" -DPACKAGE_TARNAME=\"netgen\" -DPACKAGE_VERSION=\"1.3\" -DPACKAGE_STRING=\"netgen\ 1.3\" -DPACKAGE_BUGREPORT=\"[email protected]\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"90\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DSIZEOF_VOID_P=8 -DSIZEOF_UNSIGNED_INT=4 -DSIZEOF_UNSIGNED_LONG=8 -DSIZEOF_UNSIGNED_LONG_LONG=8 -DSTDC_HEADERS=1 -DHAVE_SETENV=1 -DHAVE_PUTENV=1 -DHAVE_DIRENT_H=1 -DHAVE_LIMITS_H=1 -DHAVE_VA_COPY=1 -DHAVE___VA_COPY=1 -DDBUG_OFF=1 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1 -DSHDLIB_EXT=\".so\" -DNDEBUG
CFLAGS = -g -m64 -fPIC -fPIC
DEPEND_FILE = Depend
DEPEND_FLAG = -MM
EXEEXT =
GR_CFLAGS =
GR_DFLAGS = -DNDEBUG
GR_LIBS =
GR_SRCS =
GR_DFLAGS = -DX11 -DXLIB -DNDEBUG
GR_LIBS = -lX11
GR_SRCS = ${TK_SRCS}
OBJS = ${SRCS:.c=.o}
LIB_OBJS = ${LIB_SRCS:.c=.o}
+3 -1
View File
@@ -57,6 +57,7 @@ SHDLIB_EXT = @SHDLIB_EXT@
LDDL_FLAGS = @LDDL_FLAGS@
LD_RUN_PATH = @LD_RUN_PATH@
LIB_SPECS = @LIB_SPECS@
LIB_SPECS_NOSTUB = @LIB_SPECS_NOSTUB@
WISH_EXE = @WISH_EXE@
TCL_LIB_DIR = @TCL_LIB_DIR@
@@ -65,7 +66,8 @@ CPP = @CPP@
CXX = @CXX@
CPPFLAGS = -I. -I${NETGENDIR} @CPPFLAGS@
DFLAGS = @extra_defs@ @DEFS@ -DSHDLIB_EXT=\"@SHDLIB_EXT@\" -DNDEBUG
DFLAGS = @extra_defs@ @stub_defs@ @DEFS@ -DSHDLIB_EXT=\"@SHDLIB_EXT@\" -DNDEBUG
DFLAGS_NOSTUB = @extra_defs@ @DEFS@ -DSHDLIB_EXT=\"@SHDLIB_EXT@\" -DNDEBUG
CFLAGS = @CFLAGS@ @SHLIB_CFLAGS@ @INC_SPECS@
DEPEND_FILE = Depend
+8 -7
View File
@@ -23,18 +23,19 @@ install-tcl: netgenexec${EXEEXT} $(DESTDIR)${BINDIR}/netgen.sh ${TCL_FILES}
${CP} netgenexec${EXEEXT} $(DESTDIR)${TCLDIR}/netgenexec${EXEEXT}
netgenexec${EXEEXT}: netgenexec.c
${CC} ${CFLAGS} ${CPPFLAGS} ${DFLAGS} netgenexec.c -o netgenexec${EXEEXT} \
${LDFLAGS} ${LIBS} ${LIB_SPECS}
${CC} ${CFLAGS} ${CPPFLAGS} ${DFLAGS_NOSTUB} netgenexec.c \
-o netgenexec${EXEEXT} \
${LDFLAGS} ${LIBS} ${LIB_SPECS_NOSTUB}
netgen.tcl: netgen.tcl.in
sed -e /TCL_DIR/s%TCL_DIR%${TCLDIR}%g \
-e /SHDLIB_EXT/s%SHDLIB_EXT%${SHDLIB_EXT}%g \
sed -e 's%TCL_DIR%${TCLDIR}%g' \
-e 's%SHDLIB_EXT%${SHDLIB_EXT}%g' \
netgen.tcl.in > netgen.tcl
netgen.sh: netgen.sh.in
sed -e /TCL_DIR/s%TCL_DIR%${TCLDIR}%g \
-e /TCLLIB_DIR/s%TCLLIB_DIR%${TCL_LIB_DIR}%g \
-e /WISH_EXE/s%WISH_EXE%${WISH_EXE}%g \
sed -e 's%TCL_DIR%${TCLDIR}%g' \
-e 's%TCLLIB_DIR%${TCL_LIB_DIR}%g' \
-e 's%WISH_EXE%${WISH_EXE}%g' \
netgen.sh.in > netgen.sh
$(DESTDIR)${TCLDIR}/%: %
+415 -18
View File
@@ -20,8 +20,338 @@ foreach i $nlist {
}
}
# -lazy option not needed if stubs libraries are handled correctly
# load -lazy TCL_DIR/tclnetgenSHDLIB_EXT
load TCL_DIR/tclnetgenSHDLIB_EXT
#----------------------------------------------------------------
# Convert LVS list result into a JSON file
#----------------------------------------------------------------
proc netgen::convert_to_json {filename lvs_final} {
set pidx [string last . $filename]
set jsonname [string replace $filename $pidx end ".json"]
if {![catch {open $jsonname w} fjson]} {
puts $fjson "\["
# Outer list is of each cell compared
set clen [llength $lvs_final]
set cidx 0
foreach circuit $lvs_final {
incr cidx
puts $fjson " \{"
set nkeys [llength $circuit]
set kidx 0
foreach {key value} $circuit {
incr kidx 2
switch $key {
name {
puts $fjson " \"${key}\": \["
set cktval [lindex $value 0]
puts $fjson " \"${cktval}\","
set cktval [lindex $value 1]
puts $fjson " \"${cktval}\""
if {$kidx == $nkeys} {
puts $fjson " \]"
} else {
puts $fjson " \],"
}
}
pins {
puts $fjson " \"${key}\": \["
puts $fjson " \["
set cktval [lindex $value 0]
foreach pin [lrange $cktval 0 end-1] {
puts $fjson " \"$pin\","
}
set pin [lindex $cktval end]
puts $fjson " \"$pin\""
puts $fjson " \], \["
set cktval [lindex $value 1]
foreach pin [lrange $cktval 0 end-1] {
puts $fjson " \"$pin\","
}
set pin [lindex $cktval end]
puts $fjson " \"$pin\""
puts $fjson " \]"
if {$kidx == $nkeys} {
puts $fjson " \]"
} else {
puts $fjson " \],"
}
}
nets {
puts $fjson " \"${key}\": \["
set cktval [lindex $value 0]
puts $fjson " $cktval,"
set cktval [lindex $value 1]
puts $fjson " $cktval"
if {$kidx == $nkeys} {
puts $fjson " \]"
} else {
puts $fjson " \],"
}
}
devices {
puts $fjson " \"${key}\": \["
puts $fjson " \["
set cktval [lindex $value 0]
foreach dev [lrange $cktval 0 end-1] {
set devname [lindex $dev 0]
set devnum [lindex $dev 1]
puts $fjson " \[\"${devname}\", ${devnum}\],"
}
set dev [lindex $cktval end]
set devname [lindex $dev 0]
set devnum [lindex $dev 1]
puts $fjson " \[\"${devname}\", ${devnum} \]"
puts $fjson " \], \["
set cktval [lindex $value 1]
foreach dev [lrange $cktval 0 end-1] {
set devname [lindex $dev 0]
set devnum [lindex $dev 1]
puts $fjson " \[\"${devname}\", ${devnum} \],"
}
set dev [lindex $cktval end]
set devname [lindex $dev 0]
set devnum [lindex $dev 1]
puts $fjson " \[\"${devname}\", ${devnum} \]"
puts $fjson " \]"
if {$kidx == $nkeys} {
puts $fjson " \]"
} else {
puts $fjson " \],"
}
}
goodnets -
badnets {
puts $fjson " \"${key}\": \["
set glen [llength $value]
set gidx 0
foreach group $value {
incr gidx
puts $fjson " \["
puts $fjson " \["
set cktval [lindex $group 0]
set nlen [llength $cktval]
set nidx 0
foreach net $cktval {
incr nidx
puts $fjson " \["
set netname [lindex $net 0]
puts $fjson " \"$netname\","
puts $fjson " \["
set netconn [lindex $net 1]
foreach fanout [lrange $netconn 0 end-1] {
set devname [lindex $fanout 0]
set pinname [lindex $fanout 1]
set count [lindex $fanout 2]
if {$count == {}} {set count 0}
puts $fjson " \[ \"$devname\", \"$pinname\", $count \],"
}
set fanout [lindex $netconn end]
set devname [lindex $fanout 0]
set pinname [lindex $fanout 1]
set count [lindex $fanout 2]
if {$count == {}} {set count 0}
puts $fjson " \[ \"$devname\", \"$pinname\", $count \]"
puts $fjson " \]"
if {$nidx == $nlen} {
puts $fjson " \]"
} else {
puts $fjson " \],"
}
}
puts $fjson " \], \["
set cktval [lindex $group 1]
set nlen [llength $cktval]
set nidx 0
foreach net $cktval {
incr nidx
puts $fjson " \["
set netname [lindex $net 0]
puts $fjson " \"$netname\","
puts $fjson " \["
set netconn [lindex $net 1]
foreach fanout [lrange $netconn 0 end-1] {
set devname [lindex $fanout 0]
set pinname [lindex $fanout 1]
set count [lindex $fanout 2]
if {$count == {}} {set count 0}
puts $fjson " \[ \"$devname\", \"$pinname\", $count \],"
}
set fanout [lindex $netconn end]
set devname [lindex $fanout 0]
set pinname [lindex $fanout 1]
set count [lindex $fanout 2]
if {$count == {}} {set count 0}
puts $fjson " \[ \"$devname\", \"$pinname\", $count \]"
puts $fjson " \]"
if {$nidx == $nlen} {
puts $fjson " \]"
} else {
puts $fjson " \],"
}
}
puts $fjson " \]"
if {$gidx == $glen} {
puts $fjson " \]"
} else {
puts $fjson " \],"
}
}
if {$kidx == $nkeys} {
puts $fjson " \]"
} else {
puts $fjson " \],"
}
}
goodelements -
badelements {
puts $fjson " \"${key}\": \["
set glen [llength $value]
set gidx 0
foreach group $value {
incr gidx
puts $fjson " \["
puts $fjson " \["
set cktval [lindex $group 0]
set ilen [llength $cktval]
set iidx 0
foreach inst $cktval {
incr iidx
puts $fjson " \["
set instname [lindex $inst 0]
puts $fjson " \"$instname\","
puts $fjson " \["
set instpins [lindex $inst 1]
foreach fanout [lrange $instpins 0 end-1] {
set pinname [lindex $fanout 0]
set count [lindex $fanout 1]
if {$count == {}} {set count 0}
puts $fjson " \[ \"$pinname\", $count \],"
}
set fanout [lindex $instpins end]
set pinname [lindex $fanout 0]
set count [lindex $fanout 1]
if {$count == {}} {set count 0}
puts $fjson " \[ \"$pinname\", $count \]"
puts $fjson " \]"
if {$iidx == $ilen} {
puts $fjson " \]"
} else {
puts $fjson " \],"
}
}
puts $fjson " \], \["
set cktval [lindex $group 1]
set ilen [llength $cktval]
set iidx 0
foreach inst $cktval {
incr iidx
puts $fjson " \["
set instname [lindex $inst 0]
puts $fjson " \"$instname\","
puts $fjson " \["
set instpins [lindex $inst 1]
foreach fanout [lrange $instpins 0 end-1] {
set pinname [lindex $fanout 0]
set count [lindex $fanout 1]
if {$count == {}} {set count 0}
puts $fjson " \[ \"$pinname\", $count \],"
}
set fanout [lindex $instpins end]
set pinname [lindex $fanout 0]
set count [lindex $fanout 1]
if {$count == {}} {set count 0}
puts $fjson " \[ \"$pinname\", $count \]"
puts $fjson " \]"
if {$iidx == $ilen} {
puts $fjson " \]"
} else {
puts $fjson " \],"
}
}
puts $fjson " \]"
if {$gidx == $glen} {
puts $fjson " \]"
} else {
puts $fjson " \],"
}
}
if {$kidx == $nkeys} {
puts $fjson " \]"
} else {
puts $fjson " \],"
}
}
properties {
puts $fjson " \"${key}\": \["
set plen [llength $value]
set pidx 0
foreach instance $value {
incr pidx
puts $fjson " \["
set instnames [lindex $instance 0]
set instname0 [lindex $instnames 0]
puts $fjson " \["
puts $fjson " \"${instname0}\","
puts $fjson " \["
foreach property [lrange $instance 1 end-1] {
set prop0 [lindex $property 0]
set propname [lindex $prop0 0]
set propval [lindex $prop0 1]
puts $fjson " \[\"${propname}\", \"${propval}\"\],"
}
set property [lindex $instance end]
set prop0 [lindex $property 0]
set propname [lindex $prop0 0]
set propval [lindex $prop0 1]
puts $fjson " \[\"${propname}\", \"${propval}\"\]"
puts $fjson " \]"
puts $fjson " \],"
set instname1 [lindex $instnames 1]
puts $fjson " \["
puts $fjson " \"${instname1}\","
puts $fjson " \["
foreach property [lrange $instance 1 end-1] {
set prop1 [lindex $property 1]
set propname [lindex $prop1 0]
set propval [lindex $prop1 1]
puts $fjson " \[\"${propname}\", \"${propval}\"\],"
}
set property [lindex $instance end]
set prop1 [lindex $property 1]
set propname [lindex $prop1 0]
set propval [lindex $prop1 1]
puts $fjson " \[\"${propname}\", \"${propval}\"\]"
puts $fjson " \]"
puts $fjson " \]"
if {$pidx == $plen} {
puts $fjson " \]"
} else {
puts $fjson " \],"
}
}
if {$kidx == $nkeys} {
puts $fjson " \]"
} else {
puts $fjson " \],"
}
}
}
}
if {$cidx == $clen} {
puts $fjson " \}"
} else {
puts $fjson " \},"
}
}
puts $fjson "\]"
}
close $fjson
}
#----------------------------------------------------------------
# Define the "lvs" command as a way of calling the netgen options
# for standard compare, essentially the same as the old "netcomp"
@@ -30,9 +360,30 @@ load TCL_DIR/tclnetgenSHDLIB_EXT
# Use the "canonical" command to parse the file and cell names,
# although if the cells have not been read in yet, then the
# original syntax of filename or {filename cellname} is required.
#
# "args" is passed to verify and may therefore contain only the
# value "-list" or nothing. If "-list", then output is returned
# as a nested list.
#----------------------------------------------------------------
proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out}} {
proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out} args} {
set dolist 0
set dojson 0
foreach arg $args {
if {$arg == "-list"} {
puts stdout "Generating list result"
set dolist 1
set lvs_final {}
} elseif {$arg == "-json"} {
puts stdout "Generating JSON file result"
set dolist 1
set dojson 1
set lvs_final {}
} elseif {$arg == "-blackbox"} {
puts stdout "Treating empty subcircuits as black-box cells"
netgen::model blackbox on
}
}
# Allow name1 or name2 to be a list of {filename cellname},
# A single <filename>, or any valid_cellname form if the
@@ -124,33 +475,56 @@ proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out}} {
if {$perrors > 0} {
puts stdout "Warning: There were errors reading the setup file"
}
} else {
} elseif {[string first nosetup $setupfile] < 0} {
netgen::permute default ;# transistors and resistors
netgen::combine default ;# standard parallel/serial allowances
netgen::property default
}
puts stdout "Comparison output logged to file $logfile"
netgen::log file $logfile
netgen::log start
netgen::log echo off
set endval [netgen::compare hierarchical "$fnum1 $cell1" "$fnum2 $cell2"]
if {[string first nolog $logfile] < 0} {
puts stdout "Comparison output logged to file $logfile"
netgen::log file $logfile
netgen::log start
netgen::log echo off
set dolog true
} else {
set dolog false
}
if {$dolist == 1} {
set endval [netgen::compare -list hierarchical "$fnum1 $cell1" "$fnum2 $cell2"]
} else {
set endval [netgen::compare hierarchical "$fnum1 $cell1" "$fnum2 $cell2"]
}
if {$endval == {}} {
netgen::log put "No cells in queue!\n"
return
}
set properr {}
while {$endval != {}} {
netgen::run converge
if {$dolist == 1} {
netgen::run -list converge
} else {
netgen::run converge
}
netgen::log echo on
if {[verify equivalent]} {
# Resolve automorphisms by pin and property
netgen::run resolve
set result [verify unique]
if {$result == 0} {
if {$dolist == 1} {
netgen::run -list resolve
} else {
netgen::run resolve
}
set uresult [verify unique]
if {$uresult == 0} {
netgen::log put " Networks match locally but not globally.\n"
netgen::log put " Probably connections are swapped.\n"
netgen::log put " Check the end of logfile ${logfile} for implicated nodes.\n"
netgen::verify nodes
if {$dolist == 1} {
verify -list nodes
} else {
verify nodes
}
# Flatten the non-matching subcircuit (but not the top-level cells)
if {[netgen::print queue] != {}} {
@@ -161,10 +535,20 @@ proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out}} {
} else {
# Match pins
netgen::log echo off
equate pins "$fnum1 [lindex $endval 0]" "$fnum2 [lindex $endval 1]"
if {$dolist == 1} {
set result [equate pins "$fnum1 [lindex $endval 0]" \
"$fnum2 [lindex $endval 1]"]
} else {
set result [equate -list pins "$fnum1 [lindex $endval 0]" \
"$fnum2 [lindex $endval 1]"]
}
if {$result != 0} {
equate classes "$fnum1 [lindex $endval 0]" \
"$fnum2 [lindex $endval 1]"
}
netgen::log echo on
}
if {$result == 2} {lappend properr [lindex $endval 0]}
if {$uresult == 2} {lappend properr [lindex $endval 0]}
} else {
# Flatten the non-matching subcircuit (but not the top-level cells)
if {[netgen::print queue] != {}} {
@@ -174,17 +558,30 @@ proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out}} {
}
}
netgen::log echo off
set endval [netgen::compare hierarchical]
if {$dolist == 1} {
catch {lappend lvs_final $lvs_out}
set lvs_out {}
set endval [netgen::compare -list hierarchical]
} else {
set endval [netgen::compare hierarchical]
}
}
netgen::log echo off
puts stdout "Result: " nonewline
netgen::log echo on
netgen::verify only
verify only
if {$properr != {}} {
netgen::log put "The following cells had property errors: $properr\n"
}
netgen::log end
if {$dolog} {
netgen::log end
}
puts stdout "LVS Done."
if {$dojson == 1} {
netgen::convert_to_json $logfile $lvs_final
} elseif {$dolist == 1} {
return $lvs_final
}
}
# It is important to make sure no netgen commands overlap with Tcl built-in
+487 -259
View File
File diff suppressed because it is too large Load Diff