Compare commits
516 Commits
| Author | SHA1 | Date |
|---|---|---|
|
|
e1528a797c | |
|
|
2c94087510 | |
|
|
3eadc8b0dc | |
|
|
9630670071 | |
|
|
f29452e550 | |
|
|
8a2bbe0723 | |
|
|
a0c49a026a | |
|
|
665203bba1 | |
|
|
0192558d4b | |
|
|
21d329b22d | |
|
|
37b1a2a07d | |
|
|
777f7ef095 | |
|
|
9b4185fe62 | |
|
|
ddd95c4fe6 | |
|
|
c0c9993980 | |
|
|
8a20b90074 | |
|
|
3392159243 | |
|
|
24c6eb4cb9 | |
|
|
9048191486 | |
|
|
72d7d55bbe | |
|
|
04163aedcc | |
|
|
f7d35f9cca | |
|
|
601277e539 | |
|
|
73344329f8 | |
|
|
08485d28a7 | |
|
|
2ee286efb4 | |
|
|
dae6919d4f | |
|
|
017bdc6e48 | |
|
|
b371af9235 | |
|
|
b5432d139b | |
|
|
0e958bd45c | |
|
|
b59196fa81 | |
|
|
6e6e9fb73f | |
|
|
e84700a607 | |
|
|
0bee21ccc8 | |
|
|
c269f1de89 | |
|
|
4443826f9e | |
|
|
a60dac6124 | |
|
|
bbe645f0ab | |
|
|
4f315d33d6 | |
|
|
4457248ecd | |
|
|
021dfa6e8a | |
|
|
1d286f9973 | |
|
|
6d2ef396ef | |
|
|
2483b7440f | |
|
|
49c0de0433 | |
|
|
3b9dca0cf2 | |
|
|
7d910b616c | |
|
|
b1032f846b | |
|
|
4c546d1472 | |
|
|
e1aa231db1 | |
|
|
df8fa29b2f | |
|
|
d14bf70f1c | |
|
|
5c21000a8b | |
|
|
05872ca918 | |
|
|
e821381900 | |
|
|
8022e1370f | |
|
|
2b88d79adc | |
|
|
bf4112db07 | |
|
|
fcee934580 | |
|
|
2d427aef3c | |
|
|
fd0c8c87ea | |
|
|
3d180f778d | |
|
|
035fef5c72 | |
|
|
202ea0431f | |
|
|
94754dbc4e | |
|
|
bf67d3c275 | |
|
|
62feed812e | |
|
|
d1c2848e4b | |
|
|
6b0bd4d97b | |
|
|
d69fbc23bb | |
|
|
c7fa0324d9 | |
|
|
eb27a18ae3 | |
|
|
1817f4dd6a | |
|
|
a7e859fcde | |
|
|
6d23844483 | |
|
|
cc84364263 | |
|
|
00b906c109 | |
|
|
25a0e12428 | |
|
|
eabb898578 | |
|
|
ec0e097fcf | |
|
|
f59c9ebcb7 | |
|
|
ce097d5d76 | |
|
|
619409556c | |
|
|
b1374e2bc8 | |
|
|
cff954f36a | |
|
|
c27d933adc | |
|
|
615c55cbe2 | |
|
|
87d8759a69 | |
|
|
1efa054ac1 | |
|
|
609d1de250 | |
|
|
47c3b34612 | |
|
|
66317c9848 | |
|
|
eeb3c0e5c6 | |
|
|
490f9f7dbc | |
|
|
40cf82c2cb | |
|
|
1ac2b592fb | |
|
|
e12883037c | |
|
|
2d63fd63c1 | |
|
|
e557e61a02 | |
|
|
67da250615 | |
|
|
cd013621a7 | |
|
|
45712a04f1 | |
|
|
28a2950439 | |
|
|
013fff9f37 | |
|
|
2292ab813b | |
|
|
7e8508db53 | |
|
|
c9f7b24e0f | |
|
|
95605ebbd4 | |
|
|
98e6a4bd8f | |
|
|
c73d9ec4ff | |
|
|
a5375177c5 | |
|
|
27b095754e | |
|
|
db457c562b | |
|
|
06386bee1b | |
|
|
7cd8d82964 | |
|
|
3aeea9d164 | |
|
|
12e1ff295f | |
|
|
2f9e898ec6 | |
|
|
9663579dd0 | |
|
|
f02e2b1ee0 | |
|
|
cc5f6d929f | |
|
|
4fa4d046c8 | |
|
|
9297090dc1 | |
|
|
79e193e0c9 | |
|
|
2056b37c95 | |
|
|
7550ef9258 | |
|
|
a795981eff | |
|
|
1b6e4e2b36 | |
|
|
edbe5d6e86 | |
|
|
f8ed4e42e2 | |
|
|
89ef83c597 | |
|
|
4e96c84ec6 | |
|
|
592c16706e | |
|
|
bfb01e032f | |
|
|
d0ec17e442 | |
|
|
6195745b45 | |
|
|
68ec2b2a7c | |
|
|
ca49a90ed6 | |
|
|
e07a5b416a | |
|
|
8094740048 | |
|
|
a026d37f11 | |
|
|
ab614b63f7 | |
|
|
83dce151d8 | |
|
|
de18ae85a4 | |
|
|
9908349fdd | |
|
|
964bb0e91a | |
|
|
cfdc60104b | |
|
|
879711def3 | |
|
|
5def9e0ffc | |
|
|
b5c70decbd | |
|
|
20f6d76926 | |
|
|
e4a15f12fb | |
|
|
c6fb204f0c | |
|
|
c7dfff4bb9 | |
|
|
12fa080212 | |
|
|
4c4bad08f2 | |
|
|
23ff2f00a3 | |
|
|
d09f0dd53b | |
|
|
56d4d581e7 | |
|
|
1bb4866226 | |
|
|
625e043eff | |
|
|
6ceeddf096 | |
|
|
42b1acc564 | |
|
|
6d6da9cf5c | |
|
|
bbcc79fc72 | |
|
|
6d5946eaf2 | |
|
|
18dcac73bc | |
|
|
1338e3beb5 | |
|
|
df1c4c5153 | |
|
|
a05ede99db | |
|
|
2d6f1f71b5 | |
|
|
d7355cea95 | |
|
|
32585a572c | |
|
|
e773739e7d | |
|
|
583cc3a151 | |
|
|
bdd7d25943 | |
|
|
903b813821 | |
|
|
1f9d4317e3 | |
|
|
7b8086fc3a | |
|
|
e80f70e67b | |
|
|
6cc898b34b | |
|
|
30bbc28c17 | |
|
|
5ec0db678a | |
|
|
e643563d4e | |
|
|
67f2801aa1 | |
|
|
f76f2e002a | |
|
|
9ec613b0cb | |
|
|
9128eeda60 | |
|
|
aeedf5fae9 | |
|
|
f50dfd9261 | |
|
|
409ce224ad | |
|
|
f50093e6c6 | |
|
|
a27ac8c679 | |
|
|
883755eed3 | |
|
|
484cb26eee | |
|
|
7cc6996017 | |
|
|
7f9acf6a1a | |
|
|
e1a3ae5619 | |
|
|
4e75889605 | |
|
|
e017811239 | |
|
|
4468d36462 | |
|
|
b99fb96259 | |
|
|
ec8299ea14 | |
|
|
376296eda5 | |
|
|
30acb8be63 | |
|
|
7e15a26417 | |
|
|
21750da6c4 | |
|
|
a332c23524 | |
|
|
064195ecc9 | |
|
|
88d53fab15 | |
|
|
c287b6cd28 | |
|
|
0a0a6bcf63 | |
|
|
72ef2f2637 | |
|
|
287f5963d1 | |
|
|
a984ac1a4d | |
|
|
738c1f7b37 | |
|
|
c3cf6c3765 | |
|
|
99dcc20c0a | |
|
|
4bbc496749 | |
|
|
c4f03eabaf | |
|
|
6a555ad6ed | |
|
|
1c5457e180 | |
|
|
7d246c36a6 | |
|
|
92dfa74403 | |
|
|
d53541d1d3 | |
|
|
57b2d21221 | |
|
|
dfabdaa367 | |
|
|
c5c1306f6a | |
|
|
0614461c84 | |
|
|
6e94886b65 | |
|
|
0556abf3c1 | |
|
|
3356dd784e | |
|
|
00949970b4 | |
|
|
c83b6def5b | |
|
|
8fc2c097d2 | |
|
|
2ac2a3b6f8 | |
|
|
759d63cea9 | |
|
|
476da015f0 | |
|
|
4aa8a72769 | |
|
|
47e7367c26 | |
|
|
362fb7120b | |
|
|
92e8fed8be | |
|
|
01b2484be3 | |
|
|
fe47d84ace | |
|
|
0a2adeb593 | |
|
|
330b34139c | |
|
|
62d0352149 | |
|
|
b1b04b8e87 | |
|
|
6b9d92de65 | |
|
|
d763ad0e60 | |
|
|
fd72e24a86 | |
|
|
20077d3d56 | |
|
|
a21ba820e9 | |
|
|
792c5e569a | |
|
|
f92192efd4 | |
|
|
1f50c7ccc5 | |
|
|
8282460774 | |
|
|
ea07642172 | |
|
|
e9da037001 | |
|
|
7ee50a3f8f | |
|
|
c7848c9c02 | |
|
|
402e1f0f25 | |
|
|
19471275df | |
|
|
e75f5661e2 | |
|
|
a034fc16d6 | |
|
|
62fbd422e2 | |
|
|
d0bae6aff4 | |
|
|
8a7bb7f2ca | |
|
|
0df6c83df5 | |
|
|
8996fe03dc | |
|
|
f3cebd9099 | |
|
|
920c6e6928 | |
|
|
69780aa048 | |
|
|
2a0ebfde93 | |
|
|
6e9e6abe98 | |
|
|
b9769b9f55 | |
|
|
7e42483986 | |
|
|
97b0d08e4f | |
|
|
d2c356f9e2 | |
|
|
5e99fd5ef9 | |
|
|
04dd4a64d5 | |
|
|
50b0e9cb65 | |
|
|
82be18ec4b | |
|
|
4ee3a1464b | |
|
|
8e215d3b66 | |
|
|
c45d51e950 | |
|
|
85eb34c01e | |
|
|
8a24c6c3ca | |
|
|
46cdf48bc4 | |
|
|
9d542b92b0 | |
|
|
71ad228d8d | |
|
|
339a0d5d4e | |
|
|
9cebb76787 | |
|
|
251622c8bc | |
|
|
18739235a9 | |
|
|
07c493c796 | |
|
|
cca0e4b3f3 | |
|
|
fb0e1d10b0 | |
|
|
6f81e1d294 | |
|
|
cec6d89474 | |
|
|
9bcca3ac21 | |
|
|
6ae6a246e9 | |
|
|
d985ea340e | |
|
|
5ea7916ff1 | |
|
|
cf9dedb2f7 | |
|
|
da667c3b17 | |
|
|
36aa373fb2 | |
|
|
18f230fc46 | |
|
|
0f5a618353 | |
|
|
983c654086 | |
|
|
515fccc633 | |
|
|
7d94a7d5f6 | |
|
|
39b3bb4d96 | |
|
|
44673a04b6 | |
|
|
a34f08b20a | |
|
|
240a276431 | |
|
|
f7037fc9e6 | |
|
|
23fb9356f4 | |
|
|
027b4ae468 | |
|
|
08a442fda2 | |
|
|
cc0cc512c0 | |
|
|
e9c0596dfe | |
|
|
9a1e295367 | |
|
|
d7272e4ea1 | |
|
|
7f4b5817e2 | |
|
|
b5ab38d5d7 | |
|
|
bf671937b9 | |
|
|
a16086d2e9 | |
|
|
0e03f0bf97 | |
|
|
f12d03fcff | |
|
|
f04c72b984 | |
|
|
d38bd77825 | |
|
|
ea4083893c | |
|
|
3dc70148d1 | |
|
|
a8576d26a9 | |
|
|
a31390f152 | |
|
|
44ec952872 | |
|
|
3892529873 | |
|
|
e3b51c6004 | |
|
|
3200b1bf95 | |
|
|
814652e552 | |
|
|
4d138b64ca | |
|
|
9a2902abbb | |
|
|
840f997133 | |
|
|
cb3cf592e8 | |
|
|
b1d40e6d12 | |
|
|
edbefbd1c4 | |
|
|
527cdb3dab | |
|
|
ee66c00121 | |
|
|
f40a50d3b8 | |
|
|
8e0371e09b | |
|
|
395f857a82 | |
|
|
9e59048731 | |
|
|
7889e2ae73 | |
|
|
8c7d2ae239 | |
|
|
e361640947 | |
|
|
56b4174646 | |
|
|
ccf2dc23c9 | |
|
|
f8ea27d8e8 | |
|
|
ef914e8d46 | |
|
|
f9cc4d3db6 | |
|
|
d8eefdad9a | |
|
|
2cdf3c450f | |
|
|
079e0ab5d3 | |
|
|
f0cf6b52d3 | |
|
|
9432bfc182 | |
|
|
4fb892a64f | |
|
|
faadb78870 | |
|
|
7fc668c2d4 | |
|
|
13c45c6d0c | |
|
|
5efe2151ed | |
|
|
642de57418 | |
|
|
397444acd3 | |
|
|
5e5720e7be | |
|
|
65c0f6b840 | |
|
|
09b2bb3316 | |
|
|
41665036e9 | |
|
|
b4c189a114 | |
|
|
85af816ab8 | |
|
|
4ba5425b6a | |
|
|
83b2084a10 | |
|
|
0de1c232e4 | |
|
|
b8e6f6c030 | |
|
|
a6742bca2e | |
|
|
3a03e769af | |
|
|
445f732f8b | |
|
|
b911aa7b2e | |
|
|
b979d0ad97 | |
|
|
86ab771964 | |
|
|
2d74b3d94b | |
|
|
036e1f0947 | |
|
|
5223011330 | |
|
|
7bde5125fd | |
|
|
dd6145463e | |
|
|
f4ff74783c | |
|
|
f3d850e68e | |
|
|
1c08e5a48d | |
|
|
821145f9c1 | |
|
|
6eb1efd55a | |
|
|
6d569ca396 | |
|
|
7a0bff846f | |
|
|
ced1299351 | |
|
|
f213376bfd | |
|
|
223b197b71 | |
|
|
f0eb14be5e | |
|
|
534ea839c0 | |
|
|
b721cacb40 | |
|
|
84f984e7f0 | |
|
|
25ac57d103 | |
|
|
02a77b61f9 | |
|
|
dfd1e59432 | |
|
|
f14ebf323f | |
|
|
62648c5672 | |
|
|
7d113beada | |
|
|
1fe341833c | |
|
|
aee4b846e2 | |
|
|
004378be11 | |
|
|
dc42e98ab9 | |
|
|
58d7e17231 | |
|
|
de30eeabe8 | |
|
|
feab5023e5 | |
|
|
4d65b0006d | |
|
|
eefdb61e14 | |
|
|
1d1ad3c833 | |
|
|
4166408576 | |
|
|
2b15b731bb | |
|
|
9ad6ad3338 | |
|
|
0fb5efd914 | |
|
|
763117aabe | |
|
|
96a95d337f | |
|
|
393788a039 | |
|
|
c630c2e397 | |
|
|
1e8685128c | |
|
|
440f61d540 | |
|
|
cc532b2cb7 | |
|
|
2a4c7b3cde | |
|
|
87e44b0d8c | |
|
|
e1322dbaf6 | |
|
|
661157e041 | |
|
|
77e5d70626 | |
|
|
4098b7d5fd | |
|
|
f860244700 | |
|
|
66015511cb | |
|
|
b3277ca53e | |
|
|
00c2e74524 | |
|
|
bdb8917327 | |
|
|
95bce5dbd6 | |
|
|
e15620257c | |
|
|
7a947ee9be | |
|
|
b5f188de42 | |
|
|
ccbb286cf3 | |
|
|
4809c02f79 | |
|
|
af3982766e | |
|
|
25c1f13e16 | |
|
|
f0eec657a3 | |
|
|
9d476bc25a | |
|
|
5ed3fcb3f1 | |
|
|
ab9659af17 | |
|
|
41939adb84 | |
|
|
39573981be | |
|
|
b9e26f6fce | |
|
|
78779ce2e9 | |
|
|
70bb33cc62 | |
|
|
fdf2f32654 | |
|
|
05d4225e97 | |
|
|
b6218699a9 | |
|
|
d7927ef547 | |
|
|
af7bc39bbf | |
|
|
5cd68b9ef1 | |
|
|
07788e7501 | |
|
|
24cc7d0c94 | |
|
|
dbcd36d3ec | |
|
|
25c17abb70 | |
|
|
fd019b4afd | |
|
|
cdfd74bac4 | |
|
|
dd9e02c5f3 | |
|
|
26cd16f3ff | |
|
|
ccdd47bc0b | |
|
|
ace1c28507 | |
|
|
5e9635e05f | |
|
|
5c168946e3 | |
|
|
1471f0c09f | |
|
|
73b81fcfe3 | |
|
|
b083a6df7c | |
|
|
2b5a96500c | |
|
|
66f94b47e6 | |
|
|
09532ee628 | |
|
|
2b7d416a41 | |
|
|
090e9e122a | |
|
|
67f1c1a2e9 | |
|
|
a7dcb4ef45 | |
|
|
a0f1b4cc92 | |
|
|
b5d5496e40 | |
|
|
7cac67c81b | |
|
|
ede7406b08 | |
|
|
516d1c33fb | |
|
|
0ad5730701 | |
|
|
24d98ff0d3 | |
|
|
092c99dc1b | |
|
|
4659b0795d | |
|
|
b1924bff65 | |
|
|
bd356553fd | |
|
|
46458f2836 | |
|
|
8deccaad9c | |
|
|
4f24915661 | |
|
|
fdab366627 | |
|
|
310d7512a0 | |
|
|
86f52b164a | |
|
|
4a47c3076d | |
|
|
777498b30e | |
|
|
8300531858 | |
|
|
80378d8816 | |
|
|
80d981a672 | |
|
|
809a3c16e9 | |
|
|
8d976e5686 |
|
|
@ -0,0 +1,40 @@
|
||||||
|
# This is a basic workflow to help you get started with Actions
|
||||||
|
|
||||||
|
name: CI
|
||||||
|
|
||||||
|
# Controls when the workflow will run
|
||||||
|
on:
|
||||||
|
# Triggers the workflow on push or pull request events but only for the master branch
|
||||||
|
push:
|
||||||
|
branches: [ master ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ master ]
|
||||||
|
|
||||||
|
# Allows you to run this workflow manually from the Actions tab
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
||||||
|
jobs:
|
||||||
|
# This workflow contains a single job called "build"
|
||||||
|
build:
|
||||||
|
# The type of runner that the job will run on
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
# Steps represent a sequence of tasks that will be executed as part of the job
|
||||||
|
steps:
|
||||||
|
# Runs a set of commands using the runners shell
|
||||||
|
#- name: Logging into Dockerhub
|
||||||
|
# run: docker login -u ${{ secrets.DOCKERHUB_USERNAME }} -p ${{ secrets.DOCKERHUB_PASSWORD }}
|
||||||
|
|
||||||
|
- name: Pulling the docker image
|
||||||
|
run: docker pull vezzal/vezzal:v1
|
||||||
|
|
||||||
|
- name: Start the container with the docker image
|
||||||
|
run: docker run -id --name test_netgen vezzal/vezzal:v1 bash | exit
|
||||||
|
|
||||||
|
- name: Run the testing on the container and send the mail
|
||||||
|
run: docker exec test_netgen /vezzal/test_netgen.sh "tim@opencircuitdesign.com,lankasaicharan123@gmail.com" ${{ secrets.MAILING_KEY }}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,12 +1,17 @@
|
||||||
*.*%
|
netgen
|
||||||
*.cdslck
|
netgenexec
|
||||||
.inca.db.*
|
defs.mak
|
||||||
inca.*.pak
|
scripts/defs.mak
|
||||||
*.swp
|
config.cache
|
||||||
*.log
|
config.log
|
||||||
|
scripts/config.log
|
||||||
|
config.status
|
||||||
|
scripts/config.status
|
||||||
|
python/lvs_manager.py
|
||||||
|
*.o
|
||||||
*.so
|
*.so
|
||||||
*~
|
*~
|
||||||
*/av_extracted*/
|
*.log
|
||||||
.nfs*
|
UPDATE_ME
|
||||||
*.cd-
|
tcltk/netgen.sh
|
||||||
*/mommdl/
|
tcltk/netgen.tcl
|
||||||
|
|
|
||||||
19
Makefile
19
Makefile
|
|
@ -3,13 +3,13 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
NETGENDIR = .
|
NETGENDIR = .
|
||||||
PROGRAMS = netgen
|
PROGRAMS = netgen python
|
||||||
MODULES = base
|
MODULES = base
|
||||||
|
|
||||||
MAKEFLAGS =
|
MAKEFLAGS =
|
||||||
INSTALL_CAD_DIRS = lib doc
|
INSTALL_CAD_DIRS = lib doc
|
||||||
|
|
||||||
include defs.mak
|
-include defs.mak
|
||||||
|
|
||||||
all: $(ALL_TARGET)
|
all: $(ALL_TARGET)
|
||||||
|
|
||||||
|
|
@ -51,8 +51,8 @@ depend:
|
||||||
install: $(INSTALL_TARGET)
|
install: $(INSTALL_TARGET)
|
||||||
|
|
||||||
install-netgen:
|
install-netgen:
|
||||||
@echo --- installing executable to $(DESTDIR)${BINDIR}
|
@echo --- installing executable to $(DESTDIR)${INSTALL_BINDIR}
|
||||||
@echo --- installing run-time files to $(DESTDIR)${LIBDIR}
|
@echo --- installing run-time files to $(DESTDIR)${INSTALL_LIBDIR}
|
||||||
@${MAKE} install-real >> install.log
|
@${MAKE} install-real >> install.log
|
||||||
|
|
||||||
install-real: install-dirs
|
install-real: install-dirs
|
||||||
|
|
@ -60,15 +60,15 @@ install-real: install-dirs
|
||||||
(cd $$dir && ${MAKE} install); done
|
(cd $$dir && ${MAKE} install); done
|
||||||
|
|
||||||
install-tcl-dirs:
|
install-tcl-dirs:
|
||||||
${NETGENDIR}/scripts/mkdirs $(DESTDIR)${BINDIR} $(DESTDIR)${MANDIR} \
|
${NETGENDIR}/scripts/mkdirs $(DESTDIR)${INSTALL_BINDIR} \
|
||||||
$(DESTDIR)${TCLDIR}
|
$(DESTDIR)${INSTALL_TCLDIR} $(DESTDIR)${INSTALL_PYDIR}
|
||||||
|
|
||||||
install-dirs:
|
install-dirs:
|
||||||
${NETGENDIR}/scripts/mkdirs $(DESTDIR)${BINDIR} $(DESTDIR)${MANDIR}
|
${NETGENDIR}/scripts/mkdirs $(DESTDIR)${INSTALL_BINDIR}
|
||||||
|
|
||||||
install-tcl: install-dirs
|
install-tcl: install-dirs
|
||||||
@echo --- installing executable to $(DESTDIR)${BINDIR}
|
@echo --- installing executable to $(DESTDIR)${INSTALL_BINDIR}
|
||||||
@echo --- installing run-time files to $(DESTDIR)${LIBDIR}
|
@echo --- installing run-time files to $(DESTDIR)${INSTALL_LIBDIR}
|
||||||
@${MAKE} install-tcl-real 2>&1 >> install.log
|
@${MAKE} install-tcl-real 2>&1 >> install.log
|
||||||
|
|
||||||
install-tcl-real: install-tcl-dirs
|
install-tcl-real: install-tcl-dirs
|
||||||
|
|
@ -78,6 +78,7 @@ install-tcl-real: install-tcl-dirs
|
||||||
clean:
|
clean:
|
||||||
for dir in ${MODULES} ${PROGRAMS} ${UNUSED_MODULES}; do \
|
for dir in ${MODULES} ${PROGRAMS} ${UNUSED_MODULES}; do \
|
||||||
(cd $$dir && ${MAKE} clean); done
|
(cd $$dir && ${MAKE} clean); done
|
||||||
|
${RM} *.tmp */*.tmp *.sav */*.sav *.log TAGS tags
|
||||||
|
|
||||||
distclean:
|
distclean:
|
||||||
touch defs.mak
|
touch defs.mak
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,8 @@
|
||||||
NETGEN: VERSION 1.5
|

|
||||||
|
|
||||||
|
# NETGEN
|
||||||
|
|
||||||
|
### VERSION 1.5
|
||||||
|
|
||||||
NETGEN is a general-purpose netlist management system. It can read
|
NETGEN is a general-purpose netlist management system. It can read
|
||||||
and write several netlist formats, including NTK (Caltech, CMU),
|
and write several netlist formats, including NTK (Caltech, CMU),
|
||||||
|
|
@ -78,13 +82,58 @@ of CVS check-in notes on http://opencircuitdesign.com/netgen/.
|
||||||
|
|
||||||
BUILDING NETGEN:
|
BUILDING NETGEN:
|
||||||
----------------
|
----------------
|
||||||
NETGEN version 1.4 uses the same "make" procedure as Magic version 7.5
|
NETGEN version 1.5 uses the same "make" procedure as Magic version 8.1
|
||||||
and IRSIM version 9.7:
|
and IRSIM version 9.7:
|
||||||
|
|
||||||
./configure
|
./configure
|
||||||
make
|
make
|
||||||
make install
|
make install
|
||||||
|
|
||||||
|
Note: For FreeBSD, use 'gmake' instead.
|
||||||
|
|
||||||
|
Note: On MacOS (Big Sur) follow the following procedure. If you have installed `xschem` and `magic` already on MacOS then steps (1) and (2) can likely be skipped.
|
||||||
|
|
||||||
|
**1) Build Tcl for X11**
|
||||||
|
|
||||||
|
We are following the instructions from `xschem` (https://github.com/StefanSchippers/xschem/blob/master/README_MacOS.md).
|
||||||
|
|
||||||
|
* Download `Tcl` from https://prdownloads.sourceforge.net/tcl/tcl8.6.10-src.tar.gz
|
||||||
|
|
||||||
|
We are using not `opt` but `opt2` so that this `Tcl` does not interfere with `tcl-tk` from HomeBrew.
|
||||||
|
|
||||||
|
```
|
||||||
|
./configure --prefix=/usr/local/opt2/tcl-tk
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
```
|
||||||
|
|
||||||
|
**2) Build Tk for X11**
|
||||||
|
|
||||||
|
* Download `Tk` from https://prdownloads.sourceforge.net/tcl/tk8.6.10-src.tar.gz
|
||||||
|
|
||||||
|
```
|
||||||
|
./configure --prefix=/usr/local/opt2/tcl-tk \
|
||||||
|
--with-tcl=/usr/local/opt2/tcl-tk/lib --with-x \
|
||||||
|
--x-includes=/opt/X11/include --x-libraries=/opt/X11/lib
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
```
|
||||||
|
|
||||||
|
**3) Build netgen**
|
||||||
|
|
||||||
|
We need to provide this custom-built `tcl-tk` and suppress compilation errors.
|
||||||
|
|
||||||
|
```
|
||||||
|
./configure --with-tcl=/usr/local/opt2/tcl-tk/lib \
|
||||||
|
--with-tk=/usr/local/opt2/tcl-tk/lib \
|
||||||
|
--x-includes=/opt/X11/include \
|
||||||
|
--x-libraries=/opt/X11/lib \
|
||||||
|
CFLAGS=-Wno-error=implicit-function-declaration
|
||||||
|
make
|
||||||
|
make install
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
IN CASE OF FAILURE
|
IN CASE OF FAILURE
|
||||||
-------------------
|
-------------------
|
||||||
Please contact me (tim@opencircuitdesign.com) to report compile-time and
|
Please contact me (tim@opencircuitdesign.com) to report compile-time and
|
||||||
30
TO_DO
30
TO_DO
|
|
@ -1,37 +1,29 @@
|
||||||
TO_DO list for version 1.5
|
TO_DO list for version 1.5
|
||||||
------------------------------
|
------------------------------
|
||||||
|
|
||||||
1) Parallel (transistors and capacitors) and serial (resistors)
|
As of version 1.5.70, the major to-do item list is complete.
|
||||||
device merging, plus methods for describing how any device
|
|
||||||
class may be merged.
|
|
||||||
|
|
||||||
Possible useful additions (not critical)
|
Possible useful additions (not critical)
|
||||||
----------------------
|
----------------------
|
||||||
|
|
||||||
1) Add new output style allowing netlists to be described by Tcl scripts
|
1) Add automatic file format guessing from file extension for "write" command
|
||||||
(similar to the C-Code format, but does not require compiling).
|
2) Incorporate into Tcl-based xcircuit
|
||||||
2) Add automatic file format guessing from file extension for "write" command
|
3) Extend 2-terminal device handling (namely R and C) to more formats
|
||||||
3) Add Tk GUI to match (and improve upon!) the original X11 GUI.
|
|
||||||
4) Incorporate into Tcl-based xcircuit
|
|
||||||
5) Extend 2-terminal device handling (namely R and C) to more formats
|
|
||||||
(where appropriate).
|
(where appropriate).
|
||||||
6) Generate feedback in the form of a .mag file to facilitate interactive
|
4) Generate feedback in the form of a .mag file to facilitate interactive
|
||||||
netlist comparison in conjunction with magic. This may be an error
|
netlist comparison in conjunction with magic. This may be an error
|
||||||
file, but it may also make use of magic 7.2's "element" command to
|
file, but it may also make use of magic 7.2's "element" command to
|
||||||
build rat's nests or outline areas of interest or anything else that
|
build rat's nests or outline areas of interest or anything else that
|
||||||
might be helpful to interactive comparison.
|
might be helpful to interactive comparison.
|
||||||
7) Improve upon the readability of the netlist comparator output.
|
5) Handle the hierarchy of ".ext" files automatically.
|
||||||
In particular, pinpoint situations in which an error does not show
|
6) Retain position information from ".ext" files for the purpose of writing
|
||||||
up in an obvious way in either the element or node lists.
|
|
||||||
8) Handle the hierarchy of ".ext" files automatically.
|
|
||||||
9) Retain position information from ".ext" files for the purpose of writing
|
|
||||||
feedback information into magic and for matching devices in the element
|
feedback information into magic and for matching devices in the element
|
||||||
list to their counterparts in the original layout [note---done for .sim
|
list to their counterparts in the original layout [note---done for .sim
|
||||||
format, which contains position information. Usefulness of improving
|
format, which contains position information. Usefulness of improving
|
||||||
the .ext parsing is questionable. Ditto for item 8].
|
the .ext parsing is questionable. Ditto for item 8].
|
||||||
10) Expand upon the details of format-to-format translation, (especially
|
7) Expand upon the details of format-to-format translation, (especially
|
||||||
ntk and ext formats, SPICE format writing, and sim format reading).
|
ntk and ext formats, SPICE format writing, and sim format reading).
|
||||||
11) Add a "property" command to add/remove properties to check, and change
|
8) Add a "subcircuit" command to mimic a SPICE ".SUBCKT ... .ENDS" card
|
||||||
the slop values (done).
|
(i.e., the ability to add subcircuit "stub" definitions from the
|
||||||
12) Add a "subcircuit" command to mimic a SPICE ".SUBCKT ... .ENDS" card.
|
command line or from a setup file).
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ NETGENDIR = ..
|
||||||
SRCS = actel.c ccode.c greedy.c ntk.c print.c actellib.c embed.c \
|
SRCS = actel.c ccode.c greedy.c ntk.c print.c actellib.c embed.c \
|
||||||
hash.c netfile.c objlist.c query.c anneal.c ext.c netcmp.c netgen.c \
|
hash.c netfile.c objlist.c query.c anneal.c ext.c netcmp.c netgen.c \
|
||||||
pdutils.c random.c timing.c bottomup.c flatten.c place.c spice.c \
|
pdutils.c random.c timing.c bottomup.c flatten.c place.c spice.c \
|
||||||
wombat.c xilinx.c xillib.c
|
verilog.c wombat.c xilinx.c xillib.c
|
||||||
X11_SRCS = xnetgen.c
|
X11_SRCS = xnetgen.c
|
||||||
|
|
||||||
include ${NETGENDIR}/defs.mak
|
include ${NETGENDIR}/defs.mak
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,7 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
#include <strings.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#ifdef IBMPC
|
#ifdef IBMPC
|
||||||
#include <stdlib.h> /* for strtol on PC */
|
#include <stdlib.h> /* for strtol on PC */
|
||||||
|
|
@ -90,7 +91,7 @@ char *ActelName(char *Name)
|
||||||
/* strip physical-pin information, if it exists */
|
/* strip physical-pin information, if it exists */
|
||||||
if ((nm = strrchr(name,PHYSICALPIN[0])) != NULL) *nm = '\0';
|
if ((nm = strrchr(name,PHYSICALPIN[0])) != NULL) *nm = '\0';
|
||||||
if (strlen(name) > 13) {
|
if (strlen(name) > 13) {
|
||||||
ActelIndex = (++ActelIndex) % ACTELNAMESIZE;
|
ActelIndex = (ActelIndex + 1) % ACTELNAMESIZE;
|
||||||
/* format the value of the hashed value of the string */
|
/* format the value of the hashed value of the string */
|
||||||
sprintf(ActelNames[ActelIndex], "$%lX", ActelNameHash(name));
|
sprintf(ActelNames[ActelIndex], "$%lX", ActelNameHash(name));
|
||||||
if (Debug)
|
if (Debug)
|
||||||
|
|
@ -101,7 +102,7 @@ Printf("ActelNameHash returns %s on name %s\n",ActelNames[ActelIndex], name);
|
||||||
NeedsQuoting = 0;
|
NeedsQuoting = 0;
|
||||||
if (NULL != strpbrk(name, ".,:; \t\"'\n\r")) NeedsQuoting = 1;
|
if (NULL != strpbrk(name, ".,:; \t\"'\n\r")) NeedsQuoting = 1;
|
||||||
|
|
||||||
ActelIndex = (++ActelIndex) % ACTELNAMESIZE;
|
ActelIndex = (ActelIndex + 1) % ACTELNAMESIZE;
|
||||||
if (!NeedsQuoting) {
|
if (!NeedsQuoting) {
|
||||||
strcpy(ActelNames[ActelIndex], name);
|
strcpy(ActelNames[ActelIndex], name);
|
||||||
return(ActelNames[ActelIndex]);
|
return(ActelNames[ActelIndex]);
|
||||||
|
|
@ -131,7 +132,7 @@ if format = 1, use the actel .pin file format
|
||||||
struct nlist *tp;
|
struct nlist *tp;
|
||||||
struct objlist *ob, *ob2;
|
struct objlist *ob, *ob2;
|
||||||
char *ptr;
|
char *ptr;
|
||||||
char physicalpin[200];
|
char physicalpin[MAX_STR_LEN];
|
||||||
|
|
||||||
tp = LookupCell(name);
|
tp = LookupCell(name);
|
||||||
if (tp == NULL) return;
|
if (tp == NULL) return;
|
||||||
|
|
|
||||||
|
|
@ -176,4 +176,6 @@ extern int open(char *path, int oflag, ...); /* HPUX has it in <sys/fcntl.h> */
|
||||||
#define FALSE 0
|
#define FALSE 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define MAX_STR_LEN 256
|
||||||
|
|
||||||
#endif /* _CONFIG_H */
|
#endif /* _CONFIG_H */
|
||||||
|
|
|
||||||
10
base/embed.c
10
base/embed.c
|
|
@ -31,6 +31,10 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef TCL_NETGEN
|
||||||
|
#include <tcl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "netgen.h"
|
#include "netgen.h"
|
||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
#include "objlist.h"
|
#include "objlist.h"
|
||||||
|
|
@ -625,7 +629,7 @@ struct embed *FlattenEmbeddingTree(struct embed *E)
|
||||||
int LenEmbed(char *prefix, struct nlist *np, struct embed *E, int flatten)
|
int LenEmbed(char *prefix, struct nlist *np, struct embed *E, int flatten)
|
||||||
/* return the number of characters required to print element E */
|
/* return the number of characters required to print element E */
|
||||||
{
|
{
|
||||||
char longstr[200];
|
char longstr[MAX_STR_LEN];
|
||||||
|
|
||||||
if (E == NULL) return(0);
|
if (E == NULL) return(0);
|
||||||
if (E->left == NULL && E->right == NULL) {
|
if (E->left == NULL && E->right == NULL) {
|
||||||
|
|
@ -664,7 +668,7 @@ void PrintEmb(FILE *outfile, char *prefix, struct nlist *np,
|
||||||
struct objlist *ob;
|
struct objlist *ob;
|
||||||
char *instancename;
|
char *instancename;
|
||||||
struct nlist *np2;
|
struct nlist *np2;
|
||||||
char name[200];
|
char name[MAX_STR_LEN];
|
||||||
|
|
||||||
ob = InstanceNumber(np,E->instancenumber);
|
ob = InstanceNumber(np,E->instancenumber);
|
||||||
instancename = ob->instance.name;
|
instancename = ob->instance.name;
|
||||||
|
|
@ -702,7 +706,7 @@ void PrintEmbed(FILE *outfile, char *prefix, struct nlist *np,
|
||||||
struct objlist *ob;
|
struct objlist *ob;
|
||||||
char *instancename;
|
char *instancename;
|
||||||
struct nlist *np2;
|
struct nlist *np2;
|
||||||
char name[200];
|
char name[MAX_STR_LEN];
|
||||||
|
|
||||||
ob = InstanceNumber(np,E->instancenumber);
|
ob = InstanceNumber(np,E->instancenumber);
|
||||||
instancename = ob->instance.name;
|
instancename = ob->instance.name;
|
||||||
|
|
|
||||||
628
base/ext.c
628
base/ext.c
File diff suppressed because it is too large
Load Diff
998
base/flatten.c
998
base/flatten.c
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,8 @@
|
||||||
|
#ifndef _FLATTEN_H
|
||||||
|
#define _FLATTEN_H
|
||||||
|
|
||||||
|
extern int UniquePins(char *name, int filenum);
|
||||||
|
extern void flattenCell(char *name, int file);
|
||||||
|
extern int HasContents(struct nlist *);
|
||||||
|
|
||||||
|
#endif /* _FLATTEN_H */
|
||||||
43
base/hash.c
43
base/hash.c
|
|
@ -25,9 +25,13 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
#include <alloc.h>
|
#include <alloc.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef TCL_NETGEN
|
||||||
|
#include <tcl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "netgen.h"
|
#include "netgen.h"
|
||||||
#include "hash.h"
|
|
||||||
#include "objlist.h"
|
#include "objlist.h"
|
||||||
|
#include "hash.h"
|
||||||
|
|
||||||
unsigned long (*hashfunc)(char *, int) = NULL;
|
unsigned long (*hashfunc)(char *, int) = NULL;
|
||||||
int (*matchfunc)(char *, char *) = NULL;
|
int (*matchfunc)(char *, char *) = NULL;
|
||||||
|
|
@ -133,32 +137,39 @@ static unsigned char uppercase[] = {
|
||||||
// horrible things can happen, as, for example, names AOI12 and OAI12
|
// horrible things can happen, as, for example, names AOI12 and OAI12
|
||||||
// have exactly the same hash result. Lousy for binning and even
|
// have exactly the same hash result. Lousy for binning and even
|
||||||
// lousier for generating class magic numbers.
|
// lousier for generating class magic numbers.
|
||||||
|
//
|
||||||
|
// Updated again 4/2/2026 to the FNV-1a hash, which is better than
|
||||||
|
// SDBM for this application, according to ChatGPT.
|
||||||
|
|
||||||
unsigned long hashnocase(char *s, int hashsize)
|
unsigned long hashnocase(char *s, int hashsize)
|
||||||
{
|
{
|
||||||
unsigned long hashval;
|
unsigned long hashval = 2166136261ul;
|
||||||
|
for (; *s != '\0'; s++) {
|
||||||
for (hashval = 0; *s != '\0'; )
|
hashval ^= uppercase[*s];
|
||||||
hashval = uppercase[*s++]
|
hashval *= 16777619ul;
|
||||||
+ (hashval << 6) + (hashval << 16) - hashval;
|
}
|
||||||
return (hashsize == 0) ? hashval : (hashval % hashsize);
|
return (hashsize == 0) ? hashval : (hashval % hashsize);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long hash(char *s, int hashsize)
|
unsigned long hashcase(char *s, int hashsize)
|
||||||
{
|
{
|
||||||
unsigned long hashval;
|
unsigned long hashval = 2166136261ul;
|
||||||
|
for (; *s != '\0'; s++) {
|
||||||
for (hashval = 0; *s != '\0'; )
|
hashval ^= (unsigned char)(*s);
|
||||||
hashval = (*s++) + (hashval << 6) + (hashval << 16) - hashval;
|
hashval *= 16777619ul;
|
||||||
|
}
|
||||||
return (hashsize == 0) ? hashval : (hashval % hashsize);
|
return (hashsize == 0) ? hashval : (hashval % hashsize);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long genhash(char *s, int c, int hashsize)
|
unsigned long genhash(char *s, int c, int hashsize)
|
||||||
{
|
{
|
||||||
unsigned long hashval;
|
unsigned long hashval = 2166136261ul;
|
||||||
|
hashval ^= (unsigned long)c;
|
||||||
for (hashval = (unsigned long)c; *s != '\0'; )
|
hashval *= 16777619ul;
|
||||||
hashval = (*s++) + (hashval << 6) + (hashval << 16) - hashval;
|
for (; *s != '\0'; s++) {
|
||||||
|
hashval ^= (unsigned char)(*s);
|
||||||
|
hashval *= 16777619ul;
|
||||||
|
}
|
||||||
return (hashsize == 0) ? hashval : (hashval % hashsize);
|
return (hashsize == 0) ? hashval : (hashval % hashsize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -309,7 +320,7 @@ struct hashlist *HashInt2PtrInstall(char *name, int c, void *ptr,
|
||||||
/* destroy a hash table, freeing associated memory */
|
/* destroy a hash table, freeing associated memory */
|
||||||
/*----------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------*/
|
||||||
|
|
||||||
void *HashKill(struct hashdict *dict)
|
void HashKill(struct hashdict *dict)
|
||||||
{
|
{
|
||||||
struct hashlist *np, *p;
|
struct hashlist *np, *p;
|
||||||
int i;
|
int i;
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ extern struct nlist *RecurseHashTablePointer(struct hashdict *dict,
|
||||||
void *pointer);
|
void *pointer);
|
||||||
extern void HashDelete(char *name, struct hashdict *dict);
|
extern void HashDelete(char *name, struct hashdict *dict);
|
||||||
extern void HashIntDelete(char *name, int value, 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 CountHashTableEntries(struct hashlist *p);
|
||||||
|
|
@ -47,7 +48,7 @@ extern void *HashFirst(struct hashdict *dict);
|
||||||
extern void *HashNext(struct hashdict *dict);
|
extern void *HashNext(struct hashdict *dict);
|
||||||
|
|
||||||
extern unsigned long hashnocase(char *s, int hashsize);
|
extern unsigned long hashnocase(char *s, int hashsize);
|
||||||
extern unsigned long hash(char *s, int hashsize);
|
extern unsigned long hashcase(char *s, int hashsize);
|
||||||
|
|
||||||
extern int (*matchfunc)(char *, char *);
|
extern int (*matchfunc)(char *, char *);
|
||||||
/* matchintfunc() compares based on the name and the first */
|
/* matchintfunc() compares based on the name and the first */
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@ along with this program; see the file copying. If not, write to
|
||||||
the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
/* inetcomp.c -- a simple wrapper to the NETCOMP() function */
|
/* inetcomp.c -- a simple wrapper to the NETCOMP() function */
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "netgen.h"
|
#include "netgen.h"
|
||||||
|
|
@ -33,7 +34,7 @@ void STRCPY(char *dest, char *source)
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
char cell1[200], cell2[200];
|
char cell1[MAX_STR_LEN], cell2[MAX_STR_LEN];
|
||||||
|
|
||||||
Debug = 0;
|
Debug = 0;
|
||||||
if (argc != 1) {
|
if (argc != 1) {
|
||||||
|
|
|
||||||
5008
base/netcmp.c
5008
base/netcmp.c
File diff suppressed because it is too large
Load Diff
|
|
@ -7,8 +7,13 @@ extern struct nlist *Circuit1;
|
||||||
extern struct nlist *Circuit2;
|
extern struct nlist *Circuit2;
|
||||||
|
|
||||||
extern int ExhaustiveSubdivision;
|
extern int ExhaustiveSubdivision;
|
||||||
|
extern int ExactTopology;
|
||||||
|
|
||||||
|
extern int left_col_end;
|
||||||
|
extern int right_col_end;
|
||||||
|
|
||||||
#ifdef TCL_NETGEN
|
#ifdef TCL_NETGEN
|
||||||
|
#include <tcl.h>
|
||||||
extern int InterruptPending;
|
extern int InterruptPending;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
@ -17,10 +22,12 @@ extern int InterruptPending;
|
||||||
extern void PrintElementClasses(struct ElementClass *EC, int type, int dolist);
|
extern void PrintElementClasses(struct ElementClass *EC, int type, int dolist);
|
||||||
extern void PrintNodeClasses(struct NodeClass *NC, int type, int dolist);
|
extern void PrintNodeClasses(struct NodeClass *NC, int type, int dolist);
|
||||||
extern void SummarizeNodeClasses(struct NodeClass *NC);
|
extern void SummarizeNodeClasses(struct NodeClass *NC);
|
||||||
extern void PrintPropertyResults(void);
|
extern void PrintPropertyResults(int do_list);
|
||||||
extern void PrintCoreStats(void);
|
extern void PrintCoreStats(void);
|
||||||
extern void ResetState(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 void DescribeContents(char *name1, int file1, char *name2, int file2);
|
||||||
extern int Iterate(void);
|
extern int Iterate(void);
|
||||||
extern int VerifyMatching(void);
|
extern int VerifyMatching(void);
|
||||||
extern void PrintAutomorphisms(void);
|
extern void PrintAutomorphisms(void);
|
||||||
|
|
@ -31,24 +38,45 @@ extern int PermuteSetup(char *model, int filenum, char *pin1, char *pin2);
|
||||||
extern int PermuteForget(char *model, int filenum, char *pin1, char *pin2);
|
extern int PermuteForget(char *model, int filenum, char *pin1, char *pin2);
|
||||||
extern int EquivalenceElements(char *name1, int file1, char *name2, int file2);
|
extern int EquivalenceElements(char *name1, int file1, char *name2, int file2);
|
||||||
extern int EquivalenceNodes(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 EquivalenceClasses(char *name1, int file1, char *name2, int file2,
|
||||||
|
int dounique);
|
||||||
extern int IgnoreClass(char *name, int file, unsigned char type);
|
extern int IgnoreClass(char *name, int file, unsigned char type);
|
||||||
extern int MatchPins(struct nlist *tp1, struct nlist *tp2);
|
extern int MatchPins(struct nlist *tp1, struct nlist *tp2, int dolist);
|
||||||
|
extern int PropertyOptimize(struct objlist *ob, struct nlist *tp, int run,
|
||||||
|
int series, int comb);
|
||||||
|
|
||||||
extern int CreateCompareQueue(char *, int, char *, int);
|
extern int CreateCompareQueue(char *, int, char *, int);
|
||||||
extern int GetCompareQueueTop(char **, int *, char **, int *);
|
extern int GetCompareQueueTop(char **, int *, char **, int *);
|
||||||
extern int PeekCompareQueueTop(char **, int *, char **, int *);
|
extern int PeekCompareQueueTop(char **, int *, char **, int *);
|
||||||
extern void RemoveCompareQueue();
|
extern void RemoveCompareQueue();
|
||||||
|
extern int FlattenUnmatched(struct nlist *, char *, int, int);
|
||||||
|
|
||||||
extern void PrintIllegalClasses();
|
extern void PrintIllegalClasses();
|
||||||
extern void PrintIllegalNodeClasses();
|
extern void PrintIllegalNodeClasses();
|
||||||
extern void PrintIllegalElementClasses();
|
extern void PrintIllegalElementClasses();
|
||||||
|
|
||||||
|
extern void DumpNetwork(struct objlist *ob, int cidx);
|
||||||
|
extern void DumpNetworkAll(char *name, int file);
|
||||||
|
|
||||||
|
extern void RegroupDataStructures();
|
||||||
|
extern void FormatIllegalElementClasses();
|
||||||
|
extern void FormatIllegalNodeClasses();
|
||||||
|
extern int ResolveAutomorphsByProperty();
|
||||||
|
extern int ResolveAutomorphsByPin(int match_nets);
|
||||||
|
extern void SummarizeElementClasses(struct ElementClass *EC);
|
||||||
|
extern int remove_group_tags(struct objlist *ob);
|
||||||
|
|
||||||
|
|
||||||
#ifdef TCL_NETGEN
|
#ifdef TCL_NETGEN
|
||||||
extern int EquivalentNode();
|
extern int EquivalentNode();
|
||||||
extern int EquivalentElement();
|
extern int EquivalentElement();
|
||||||
|
extern void DeriveAreaProperty();
|
||||||
|
extern void DerivePerimeterProperty();
|
||||||
|
|
||||||
extern void enable_interrupt();
|
extern void enable_interrupt();
|
||||||
extern void disable_interrupt();
|
extern void disable_interrupt();
|
||||||
|
|
||||||
|
extern Tcl_Obj *ListNodeClasses(int legal);
|
||||||
|
extern Tcl_Obj *ListElementClasses(int legal);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
||||||
642
base/netfile.c
642
base/netfile.c
|
|
@ -47,6 +47,18 @@ static FILE *outfile;
|
||||||
static int Graph = 0;
|
static int Graph = 0;
|
||||||
int File;
|
int File;
|
||||||
|
|
||||||
|
/*------------------------------------------------------*/
|
||||||
|
/* Structure for stacking nested `if[n]def in verilog */
|
||||||
|
/*------------------------------------------------------*/
|
||||||
|
|
||||||
|
struct ifstack {
|
||||||
|
int invert;
|
||||||
|
struct property *kl;
|
||||||
|
struct ifstack *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ifstack *condstack = NULL;
|
||||||
|
|
||||||
extern char *SetExtension(char *buffer, char *path, char *extension)
|
extern char *SetExtension(char *buffer, char *path, char *extension)
|
||||||
/* add 'extension' to 'path' (overwriting previous extension, if any),
|
/* add 'extension' to 'path' (overwriting previous extension, if any),
|
||||||
write it into buffer (if buffer is null, malloc a buffer).
|
write it into buffer (if buffer is null, malloc a buffer).
|
||||||
|
|
@ -77,8 +89,9 @@ extern char *SetExtension(char *buffer, char *path, char *extension)
|
||||||
strcat(tmpbuf, extension);
|
strcat(tmpbuf, extension);
|
||||||
|
|
||||||
/* step 4: lower-case the entire name */
|
/* step 4: lower-case the entire name */
|
||||||
for (pt = tmpbuf; *pt != '\0'; pt++)
|
/* (Commented out because this is really stupid.) */
|
||||||
if (isupper(*pt)) *pt = tolower(*pt);
|
// for (pt = tmpbuf; *pt != '\0'; pt++)
|
||||||
|
// if (isupper(*pt)) *pt = tolower(*pt);
|
||||||
|
|
||||||
if (buffer != NULL) {
|
if (buffer != NULL) {
|
||||||
strcpy(buffer, tmpbuf);
|
strcpy(buffer, tmpbuf);
|
||||||
|
|
@ -170,11 +183,10 @@ void CloseFile(char *filename)
|
||||||
fclose(outfile);
|
fclose(outfile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* STUFF TO READ INPUT FILES */
|
/* STUFF TO READ INPUT FILES */
|
||||||
|
|
||||||
static char *line = NULL; /* actual line read in */
|
static char *line = NULL; /* actual line read in */
|
||||||
static char *linetok; /* line copied to this, then munged by strtok */
|
static char *linetok; /* line copied to this, then munged by strdtok */
|
||||||
static int linesize = 0; /* amount of memory allocated for line */
|
static int linesize = 0; /* amount of memory allocated for line */
|
||||||
static int linenum;
|
static int linenum;
|
||||||
char *nexttok;
|
char *nexttok;
|
||||||
|
|
@ -190,7 +202,92 @@ struct filestack {
|
||||||
|
|
||||||
static struct filestack *OpenFiles = NULL;
|
static struct filestack *OpenFiles = NULL;
|
||||||
|
|
||||||
#define TOKEN_DELIMITER " \t\n\r"
|
struct hashdict *definitions = (struct hashdict *)NULL;
|
||||||
|
|
||||||
|
#define WHITESPACE_DELIMITER " \t\n\r"
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------*/
|
||||||
|
/* Seek and Tell on infile stream, for use with handling generate */
|
||||||
|
/* loops in verilog. */
|
||||||
|
/*----------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void SeekFile(long offset)
|
||||||
|
{
|
||||||
|
fseek(infile, offset, SEEK_SET);
|
||||||
|
}
|
||||||
|
|
||||||
|
long TellFile()
|
||||||
|
{
|
||||||
|
return ftell(infile);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------*/
|
||||||
|
/* TrimQuoted() --- */
|
||||||
|
/* Remove spaces from inside single- or double-quoted strings. */
|
||||||
|
/* Ignore verilog constant bits (e.g., "1'b0") when parsing. */
|
||||||
|
/*----------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
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 && (qstart > lptr)) {
|
||||||
|
if (isdigit(*(qstart - 1))) {
|
||||||
|
lptr = qstart + 1;
|
||||||
|
changed = TRUE;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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() */
|
/* GetNextLineNoNewline() */
|
||||||
|
|
@ -201,40 +298,233 @@ static struct filestack *OpenFiles = NULL;
|
||||||
/* */
|
/* */
|
||||||
/*----------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------*/
|
||||||
|
|
||||||
int GetNextLineNoNewline()
|
int GetNextLineNoNewline(char *delimiter)
|
||||||
{
|
{
|
||||||
char *newbuf;
|
char *newbuf;
|
||||||
int testc;
|
int testc;
|
||||||
|
static int nested = 0;
|
||||||
|
int llen;
|
||||||
|
|
||||||
if (feof(infile)) return -1;
|
if (feof(infile)) return -1;
|
||||||
|
|
||||||
// This is more reliable than feof() ...
|
while (1) { /* May loop indefinitely in an `if[n]def conditional */
|
||||||
testc = getc(infile);
|
|
||||||
if (testc == -1) return -1;
|
|
||||||
ungetc(testc, infile);
|
|
||||||
|
|
||||||
if (linesize == 0) {
|
// This is more reliable than feof() ...
|
||||||
/* Allocate memory for line */
|
testc = getc(infile);
|
||||||
linesize = 500;
|
if (testc == -1) return -1;
|
||||||
line = (char *)MALLOC(linesize);
|
ungetc(testc, infile);
|
||||||
linetok = (char *)MALLOC(linesize);
|
|
||||||
}
|
|
||||||
fgets(line, linesize, infile);
|
|
||||||
while (strlen(line) == linesize - 1) {
|
|
||||||
newbuf = (char *)MALLOC(linesize + 500);
|
|
||||||
strcpy(newbuf, line);
|
|
||||||
FREE(line);
|
|
||||||
line = newbuf;
|
|
||||||
fgets(line + linesize - 1, 501, infile);
|
|
||||||
linesize += 500;
|
|
||||||
FREE(linetok);
|
|
||||||
linetok = (char *)MALLOC(linesize);
|
|
||||||
}
|
|
||||||
linenum++;
|
|
||||||
strcpy(linetok, line);
|
|
||||||
|
|
||||||
nexttok = strtok(linetok, TOKEN_DELIMITER);
|
if (linesize == 0) {
|
||||||
return 0;
|
/* Allocate memory for line */
|
||||||
|
linesize = 2000;
|
||||||
|
line = (char *)MALLOC(linesize + 1);
|
||||||
|
linetok = (char *)MALLOC(linesize + 1);
|
||||||
|
}
|
||||||
|
fgets(line, linesize, infile);
|
||||||
|
/* Immediately resolve backslash-EOL */
|
||||||
|
llen = strlen(line);
|
||||||
|
while ((llen > 1) && (llen < linesize - 1) && *(line + llen - 2) == '\\') {
|
||||||
|
*(line + llen - 2) = '\n';
|
||||||
|
fgets(line + llen - 1, linesize - llen + 1, infile);
|
||||||
|
llen = strlen(line);
|
||||||
|
}
|
||||||
|
while (llen == linesize - 1) {
|
||||||
|
/* Note that in the rare case where a newline is in the last buffer
|
||||||
|
* position, we're done.
|
||||||
|
*/
|
||||||
|
if (*(line + llen - 1) == '\n') break;
|
||||||
|
|
||||||
|
newbuf = (char *)MALLOC(linesize + 501);
|
||||||
|
strcpy(newbuf, line);
|
||||||
|
FREE(line);
|
||||||
|
line = newbuf;
|
||||||
|
fgets(line + linesize - 1, 501, infile);
|
||||||
|
llen = strlen(line);
|
||||||
|
while ((llen > 1) && (llen < linesize - 1) && *(line + llen - 2) == '\\') {
|
||||||
|
*(line + llen - 2) = '\n';
|
||||||
|
fgets(line + llen - 1, linesize - llen + 1, infile);
|
||||||
|
llen = strlen(line);
|
||||||
|
}
|
||||||
|
linesize += 500;
|
||||||
|
FREE(linetok);
|
||||||
|
linetok = (char *)MALLOC(linesize + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (definitions == NULL)
|
||||||
|
strcpy(linetok, line);
|
||||||
|
else {
|
||||||
|
char *s, *t, *w, e;
|
||||||
|
struct property *kl;
|
||||||
|
int len, dlen, vlen, addin = 0;
|
||||||
|
int oldlinesize = linesize;
|
||||||
|
unsigned char found = TRUE;
|
||||||
|
|
||||||
|
/* Check for substitutions (verilog only). Make sure linetok is */
|
||||||
|
/* large enough to hold the entire line after substitutions. */
|
||||||
|
|
||||||
|
while (found) { /* Do this recursively, for nested definitions */
|
||||||
|
found = FALSE;
|
||||||
|
|
||||||
|
for (s = line; *s != '\0'; s++) {
|
||||||
|
if (*s == '`') {
|
||||||
|
w = s + 1;
|
||||||
|
while (isalnum(*w) || (*w == '_') || (*w == '$')) w++;
|
||||||
|
e = *w;
|
||||||
|
*w = '\0';
|
||||||
|
kl = (struct property *)HashLookup(s + 1, definitions);
|
||||||
|
if (kl != NULL) {
|
||||||
|
dlen = strlen(s);
|
||||||
|
if (kl->type == PROP_STRING) {
|
||||||
|
vlen = strlen(kl->pdefault.string);
|
||||||
|
}
|
||||||
|
else vlen = 12; /* Leave room for numeric conversion */
|
||||||
|
addin += vlen - dlen + 1;
|
||||||
|
found = TRUE;
|
||||||
|
}
|
||||||
|
*w = e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (found) {
|
||||||
|
len = strlen(line);
|
||||||
|
if (len + addin > linesize) {
|
||||||
|
while (len + addin > linesize) linesize += 500;
|
||||||
|
FREE(linetok);
|
||||||
|
linetok = (char *)MALLOC(linesize);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make definition substitutions (verilog only) */
|
||||||
|
|
||||||
|
t = linetok;
|
||||||
|
for (s = line; *s != '\0'; s++) {
|
||||||
|
if (*s == '`') {
|
||||||
|
w = s + 1;
|
||||||
|
while (isalnum(*w) || (*w == '_') || (*w == '$')) w++;
|
||||||
|
e = *w;
|
||||||
|
*w = '\0';
|
||||||
|
kl = (struct property *)HashLookup(s + 1, definitions);
|
||||||
|
if (kl != NULL) {
|
||||||
|
if (kl->type == PROP_STRING)
|
||||||
|
strcpy(t, kl->pdefault.string);
|
||||||
|
else if (kl->type == PROP_INTEGER)
|
||||||
|
sprintf(t, "%d", kl->pdefault.ival);
|
||||||
|
else if (kl->type == PROP_DOUBLE)
|
||||||
|
sprintf(t, "%g", kl->pdefault.dval);
|
||||||
|
t += strlen(t);
|
||||||
|
s = w - 1;
|
||||||
|
}
|
||||||
|
else *t++ = *s;
|
||||||
|
*w = e;
|
||||||
|
}
|
||||||
|
else *t++ = *s;
|
||||||
|
}
|
||||||
|
*t = '\0';
|
||||||
|
|
||||||
|
/* Copy substituted linetok back to line and repeat until */
|
||||||
|
/* there are no more substitutions to be made. */
|
||||||
|
|
||||||
|
if (oldlinesize != linesize) {
|
||||||
|
FREE(line);
|
||||||
|
line = (char *)MALLOC(linesize + 501);
|
||||||
|
oldlinesize = linesize;
|
||||||
|
}
|
||||||
|
strcpy(line, linetok);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TrimQuoted(linetok);
|
||||||
|
linenum++;
|
||||||
|
|
||||||
|
nexttok = strdtok(linetok, WHITESPACE_DELIMITER, delimiter);
|
||||||
|
if (nexttok == NULL) return 0;
|
||||||
|
|
||||||
|
/* Handle `ifdef, `ifndef, `elsif, `else, and `endif (verilog */
|
||||||
|
/* only, where indicated by a non-NULL "definitions") */
|
||||||
|
|
||||||
|
if (definitions == NULL) return 0;
|
||||||
|
|
||||||
|
/* If currently skipping through a section, handle conditionals differently */
|
||||||
|
|
||||||
|
if (condstack) {
|
||||||
|
if (((condstack->invert == 0) && (condstack->kl == NULL))
|
||||||
|
|| ((condstack->invert == 1) && (condstack->kl != NULL))) {
|
||||||
|
if (match(nexttok, "`ifdef") || match(nexttok, "`ifndef")) {
|
||||||
|
nested++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (nested > 0) {
|
||||||
|
if (match(nexttok, "`endif")) nested--;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else if (nexttok[0] != '`') continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Handle conditionals (that is not being skipped over) */
|
||||||
|
|
||||||
|
if (match(nexttok, "`endif")) {
|
||||||
|
if (condstack == NULL) {
|
||||||
|
fprintf(stderr, "Error: `endif without corresponding `if[n]def\n");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
struct ifstack *iftop = condstack;
|
||||||
|
condstack = condstack->next;
|
||||||
|
FREE(iftop);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Note that `if[n]def may be nested. */
|
||||||
|
|
||||||
|
else if (match(nexttok, "`ifdef") || match(nexttok, "`ifndef") ||
|
||||||
|
match(nexttok, "`elsif") || match(nexttok, "`else")) {
|
||||||
|
|
||||||
|
/* Every `ifdef or `ifndef increases condstack by 1 */
|
||||||
|
if (nexttok[1] == 'i') {
|
||||||
|
struct ifstack *newif = (struct ifstack *)MALLOC(sizeof(struct ifstack));
|
||||||
|
newif->next = condstack;
|
||||||
|
condstack = newif;
|
||||||
|
}
|
||||||
|
if (condstack == NULL) {
|
||||||
|
fprintf(stderr, "Error: %s without `if[n]def\n", nexttok);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (match(nexttok, "`else")) {
|
||||||
|
/* Invert the sense of the if[n]def scope */
|
||||||
|
condstack->invert = (condstack->invert == 1) ? 0 : 1;
|
||||||
|
}
|
||||||
|
else if (match(nexttok, "`elsif")) {
|
||||||
|
nexttok = strdtok(NULL, WHITESPACE_DELIMITER, delimiter);
|
||||||
|
if (nexttok == NULL) {
|
||||||
|
fprintf(stderr, "Error: `elsif with no conditional.\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
/* Keep the same scope but redefine the parameter */
|
||||||
|
condstack->invert = 0;
|
||||||
|
condstack->kl = (struct property *)HashLookup(nexttok, definitions);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
condstack->invert = (nexttok[3] == 'n') ? 1 : 0;
|
||||||
|
nexttok = strdtok(NULL, WHITESPACE_DELIMITER, delimiter);
|
||||||
|
if (nexttok == NULL) {
|
||||||
|
fprintf(stderr, "Error: %s with no conditional.\n", nexttok);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
condstack->kl = (struct property *)HashLookup(nexttok, definitions);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (condstack) {
|
||||||
|
if (((condstack->invert == 0) && (condstack->kl == NULL))
|
||||||
|
|| ((condstack->invert == 1) && (condstack->kl != NULL)))
|
||||||
|
continue;
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*----------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------*/
|
||||||
|
|
@ -242,22 +532,41 @@ int GetNextLineNoNewline()
|
||||||
/* valid token. */
|
/* valid token. */
|
||||||
/*----------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------*/
|
||||||
|
|
||||||
void GetNextLine()
|
void GetNextLine(char *delimiter)
|
||||||
{
|
{
|
||||||
do {
|
do {
|
||||||
if (GetNextLineNoNewline() == -1) return;
|
if (GetNextLineNoNewline(delimiter) == -1) return;
|
||||||
} while (nexttok == NULL);
|
} while (nexttok == NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------*/
|
||||||
|
/* Return a pointer to the line at the position of nexttok */
|
||||||
|
/* This is used only when returning the entire line, untokenized, and */
|
||||||
|
/* is only called by the verilog read routine when reading the value of */
|
||||||
|
/* a `define statement. */
|
||||||
|
/*----------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
char *GetLineAtTok()
|
||||||
|
{
|
||||||
|
char *lpos;
|
||||||
|
|
||||||
|
if (nexttok == NULL) return NULL;
|
||||||
|
if (line == NULL) return NULL;
|
||||||
|
|
||||||
|
lpos = strstr(line, nexttok);
|
||||||
|
return lpos;
|
||||||
|
}
|
||||||
|
|
||||||
/*----------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------*/
|
||||||
/* if nexttok is already NULL, force scanner to read new line */
|
/* if nexttok is already NULL, force scanner to read new line */
|
||||||
/*----------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------*/
|
||||||
|
|
||||||
void SkipTok(void)
|
void SkipTok(char *delimiter)
|
||||||
{
|
{
|
||||||
if (nexttok != NULL &&
|
if (nexttok != NULL &&
|
||||||
(nexttok = strtok(NULL, TOKEN_DELIMITER)) != NULL) return;
|
(nexttok = strdtok(NULL, WHITESPACE_DELIMITER, delimiter)))
|
||||||
GetNextLine();
|
return;
|
||||||
|
GetNextLine(delimiter);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*----------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------*/
|
||||||
|
|
@ -265,9 +574,9 @@ void SkipTok(void)
|
||||||
/* must be preceeded by at least one call to SkipTok() */
|
/* must be preceeded by at least one call to SkipTok() */
|
||||||
/*----------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------*/
|
||||||
|
|
||||||
void SkipTokNoNewline(void)
|
void SkipTokNoNewline(char *delimiter)
|
||||||
{
|
{
|
||||||
nexttok = strtok(NULL, TOKEN_DELIMITER);
|
nexttok = strdtok(NULL, WHITESPACE_DELIMITER, delimiter);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*----------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------*/
|
||||||
|
|
@ -283,26 +592,65 @@ void SkipTokNoNewline(void)
|
||||||
/* */
|
/* */
|
||||||
/* Modified 3/30/2015 to include the condition where a comment line is */
|
/* Modified 3/30/2015 to include the condition where a comment line is */
|
||||||
/* in the middle of a series of continuation lines. */
|
/* in the middle of a series of continuation lines. */
|
||||||
|
/* */
|
||||||
|
/* Modified 1/3/2024 to avoid skipping two lines if a line has only the */
|
||||||
|
/* comment character '*' followed by a newline. It seems that '\n' is */
|
||||||
|
/* being ignored in WHITESPACE_DELIMITER, but it's easier to write the */
|
||||||
|
/* code to find the exception rather than track down the problem in */
|
||||||
|
/* GetNextLine(). */
|
||||||
/*----------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------*/
|
||||||
|
|
||||||
void SpiceTokNoNewline(void)
|
void SpiceTokNoNewline(void)
|
||||||
{
|
{
|
||||||
int contline;
|
int contline;
|
||||||
|
|
||||||
if ((nexttok = strtok(NULL, TOKEN_DELIMITER)) != NULL) return;
|
if ((nexttok = strdtok0(NULL, WHITESPACE_DELIMITER, NULL, FALSE)) != NULL) return;
|
||||||
|
|
||||||
while (nexttok == NULL) {
|
while (nexttok == NULL) {
|
||||||
contline = getc(infile);
|
contline = getc(infile);
|
||||||
if (contline == '*') {
|
if (contline == '*') {
|
||||||
GetNextLine();
|
char testline = ' ';
|
||||||
SkipNewLine();
|
while ((testline == ' ') || (testline == '\t'))
|
||||||
|
testline = getc(infile);
|
||||||
|
if (testline != '\n') {
|
||||||
|
ungetc(testline, infile);
|
||||||
|
GetNextLine(WHITESPACE_DELIMITER);
|
||||||
|
SkipNewLine(NULL);
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if (contline != '+') {
|
else if (contline != '+') {
|
||||||
ungetc(contline, infile);
|
ungetc(contline, infile);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (GetNextLineNoNewline() == -1) break;
|
if (GetNextLineNoNewline(WHITESPACE_DELIMITER) == -1) break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------*/
|
||||||
|
/* Skip to the next token, ignoring any C-style comments and verilog */
|
||||||
|
/* "(* ... *)"-style comments. */
|
||||||
|
/*----------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
void SkipTokComments(char *delimiter)
|
||||||
|
{
|
||||||
|
SkipTok(delimiter);
|
||||||
|
while (nexttok) {
|
||||||
|
if (match(nexttok, "//")) {
|
||||||
|
SkipNewLine(delimiter);
|
||||||
|
SkipTok(delimiter);
|
||||||
|
}
|
||||||
|
else if (match(nexttok, "/*")) {
|
||||||
|
while (nexttok && !match(nexttok, "*/"))
|
||||||
|
SkipTok(delimiter);
|
||||||
|
if (nexttok) SkipTok(delimiter);
|
||||||
|
}
|
||||||
|
else if (match(nexttok, "(*")) {
|
||||||
|
while (nexttok && !match(nexttok, "*)"))
|
||||||
|
SkipTok(delimiter);
|
||||||
|
if (nexttok) SkipTok(delimiter);
|
||||||
|
}
|
||||||
|
else break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -310,9 +658,10 @@ void SpiceTokNoNewline(void)
|
||||||
/* skip to the end of the current line */
|
/* skip to the end of the current line */
|
||||||
/*----------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------*/
|
||||||
|
|
||||||
void SkipNewLine(void)
|
void SkipNewLine(char *delimiter)
|
||||||
{
|
{
|
||||||
while (nexttok != NULL) nexttok = strtok(NULL, TOKEN_DELIMITER);
|
while (nexttok != NULL)
|
||||||
|
nexttok = strdtok(NULL, WHITESPACE_DELIMITER, delimiter);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*----------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------*/
|
||||||
|
|
@ -324,18 +673,168 @@ void SpiceSkipNewLine(void)
|
||||||
{
|
{
|
||||||
int contline;
|
int contline;
|
||||||
|
|
||||||
SkipNewLine();
|
SkipNewLine(NULL);
|
||||||
contline = getc(infile);
|
contline = getc(infile);
|
||||||
|
|
||||||
while (contline == '+') {
|
while (contline == '+') {
|
||||||
ungetc(contline, infile);
|
ungetc(contline, infile);
|
||||||
GetNextLine();
|
GetNextLine(WHITESPACE_DELIMITER);
|
||||||
SkipNewLine();
|
SkipNewLine(NULL);
|
||||||
contline = getc(infile);
|
contline = getc(infile);
|
||||||
}
|
}
|
||||||
ungetc(contline, infile);
|
ungetc(contline, infile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0 /* Commented with "#if 0" due to comment characters in the comment */
|
||||||
|
/*----------------------------------------------------------------------*/
|
||||||
|
/* Function similar to strtok() for token parsing. The difference is */
|
||||||
|
/* that it takes two sets of delimiters. The first is whitespace */
|
||||||
|
/* delimiters, which separate tokens. The second is functional */
|
||||||
|
/* delimiters, which separate tokens and have additional meaning, such */
|
||||||
|
/* as parentheses, commas, semicolons, etc. The parser needs to know */
|
||||||
|
/* when such tokens occur in the string, so they are returned as */
|
||||||
|
/* individual tokens. */
|
||||||
|
/* */
|
||||||
|
/* Definition of delim2: String of single delimiter characters. The */
|
||||||
|
/* special character "X" (which is never a delimiter in practice) is */
|
||||||
|
/* used to separate single-character delimiters from two-character */
|
||||||
|
/* delimiters (this presumably could be further extended as needed). */
|
||||||
|
/* so ",;()" would be a valid delimiter set, but to include C-style */
|
||||||
|
/* comments and verilog-style parameter lists, one would need */
|
||||||
|
/* "X/**///#(X,;()". Two-character delimiters should go first so that */
|
||||||
|
/* they have precedence over one-character delimiters. 'X' should be */
|
||||||
|
/* the first character of the delimiter string in addition to marking */
|
||||||
|
/* the boundary between two-character and one-character delimiters. */
|
||||||
|
/*----------------------------------------------------------------------*/
|
||||||
|
#endif
|
||||||
|
|
||||||
|
char *strdtok0(char *pstring, char *delim1, char *delim2, char isverilog)
|
||||||
|
{
|
||||||
|
static char *stoken = NULL;
|
||||||
|
static char *sstring = NULL;
|
||||||
|
char *s, *s2;
|
||||||
|
char first = FALSE;
|
||||||
|
int twofer;
|
||||||
|
|
||||||
|
if (pstring != NULL) {
|
||||||
|
/* Allocate enough memory to hold the string; tokens will be put here */
|
||||||
|
if (sstring != NULL) FREE(sstring);
|
||||||
|
sstring = (char *)MALLOC(strlen(pstring) + 1);
|
||||||
|
stoken = pstring;
|
||||||
|
first = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Skip over "delim1" delimiters at the string beginning */
|
||||||
|
for (; *stoken; stoken++) {
|
||||||
|
for (s2 = delim1; *s2; s2++)
|
||||||
|
if (*stoken == *s2)
|
||||||
|
break;
|
||||||
|
if (*s2 == '\0') break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*stoken == '\0') return NULL; /* Finished parsing */
|
||||||
|
|
||||||
|
/* "stoken" is now set. Now find the end of the current token */
|
||||||
|
|
||||||
|
s = stoken;
|
||||||
|
|
||||||
|
/* Special verilog rule: If a name begins with '\', then all characters */
|
||||||
|
/* are a valid part of the name until a space character is reached. The */
|
||||||
|
/* space character becomes part of the verilog name. The remainder of the */
|
||||||
|
/* name is parsed according to the rules of "delim2". */
|
||||||
|
|
||||||
|
/* Special verilog rule exception: To handle the problems caused by */
|
||||||
|
/* translating verilog backslash-escaped names into other netlist formats */
|
||||||
|
/* like SPICE where the convention is strictly prohibited, I have used the */
|
||||||
|
/* convention in qflow scripts to replace the trailing space with another */
|
||||||
|
/* backslash, so the name is effectively delimited by a pair of back- */
|
||||||
|
/* slashes. Therefore check for a space or another backslash, whichever */
|
||||||
|
/* comes first. That will satisfy both methods. Technically this routine */
|
||||||
|
/* should know whether it is parsing SPICE or verilog and handle the syntax */
|
||||||
|
/* accordingly (needs to be done). */
|
||||||
|
|
||||||
|
if (isverilog && (*s == '\\')) {
|
||||||
|
s++;
|
||||||
|
while (*s != '\0') {
|
||||||
|
if ((*s == ' ') || ((*s == '\\') && (*(s + 1) == '\0'))) {
|
||||||
|
s++;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
s++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check string from position stoken. If a character in "delim2" is found, */
|
||||||
|
/* save the character in "lastdelim", null the byte at that position, and */
|
||||||
|
/* return the token. If a character in "delim1" is found, do the same but */
|
||||||
|
/* continue checking characters as long as there are contiguous "delim1" */
|
||||||
|
/* characters. If the series ends in a character from "delim2", then treat */
|
||||||
|
/* as for "delim2" above. If not, then set "lastdelim" to a null byte and */
|
||||||
|
/* return the token. */
|
||||||
|
|
||||||
|
for (; *s; s++) {
|
||||||
|
twofer = (delim2 && (*delim2 == 'X')) ? TRUE : FALSE;
|
||||||
|
for (s2 = ((twofer == TRUE) ? delim2 + 1 : delim2); s2 && *s2; s2++) {
|
||||||
|
if (*s2 == 'X') {
|
||||||
|
twofer = FALSE;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (twofer) {
|
||||||
|
if ((*s == *s2) && (*(s + 1) == *(s2 + 1))) {
|
||||||
|
if (s == stoken) {
|
||||||
|
strncpy(sstring, stoken, 2);
|
||||||
|
*(sstring + 2) = '\0';
|
||||||
|
stoken = s + 2;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
strncpy(sstring, stoken, (int)(s - stoken));
|
||||||
|
*(sstring + (s - stoken)) = '\0';
|
||||||
|
stoken = s;
|
||||||
|
}
|
||||||
|
return sstring;
|
||||||
|
}
|
||||||
|
s2++;
|
||||||
|
if (*s2 == '\0') break;
|
||||||
|
}
|
||||||
|
else if (*s == *s2) {
|
||||||
|
if (s == stoken) {
|
||||||
|
strncpy(sstring, stoken, 1);
|
||||||
|
*(sstring + 1) = '\0';
|
||||||
|
stoken = s + 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
strncpy(sstring, stoken, (int)(s - stoken));
|
||||||
|
*(sstring + (s - stoken)) = '\0';
|
||||||
|
stoken = s;
|
||||||
|
}
|
||||||
|
return sstring;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (s2 = delim1; *s2; s2++) {
|
||||||
|
if (*s == *s2) {
|
||||||
|
strncpy(sstring, stoken, (int)(s - stoken));
|
||||||
|
*(sstring + (s - stoken)) = '\0';
|
||||||
|
stoken = s;
|
||||||
|
return sstring;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
strcpy(sstring, stoken); /* Just copy to the end */
|
||||||
|
stoken = s;
|
||||||
|
return sstring;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------*/
|
||||||
|
/* strdtok() is the original string tokenizer. It calls strdtok0() */
|
||||||
|
/* with isverilog=TRUE, so that tokens are parsed as (potentially) */
|
||||||
|
/* verilog names, which includes verilog backslash notation. */
|
||||||
|
/*----------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
char *strdtok(char *pstring, char *delim1, char *delim2)
|
||||||
|
{
|
||||||
|
return strdtok0(pstring, delim1, delim2, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
/*----------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------*/
|
||||||
|
|
||||||
void InputParseError(FILE *f)
|
void InputParseError(FILE *f)
|
||||||
|
|
@ -359,7 +858,7 @@ int OpenParseFile(char *name, int fnum)
|
||||||
FILE *locfile;
|
FILE *locfile;
|
||||||
struct filestack *newfile;
|
struct filestack *newfile;
|
||||||
|
|
||||||
locfile = fopen(name,"r");
|
locfile = fopen(name, "r");
|
||||||
linenum = 0;
|
linenum = 0;
|
||||||
/* reset the token scanner */
|
/* reset the token scanner */
|
||||||
nexttok = NULL;
|
nexttok = NULL;
|
||||||
|
|
@ -417,7 +916,7 @@ char *ReadNetlist(char *fname, int *fnum)
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef mips
|
#ifdef mips
|
||||||
struct filetype formats[6];
|
struct filetype formats[8];
|
||||||
|
|
||||||
formats[0].extension = NTK_EXTENSION;
|
formats[0].extension = NTK_EXTENSION;
|
||||||
formats[0].proc = ReadNtk;
|
formats[0].proc = ReadNtk;
|
||||||
|
|
@ -425,12 +924,16 @@ char *ReadNetlist(char *fname, int *fnum)
|
||||||
formats[1].proc = ReadExtHier;
|
formats[1].proc = ReadExtHier;
|
||||||
formats[2].extension = SIM_EXTENSION;
|
formats[2].extension = SIM_EXTENSION;
|
||||||
formats[2].proc = ReadSim;
|
formats[2].proc = ReadSim;
|
||||||
formats[3].extension = SPICE_EXTENSION;
|
formats[3].extension = PRM_EXTENSION;
|
||||||
formats[3].proc = ReadSpice;
|
formats[3].proc = ReadPrm;
|
||||||
formats[4].extension = NETGEN_EXTENSION;
|
formats[4].extension = SPICE_EXTENSION;
|
||||||
formats[4].proc = ReadNetgenFile;
|
formats[4].proc = ReadSpice;
|
||||||
formats[5].extension = NULL;
|
formats[5].extension = NETGEN_EXTENSION;
|
||||||
formats[5].proc = NULL;
|
formats[5].proc = ReadNetgenFile;
|
||||||
|
formats[6].extension = VERILOG_EXTENSION;
|
||||||
|
formats[6].proc = ReadVerilogFile;
|
||||||
|
formats[7].extension = NULL;
|
||||||
|
formats[7].proc = NULL;
|
||||||
|
|
||||||
#else /* not mips (i.e. compiler with reasonable initializers) */
|
#else /* not mips (i.e. compiler with reasonable initializers) */
|
||||||
|
|
||||||
|
|
@ -439,9 +942,16 @@ char *ReadNetlist(char *fname, int *fnum)
|
||||||
{NTK_EXTENSION, ReadNtk},
|
{NTK_EXTENSION, ReadNtk},
|
||||||
{EXT_EXTENSION, ReadExtHier},
|
{EXT_EXTENSION, ReadExtHier},
|
||||||
{SIM_EXTENSION, ReadSim},
|
{SIM_EXTENSION, ReadSim},
|
||||||
|
{PRM_EXTENSION, ReadPrm},
|
||||||
{SPICE_EXTENSION, ReadSpice},
|
{SPICE_EXTENSION, ReadSpice},
|
||||||
{SPICE_EXT2, ReadSpice},
|
{SPICE_EXT2, ReadSpice},
|
||||||
{SPICE_EXT3, ReadSpice},
|
{SPICE_EXT3, ReadSpice},
|
||||||
|
{SPICE_EXT4, ReadSpice},
|
||||||
|
{SPICE_EXT5, ReadSpice},
|
||||||
|
{SPICE_EXT6, ReadSpice},
|
||||||
|
{SPICE_EXT7, ReadSpice},
|
||||||
|
{VERILOG_EXTENSION, ReadVerilog},
|
||||||
|
{SYS_VERILOG_EXTENSION, ReadVerilog},
|
||||||
{NETGEN_EXTENSION, ReadNetgenFile},
|
{NETGEN_EXTENSION, ReadNetgenFile},
|
||||||
{NULL, NULL}
|
{NULL, NULL}
|
||||||
};
|
};
|
||||||
|
|
@ -449,13 +959,15 @@ char *ReadNetlist(char *fname, int *fnum)
|
||||||
|
|
||||||
/* make first pass looking for extension */
|
/* make first pass looking for extension */
|
||||||
for (index = 0; formats[index].extension != NULL; index++) {
|
for (index = 0; formats[index].extension != NULL; index++) {
|
||||||
if (strstr(fname, formats[index].extension) != NULL) {
|
int extlen = strlen(formats[index].extension);
|
||||||
|
int flen = strlen(fname);
|
||||||
|
if (!strcmp(fname + flen - extlen, formats[index].extension)) {
|
||||||
return (*(formats[index].proc))(fname, fnum);
|
return (*(formats[index].proc))(fname, fnum);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/* try appending extensions in sequence, and testing for file existance */
|
/* try appending extensions in sequence, and testing for file existance */
|
||||||
for (index = 0; formats[index].extension != NULL; index++) {
|
for (index = 0; formats[index].extension != NULL; index++) {
|
||||||
char testname[200];
|
char testname[MAX_STR_LEN];
|
||||||
strcpy(testname, fname);
|
strcpy(testname, fname);
|
||||||
strcat(testname, formats[index].extension);
|
strcat(testname, formats[index].extension);
|
||||||
if (OpenParseFile(testname, *fnum) >= 0) {
|
if (OpenParseFile(testname, *fnum) >= 0) {
|
||||||
|
|
@ -560,14 +1072,14 @@ void WriteNetgenFile(char *name, char *filename)
|
||||||
|
|
||||||
char *ReadNetgenFile (char *fname, int *fnum)
|
char *ReadNetgenFile (char *fname, int *fnum)
|
||||||
{
|
{
|
||||||
char name[100];
|
char name[MAX_STR_LEN];
|
||||||
char *LastCellRead = NULL;
|
char *LastCellRead = NULL;
|
||||||
int filenum;
|
int filenum;
|
||||||
|
|
||||||
if ((filenum = OpenParseFile(fname, *fnum)) < 0) {
|
if ((filenum = OpenParseFile(fname, *fnum)) < 0) {
|
||||||
SetExtension(name, fname, NETGEN_EXTENSION);
|
SetExtension(name, fname, NETGEN_EXTENSION);
|
||||||
if ((filenum = OpenParseFile(name, *fnum)) < 0) {
|
if ((filenum = OpenParseFile(name, *fnum)) < 0) {
|
||||||
Printf("No file: %s\n",name);
|
Printf("Error in netgen read: No file %s\n",name);
|
||||||
*fnum = -1;
|
*fnum = -1;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
@ -796,14 +1308,14 @@ int READ(void *buf, int bytes)
|
||||||
|
|
||||||
char *ReadNetgenFile (char *fname, int *fnum)
|
char *ReadNetgenFile (char *fname, int *fnum)
|
||||||
{
|
{
|
||||||
char name[100];
|
char name[MAX_STR_LEN];
|
||||||
int len, chars;
|
int len, chars;
|
||||||
char *LastCellRead = NULL;
|
char *LastCellRead = NULL;
|
||||||
|
|
||||||
if ((File = open(fname, O_RDONLY, FILE_ACCESS_BITS)) == -1) {
|
if ((File = open(fname, O_RDONLY, FILE_ACCESS_BITS)) == -1) {
|
||||||
SetExtension(name, fname, NETGEN_EXTENSION);
|
SetExtension(name, fname, NETGEN_EXTENSION);
|
||||||
if ((File = open(name, O_RDONLY, FILE_ACCESS_BITS)) == -1) {
|
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;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -7,12 +7,19 @@
|
||||||
#define WOMBAT_EXTENSION ".wom"
|
#define WOMBAT_EXTENSION ".wom"
|
||||||
#define EXT_EXTENSION ".ext"
|
#define EXT_EXTENSION ".ext"
|
||||||
#define SIM_EXTENSION ".sim"
|
#define SIM_EXTENSION ".sim"
|
||||||
|
#define PRM_EXTENSION ".prm"
|
||||||
#define SPICE_EXTENSION ".spice"
|
#define SPICE_EXTENSION ".spice"
|
||||||
#define SPICE_EXT2 ".spc"
|
#define SPICE_EXT2 ".spc"
|
||||||
#define SPICE_EXT3 ".fspc"
|
#define SPICE_EXT3 ".sp"
|
||||||
|
#define SPICE_EXT4 ".spi"
|
||||||
|
#define SPICE_EXT5 ".fspc"
|
||||||
|
#define SPICE_EXT6 ".cir"
|
||||||
|
#define SPICE_EXT7 ".ckt"
|
||||||
#define NETGEN_EXTENSION ".ntg"
|
#define NETGEN_EXTENSION ".ntg"
|
||||||
#define CCODE_EXTENSION ".c.code"
|
#define CCODE_EXTENSION ".c.code"
|
||||||
#define ESACAP_EXTENSION ".esa"
|
#define ESACAP_EXTENSION ".esa"
|
||||||
|
#define VERILOG_EXTENSION ".v"
|
||||||
|
#define SYS_VERILOG_EXTENSION ".sv"
|
||||||
|
|
||||||
#define LINELENGTH 80
|
#define LINELENGTH 80
|
||||||
|
|
||||||
|
|
@ -23,19 +30,26 @@ extern void FlushString (char *format, ...);
|
||||||
extern char *SetExtension(char *buffer, char *path, char *extension);
|
extern char *SetExtension(char *buffer, char *path, char *extension);
|
||||||
|
|
||||||
extern int File;
|
extern int File;
|
||||||
|
extern struct hashdict *definitions;
|
||||||
|
|
||||||
/* input routines */
|
/* input routines */
|
||||||
|
|
||||||
extern char *nexttok;
|
extern char *nexttok;
|
||||||
#define SKIPTO(a) do {SkipTok();} while (!match(nexttok,a))
|
#define SKIPTO(a) do {SkipTok(NULL);} while (!match(nexttok,a))
|
||||||
extern void SkipTok(void);
|
extern char *strdtok0(char *pstring, char *delim1, char *delim2, char isverilog);
|
||||||
extern void SkipTokNoNewline(void);
|
extern char *strdtok(char *pstring, char *delim1, char *delim2);
|
||||||
|
extern char *GetLineAtTok();
|
||||||
|
extern void SkipTok(char *delimiter);
|
||||||
|
extern void SkipTokNoNewline(char *delimiter);
|
||||||
|
extern void SkipTokComments(char *delimiter);
|
||||||
|
extern void SkipNewLine(char *delimiter);
|
||||||
extern void SpiceTokNoNewline(void); /* handles SPICE "+" continuation line */
|
extern void SpiceTokNoNewline(void); /* handles SPICE "+" continuation line */
|
||||||
extern void SkipNewLine(void);
|
|
||||||
extern void SpiceSkipNewLine(void); /* handles SPICE "+" continuation line */
|
extern void SpiceSkipNewLine(void); /* handles SPICE "+" continuation line */
|
||||||
extern void InputParseError(FILE *f);
|
extern void InputParseError(FILE *f);
|
||||||
extern int OpenParseFile(char *name, int fnum);
|
extern int OpenParseFile(char *name, int fnum);
|
||||||
extern int EndParseFile(void);
|
extern int EndParseFile(void);
|
||||||
extern int CloseParseFile(void);
|
extern int CloseParseFile(void);
|
||||||
|
extern void SeekFile(long offset); /* handles verilog 'for' loops */
|
||||||
|
extern long TellFile(); /* handles verilog 'for' loops */
|
||||||
|
|
||||||
#endif /* _NETFILE_H */
|
#endif /* _NETFILE_H */
|
||||||
|
|
|
||||||
1958
base/netgen.c
1958
base/netgen.c
File diff suppressed because it is too large
Load Diff
|
|
@ -33,14 +33,19 @@ extern struct property *PropertyDouble(char *name, int fnum, char *key,
|
||||||
extern struct property *PropertyInteger(char *name, int fnum, char *key,
|
extern struct property *PropertyInteger(char *name, int fnum, char *key,
|
||||||
int slop, int pdefault);
|
int slop, int pdefault);
|
||||||
extern struct property *PropertyString(char *name, int fnum, char *key,
|
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 int PropertyDelete(char *name, int fnum, char *key);
|
||||||
|
extern void SetParallelCombine(int value);
|
||||||
|
extern void SetSeriesCombine(int value);
|
||||||
extern int PropertyTolerance(char *name, int fnum, char *key, int ival,
|
extern int PropertyTolerance(char *name, int fnum, char *key, int ival,
|
||||||
double dval);
|
double dval);
|
||||||
extern int PropertyMerge(char *name, int fnum, char *key, int merge_type);
|
extern int PropertyAssociatePin(char *name, int fnum, char *key, char *pin);
|
||||||
|
extern int PropertyMerge(char *name, int fnum, char *key, int merge_type,
|
||||||
|
int merge_mask);
|
||||||
extern void ResolveProperties(char *name1, int file1, char *name2, int file2);
|
extern void ResolveProperties(char *name1, int file1, char *name2, int file2);
|
||||||
extern void CopyProperties(struct objlist *obj_to, struct objlist *obj_from);
|
extern void CopyProperties(struct objlist *obj_to, struct objlist *obj_from);
|
||||||
extern int PromoteProperty(struct property *, struct valuelist *);
|
extern int PromoteProperty(struct property *, struct valuelist *,
|
||||||
|
struct objlist *, struct nlist *);
|
||||||
extern int SetPropertyDefault(struct property *, struct valuelist *);
|
extern int SetPropertyDefault(struct property *, struct valuelist *);
|
||||||
extern struct objlist *LinkProperties(char *model, struct keyvalue *topptr);
|
extern struct objlist *LinkProperties(char *model, struct keyvalue *topptr);
|
||||||
extern int ReduceExpressions(struct objlist *instprop, struct objlist *parprops,
|
extern int ReduceExpressions(struct objlist *instprop, struct objlist *parprops,
|
||||||
|
|
@ -53,6 +58,8 @@ extern void PortList(char *prefix, char *list_template);
|
||||||
extern char *Cell(char *inststr, char *model, ...);
|
extern char *Cell(char *inststr, char *model, ...);
|
||||||
extern int IsIgnored(char *, int);
|
extern int IsIgnored(char *, int);
|
||||||
|
|
||||||
|
extern int auto_blackbox; /* For handling empty subcircuits */
|
||||||
|
|
||||||
/* netcmp.c */
|
/* netcmp.c */
|
||||||
extern struct nlist *LookupClassEquivalent(char *model, int file1, int file2);
|
extern struct nlist *LookupClassEquivalent(char *model, int file1, int file2);
|
||||||
extern void AssignCircuits(char *name1, int file1, char *name2, int file2);
|
extern void AssignCircuits(char *name1, int file1, char *name2, int file2);
|
||||||
|
|
@ -60,6 +67,15 @@ extern void AssignCircuits(char *name1, int file1, char *name2, int file2);
|
||||||
/* flatten.c */
|
/* flatten.c */
|
||||||
extern int PrematchLists(char *, int, char *, int);
|
extern int PrematchLists(char *, int, char *, int);
|
||||||
|
|
||||||
|
/* verilog.c */
|
||||||
|
struct cellstack {
|
||||||
|
char *cellname;
|
||||||
|
struct cellstack *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
void ReadVerilogFile(char *fname, int filenum, struct cellstack **CellStackPtr,
|
||||||
|
int blackbox);
|
||||||
|
|
||||||
/* Define (enumerate) various device classes, largely based on SPICE */
|
/* Define (enumerate) various device classes, largely based on SPICE */
|
||||||
/* model types, mixed with some ext/sim types. */
|
/* model types, mixed with some ext/sim types. */
|
||||||
|
|
||||||
|
|
@ -82,8 +98,10 @@ extern int PrematchLists(char *, int, char *, int);
|
||||||
#define CLASS_DIODE 16 /* standard SPICE diode */
|
#define CLASS_DIODE 16 /* standard SPICE diode */
|
||||||
#define CLASS_INDUCTOR 17 /* standard SPICE inductor */
|
#define CLASS_INDUCTOR 17 /* standard SPICE inductor */
|
||||||
#define CLASS_XLINE 18 /* transmission line model */
|
#define CLASS_XLINE 18 /* transmission line model */
|
||||||
#define CLASS_MODULE 19 /* sim "x"; black-box subcircuit */
|
#define CLASS_VSOURCE 19 /* independent voltage source */
|
||||||
#define CLASS_UNDEF 20 /* not defined; error */
|
#define CLASS_ISOURCE 20 /* independent current source */
|
||||||
|
#define CLASS_MODULE 21 /* sim "x"; black-box subcircuit */
|
||||||
|
#define CLASS_UNDEF 22 /* not defined; error */
|
||||||
|
|
||||||
extern char *P(char *fname, char *inststr, char *drain, char *gate, char *source);
|
extern char *P(char *fname, char *inststr, char *drain, char *gate, char *source);
|
||||||
extern char *P4(char *fname, char *inststr, char *drain, char *gate, char *source,
|
extern char *P4(char *fname, char *inststr, char *drain, char *gate, char *source,
|
||||||
|
|
@ -100,9 +118,9 @@ extern char *Res(char *fname, char *inststr, char *, char *);
|
||||||
extern char *XLine(char *fname, char *inststr, char *, char *, char *, char *);
|
extern char *XLine(char *fname, char *inststr, char *, char *, char *, char *);
|
||||||
extern char *Inductor(char *fname, char *inststr, char *, char *);
|
extern char *Inductor(char *fname, char *inststr, char *, char *);
|
||||||
|
|
||||||
extern int StringIsValue(char *);
|
extern int StringIsValue(char *);
|
||||||
extern char *ConvertParam(char *);
|
extern char *ConvertParam(char *);
|
||||||
extern int ConvertStringToFloat(char *, double *);
|
extern int ConvertStringToFloat(char *, double *);
|
||||||
extern char *ScaleStringFloatValue(char *, double);
|
extern char *ScaleStringFloatValue(char *, double);
|
||||||
extern void join(char *node1, char *node2);
|
extern void join(char *node1, char *node2);
|
||||||
extern void Connect(char *tplt1, char *tplt2);
|
extern void Connect(char *tplt1, char *tplt2);
|
||||||
|
|
@ -116,8 +134,8 @@ extern void FlattenCurrent();
|
||||||
extern void ConvertGlobals(char *name, int fnum);
|
extern void ConvertGlobals(char *name, int fnum);
|
||||||
extern int CleanupPins(char *name, int fnum);
|
extern int CleanupPins(char *name, int fnum);
|
||||||
extern void ConnectAllNodes(char *model, int fnum);
|
extern void ConnectAllNodes(char *model, int fnum);
|
||||||
extern void CombineParallel(char *model, int fnum);
|
extern int CombineParallel(char *model, int fnum);
|
||||||
extern void CombineSerial(char *model, int fnum);
|
extern int CombineSeries(char *model, int fnum);
|
||||||
extern int NoDisconnectedNodes;
|
extern int NoDisconnectedNodes;
|
||||||
extern int PropertyKeyMatch(char *, char *);
|
extern int PropertyKeyMatch(char *, char *);
|
||||||
extern int PropertyValueMatch(char *, char *);
|
extern int PropertyValueMatch(char *, char *);
|
||||||
|
|
@ -132,6 +150,8 @@ 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 NoOutput; /* set this to 1 to disable stdout output */
|
||||||
extern int Composition; /* direction of composition */
|
extern int Composition; /* direction of composition */
|
||||||
extern int UnixWildcards; /* TRUE if *,?,{},[] only; false if full REGEXP */
|
extern int UnixWildcards; /* TRUE if *,?,{},[] only; false if full REGEXP */
|
||||||
|
extern int GlobalParallelNone; /* If TRUE, don't parallel combine any cells */
|
||||||
|
extern int GlobalParallelOpen; /* If TRUE, parallel combine cells w/no-connects */
|
||||||
/* magic internal flag to restrict searches to recently placed cells */
|
/* magic internal flag to restrict searches to recently placed cells */
|
||||||
extern int QuickSearch;
|
extern int QuickSearch;
|
||||||
/* does re"CellDef"ing a cell add to it or overwrite it??? */
|
/* does re"CellDef"ing a cell add to it or overwrite it??? */
|
||||||
|
|
@ -171,9 +191,11 @@ extern char *ReadNtk (char *fname, int *fnum);
|
||||||
extern char *ReadExtHier(char *fname, int *fnum);
|
extern char *ReadExtHier(char *fname, int *fnum);
|
||||||
extern char *ReadExtFlat(char *fname, int *fnum);
|
extern char *ReadExtFlat(char *fname, int *fnum);
|
||||||
extern char *ReadSim(char *fname, int *fnum);
|
extern char *ReadSim(char *fname, int *fnum);
|
||||||
|
extern char *ReadPrm(char *fname, int *fnum);
|
||||||
extern char *ReadSpice(char *fname, int *fnum);
|
extern char *ReadSpice(char *fname, int *fnum);
|
||||||
extern char *ReadSpiceLib(char *fname, int *fnum);
|
extern char *ReadSpiceLib(char *fname, int *fnum);
|
||||||
extern char *ReadNetgenFile (char *fname, int *fnum);
|
extern char *ReadNetgenFile (char *fname, int *fnum);
|
||||||
|
extern char *ReadVerilog(char *fname, int *fnum);
|
||||||
|
|
||||||
extern char *ReadNetlist(char *fname, int *fnum);
|
extern char *ReadNetlist(char *fname, int *fnum);
|
||||||
|
|
||||||
|
|
|
||||||
54
base/ntk.c
54
base/ntk.c
|
|
@ -27,6 +27,10 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#ifdef TCL_NETGEN
|
||||||
|
#include <tcl.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "netgen.h"
|
#include "netgen.h"
|
||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
#include "objlist.h"
|
#include "objlist.h"
|
||||||
|
|
@ -177,7 +181,7 @@ void Ntk(char *name, char *filename)
|
||||||
|
|
||||||
char *ReadNtk (char *fname, int *fnum)
|
char *ReadNtk (char *fname, int *fnum)
|
||||||
{
|
{
|
||||||
char model[100], instancename[100], name[100];
|
char model[MAX_STR_LEN], instancename[MAX_STR_LEN], name[MAX_STR_LEN];
|
||||||
struct objlist *ob;
|
struct objlist *ob;
|
||||||
int CellDefInProgress = 0;
|
int CellDefInProgress = 0;
|
||||||
int filenum;
|
int filenum;
|
||||||
|
|
@ -186,14 +190,14 @@ char *ReadNtk (char *fname, int *fnum)
|
||||||
if ((filenum = OpenParseFile(fname, *fnum)) < 0) {
|
if ((filenum = OpenParseFile(fname, *fnum)) < 0) {
|
||||||
SetExtension(name, fname, NTK_EXTENSION);
|
SetExtension(name, fname, NTK_EXTENSION);
|
||||||
if ((filenum = OpenParseFile(name, *fnum)) < 0) {
|
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;
|
*fnum = filenum;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
while (!EndParseFile()) {
|
while (!EndParseFile()) {
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
if (EndParseFile()) break;
|
if (EndParseFile()) break;
|
||||||
if (nexttok[0] == '|') SKIPTO(";");
|
if (nexttok[0] == '|') SKIPTO(";");
|
||||||
else if (match(nexttok, "c")) {
|
else if (match(nexttok, "c")) {
|
||||||
|
|
@ -203,18 +207,18 @@ char *ReadNtk (char *fname, int *fnum)
|
||||||
EndCell();
|
EndCell();
|
||||||
CellDefInProgress = 0;
|
CellDefInProgress = 0;
|
||||||
}
|
}
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
CellDef(nexttok, CurrentCell->file);
|
CellDef(nexttok, CurrentCell->file);
|
||||||
LastCellRead = CurrentCell->name;
|
LastCellRead = CurrentCell->name;
|
||||||
CellDefInProgress = 1;
|
CellDefInProgress = 1;
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
while (!match(nexttok, ";")) {
|
while (!match(nexttok, ";")) {
|
||||||
Port(nexttok);
|
Port(nexttok);
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (match(nexttok, "s")) {
|
else if (match(nexttok, "s")) {
|
||||||
char last[100];
|
char last[MAX_STR_LEN];
|
||||||
*last = '\0';
|
*last = '\0';
|
||||||
if (!CellDefInProgress) {
|
if (!CellDefInProgress) {
|
||||||
/* fake cell declaration for top-level call */
|
/* fake cell declaration for top-level call */
|
||||||
|
|
@ -224,8 +228,8 @@ char *ReadNtk (char *fname, int *fnum)
|
||||||
if (LastCellRead == NULL)
|
if (LastCellRead == NULL)
|
||||||
LastCellRead = CurrentCell->name;
|
LastCellRead = CurrentCell->name;
|
||||||
}
|
}
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
SkipTok(); /* eat the 'size' of the node */
|
SkipTok(NULL); /* eat the 'size' of the node */
|
||||||
/* after the 'size', all names are synonyms */
|
/* after the 'size', all names are synonyms */
|
||||||
while (!match(nexttok, ";")) {
|
while (!match(nexttok, ";")) {
|
||||||
#if 1
|
#if 1
|
||||||
|
|
@ -240,7 +244,7 @@ char *ReadNtk (char *fname, int *fnum)
|
||||||
#endif
|
#endif
|
||||||
if (strlen(last)) join(last, nexttok);
|
if (strlen(last)) join(last, nexttok);
|
||||||
strcpy(last, nexttok);
|
strcpy(last, nexttok);
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (match(nexttok, "h")) {
|
else if (match(nexttok, "h")) {
|
||||||
|
|
@ -250,11 +254,11 @@ char *ReadNtk (char *fname, int *fnum)
|
||||||
if (LastCellRead == NULL)
|
if (LastCellRead == NULL)
|
||||||
LastCellRead = CurrentCell->name;
|
LastCellRead = CurrentCell->name;
|
||||||
}
|
}
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
strcpy(model, nexttok);
|
strcpy(model, nexttok);
|
||||||
strcpy(instancename, nexttok);
|
strcpy(instancename, nexttok);
|
||||||
strcat(instancename, INSTANCE_DELIMITER);
|
strcat(instancename, INSTANCE_DELIMITER);
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
strcat(instancename, nexttok);
|
strcat(instancename, nexttok);
|
||||||
if (LookupCell(model) == NULL) {
|
if (LookupCell(model) == NULL) {
|
||||||
#ifdef DEFINE_UNDEFINED_CELLS
|
#ifdef DEFINE_UNDEFINED_CELLS
|
||||||
|
|
@ -264,7 +268,7 @@ char *ReadNtk (char *fname, int *fnum)
|
||||||
|
|
||||||
previous_cell = CurrentCell->name;
|
previous_cell = CurrentCell->name;
|
||||||
CellDef(model, CurrentCell->file);
|
CellDef(model, CurrentCell->file);
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
args = 0;
|
args = 0;
|
||||||
while (!match(nexttok, ";")) {
|
while (!match(nexttok, ";")) {
|
||||||
sprintf(name, "pin%d", args+1);
|
sprintf(name, "pin%d", args+1);
|
||||||
|
|
@ -273,11 +277,11 @@ char *ReadNtk (char *fname, int *fnum)
|
||||||
args++;
|
args++;
|
||||||
/* check for overflow */
|
/* check for overflow */
|
||||||
if (args == (sizeof(ports) / sizeof(ports[0]))) {
|
if (args == (sizeof(ports) / sizeof(ports[0]))) {
|
||||||
while (!match(nexttok, ";")) SkipTok();
|
while (!match(nexttok, ";")) SkipTok(NULL);
|
||||||
break; /* out of while loop */
|
break; /* out of while loop */
|
||||||
}
|
}
|
||||||
/* if no overflow, get the next token */
|
/* if no overflow, get the next token */
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
}
|
}
|
||||||
EndCell();
|
EndCell();
|
||||||
/* now, reopen previous cell, instance the new cell,
|
/* now, reopen previous cell, instance the new cell,
|
||||||
|
|
@ -301,7 +305,7 @@ char *ReadNtk (char *fname, int *fnum)
|
||||||
ob = LookupCell(model)->cell;
|
ob = LookupCell(model)->cell;
|
||||||
while ((ob != NULL) && !IsPort(ob))
|
while ((ob != NULL) && !IsPort(ob))
|
||||||
ob = ob->next;
|
ob = ob->next;
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
while (!match(nexttok, ";")) {
|
while (!match(nexttok, ";")) {
|
||||||
strcpy(name, instancename);
|
strcpy(name, instancename);
|
||||||
strcat(name, SEPARATOR);
|
strcat(name, SEPARATOR);
|
||||||
|
|
@ -311,7 +315,7 @@ char *ReadNtk (char *fname, int *fnum)
|
||||||
do {
|
do {
|
||||||
ob = ob->next;
|
ob = ob->next;
|
||||||
} while ((ob != NULL) && !IsPort(ob)) ;
|
} while ((ob != NULL) && !IsPort(ob)) ;
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -322,12 +326,12 @@ char *ReadNtk (char *fname, int *fnum)
|
||||||
if (LastCellRead == NULL)
|
if (LastCellRead == NULL)
|
||||||
LastCellRead = CurrentCell->name;
|
LastCellRead = CurrentCell->name;
|
||||||
}
|
}
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
SkipTok(); /* skip the transistor size */
|
SkipTok(NULL); /* skip the transistor size */
|
||||||
strcpy(name, nexttok);
|
strcpy(name, nexttok);
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
strcpy(model, nexttok);
|
strcpy(model, nexttok);
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
strcpy(instancename, nexttok);
|
strcpy(instancename, nexttok);
|
||||||
N(fname, NULL, name, model, instancename);
|
N(fname, NULL, name, model, instancename);
|
||||||
SKIPTO(";");
|
SKIPTO(";");
|
||||||
|
|
@ -339,12 +343,12 @@ char *ReadNtk (char *fname, int *fnum)
|
||||||
if (LastCellRead == NULL)
|
if (LastCellRead == NULL)
|
||||||
LastCellRead = CurrentCell->name;
|
LastCellRead = CurrentCell->name;
|
||||||
}
|
}
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
SkipTok(); /* skip the transistor size */
|
SkipTok(NULL); /* skip the transistor size */
|
||||||
strcpy(name, nexttok);
|
strcpy(name, nexttok);
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
strcpy(model, nexttok);
|
strcpy(model, nexttok);
|
||||||
SkipTok();
|
SkipTok(NULL);
|
||||||
strcpy(instancename, nexttok);
|
strcpy(instancename, nexttok);
|
||||||
P(fname, NULL, name, model, instancename);
|
P(fname, NULL, name, model, instancename);
|
||||||
SKIPTO(";");
|
SKIPTO(";");
|
||||||
|
|
|
||||||
296
base/objlist.c
296
base/objlist.c
|
|
@ -22,6 +22,7 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <limits.h>
|
||||||
#ifdef IBMPC
|
#ifdef IBMPC
|
||||||
#include <alloc.h>
|
#include <alloc.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
@ -31,13 +32,13 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "netgen.h"
|
#include "netgen.h"
|
||||||
#include "hash.h"
|
|
||||||
#include "objlist.h"
|
#include "objlist.h"
|
||||||
#include "regexp.h"
|
#include "regexp.h"
|
||||||
#include "dbug.h"
|
#include "dbug.h"
|
||||||
#include "print.h"
|
#include "print.h"
|
||||||
#include "netfile.h"
|
#include "netfile.h"
|
||||||
#include "netcmp.h"
|
#include "netcmp.h"
|
||||||
|
#include "hash.h"
|
||||||
|
|
||||||
#ifdef TCL_NETGEN
|
#ifdef TCL_NETGEN
|
||||||
extern Tcl_Interp *netgeninterp;
|
extern Tcl_Interp *netgeninterp;
|
||||||
|
|
@ -129,6 +130,7 @@ struct property *NewProperty(void)
|
||||||
|
|
||||||
kl = (struct property *)CALLOC(1,sizeof(struct property));
|
kl = (struct property *)CALLOC(1,sizeof(struct property));
|
||||||
if (kl == NULL) Fprintf(stderr,"NewProperty: Core allocation error\n");
|
if (kl == NULL) Fprintf(stderr,"NewProperty: Core allocation error\n");
|
||||||
|
kl->pin = (char *)NULL;
|
||||||
return (kl);
|
return (kl);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -184,16 +186,72 @@ int match(char *st1, char *st2)
|
||||||
|
|
||||||
/* Case-insensitive matching */
|
/* Case-insensitive matching */
|
||||||
|
|
||||||
|
/* For case-insensitivity, the alphabet is lower-cased, but */
|
||||||
|
/* also all common vector delimiters are cast to the same */
|
||||||
|
/* character so that different vector notations will match. */
|
||||||
|
|
||||||
|
static char to_lower[256] = {
|
||||||
|
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
|
||||||
|
10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||||
|
20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
|
||||||
|
30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
|
||||||
|
40, 41, 42, 43, 44, 45, 46, 47,
|
||||||
|
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
||||||
|
':', ';', '<', '=', '>', '?', '@',
|
||||||
|
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
|
||||||
|
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||||
|
'<', '\\', '>', '^', '_', '`',
|
||||||
|
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
|
||||||
|
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||||
|
'<', '|', '>', '~', 127,
|
||||||
|
0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
|
||||||
|
10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||||
|
20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
|
||||||
|
30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
|
||||||
|
40, 41, 42, 43, 44, 45, 46, 47,
|
||||||
|
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
|
||||||
|
':', ';', '<', '=', '>', '?', '@',
|
||||||
|
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
|
||||||
|
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||||
|
'<', '\\', '>', '^', '_', '`',
|
||||||
|
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
|
||||||
|
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
|
||||||
|
'<', '|', '>', '~', 127
|
||||||
|
};
|
||||||
|
|
||||||
int matchnocase(char *st1, char *st2)
|
int matchnocase(char *st1, char *st2)
|
||||||
{
|
{
|
||||||
char *sp1 = st1;
|
char *sp1 = st1;
|
||||||
char *sp2 = st2;
|
char *sp2 = st2;
|
||||||
|
char v1 = FALSE, v2 = FALSE;
|
||||||
|
|
||||||
|
/* In case of a property that does not exist in one netlist, matchnocase()
|
||||||
|
* may be passed a null value, so return 0 to indicate a non-match.
|
||||||
|
* *Both* values null will also be treated as a mismatch (debatable
|
||||||
|
* behavior).
|
||||||
|
*/
|
||||||
|
if (!sp1 || !sp2) return 0;
|
||||||
|
|
||||||
|
/* Verilog back-slash escaped names should match an equivalent non-
|
||||||
|
* back-slashed name. (NOTE: This behavior needs to be added to match().)
|
||||||
|
*/
|
||||||
|
if ((*sp1 == '\\') && (*sp2 != '\\')) {
|
||||||
|
v1 = TRUE;
|
||||||
|
sp1++;
|
||||||
|
}
|
||||||
|
if ((*sp2 == '\\') && (*sp1 != '\\')) {
|
||||||
|
v2 = TRUE;
|
||||||
|
sp2++;
|
||||||
|
}
|
||||||
|
|
||||||
while (*sp1 != '\0' && *sp2 != '\0') {
|
while (*sp1 != '\0' && *sp2 != '\0') {
|
||||||
if (tolower(*sp1) != tolower(*sp2)) break;
|
if (to_lower[*sp1] != to_lower[*sp2]) break;
|
||||||
sp1++;
|
sp1++;
|
||||||
sp2++;
|
sp2++;
|
||||||
}
|
}
|
||||||
|
if (v1 && (*sp1 == ' ')) sp1++;
|
||||||
|
if (v2 && (*sp2 == ' ')) sp2++;
|
||||||
|
|
||||||
if ((*sp1 != '\0') || (*sp2 != '\0')) return 0;
|
if ((*sp1 != '\0') || (*sp2 != '\0')) return 0;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
@ -216,7 +274,7 @@ int matchfilenocase(char *st1, char *st2, int f1, int f2)
|
||||||
|
|
||||||
if (f1 != f2) return 0;
|
if (f1 != f2) return 0;
|
||||||
while (*sp1 != '\0' && *sp2 != '\0') {
|
while (*sp1 != '\0' && *sp2 != '\0') {
|
||||||
if (tolower(*sp1) != tolower(*sp2)) break;
|
if (to_lower[*sp1] != to_lower[*sp2]) break;
|
||||||
sp1++;
|
sp1++;
|
||||||
sp2++;
|
sp2++;
|
||||||
}
|
}
|
||||||
|
|
@ -224,6 +282,33 @@ int matchfilenocase(char *st1, char *st2, int f1, int f2)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Delimiter matching---Find an opening delimiter in a string. */
|
||||||
|
/* Return the position of the first opening delimeter in the string, */
|
||||||
|
/* like strchr(). Place the actual delimeter character in *delim. */
|
||||||
|
|
||||||
|
char *get_array_delimiter(char *name, char *delim)
|
||||||
|
{
|
||||||
|
char *stest = name;
|
||||||
|
|
||||||
|
while (*stest != '\0')
|
||||||
|
{
|
||||||
|
if (to_lower[*stest] == '<') {
|
||||||
|
*delim = *stest;
|
||||||
|
return stest;
|
||||||
|
}
|
||||||
|
stest++;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Delimiter parsing---Check if a character is an opening array delimiter. */
|
||||||
|
/* Return TRUE if the character is an opening delimiter, FALSE if not. */
|
||||||
|
|
||||||
|
int is_delimiter(char testc)
|
||||||
|
{
|
||||||
|
return (to_lower[testc] == '<') ? TRUE : FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef HAVE_MALLINFO
|
#ifdef HAVE_MALLINFO
|
||||||
void PrintMemoryStats(void)
|
void PrintMemoryStats(void)
|
||||||
{
|
{
|
||||||
|
|
@ -255,8 +340,9 @@ static struct hashdict cell_dict;
|
||||||
|
|
||||||
void InitCellHashTable(void)
|
void InitCellHashTable(void)
|
||||||
{
|
{
|
||||||
hashfunc = hash;
|
hashfunc = hashcase;
|
||||||
matchfunc = match;
|
matchfunc = NULL;
|
||||||
|
matchintfunc = matchfile;
|
||||||
InitializeHashTable(&cell_dict, CELLHASHSIZE);
|
InitializeHashTable(&cell_dict, CELLHASHSIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -348,7 +434,7 @@ int removeshorted(struct hashlist *p, int file)
|
||||||
|
|
||||||
ptr = (struct nlist *)(p->ptr);
|
ptr = (struct nlist *)(p->ptr);
|
||||||
|
|
||||||
if ((file != -1) && (ptr->file != file)) return;
|
if ((file != -1) && (ptr->file != file)) return 0;
|
||||||
|
|
||||||
lob = NULL;
|
lob = NULL;
|
||||||
for (ob = ptr->cell; ob != NULL;) {
|
for (ob = ptr->cell; ob != NULL;) {
|
||||||
|
|
@ -390,6 +476,7 @@ int removeshorted(struct hashlist *p, int file)
|
||||||
ob = nob;
|
ob = nob;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Remove shorted instances of class "class" from the database */
|
/* Remove shorted instances of class "class" from the database */
|
||||||
|
|
@ -405,14 +492,31 @@ void RemoveShorted(char *class, int file)
|
||||||
RecurseCellFileHashTable(removeshorted, file);
|
RecurseCellFileHashTable(removeshorted, file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Remove instances of a deleted class from the database. */
|
||||||
|
/* NOTE: This treats deleted classes as not existing, so it */
|
||||||
|
/* needs to take care of disconnected ports in the same manner */
|
||||||
|
/* as flattenInstancesOf() in disconnecting the port of a */
|
||||||
|
/* parent cell if it connected to nothing other than the */
|
||||||
|
/* deleted instance. */
|
||||||
|
|
||||||
int deleteclass(struct hashlist *p, int file)
|
int deleteclass(struct hashlist *p, int file)
|
||||||
{
|
{
|
||||||
struct nlist *ptr;
|
struct nlist *ptr;
|
||||||
struct objlist *ob, *lob, *nob;
|
struct objlist *ob, *lob, *nob, *portnode;
|
||||||
|
unsigned char *checknodes;
|
||||||
|
int i;
|
||||||
|
|
||||||
ptr = (struct nlist *)(p->ptr);
|
ptr = (struct nlist *)(p->ptr);
|
||||||
|
|
||||||
if ((file != -1) && (ptr->file != file)) return;
|
if ((file != -1) && (ptr->file != file)) return 0;
|
||||||
|
|
||||||
|
/* Note: This could be made faster by enumerating all times each
|
||||||
|
* node is used during the full pass, then subtracting each time
|
||||||
|
* the node is deleted in a child, then disconnecting all nodes
|
||||||
|
* that ended up with a zero count.
|
||||||
|
*/
|
||||||
|
checknodes = (unsigned char *)CALLOC(ptr->nodename_cache_maxnodenum + 1,
|
||||||
|
sizeof(unsigned char));
|
||||||
|
|
||||||
lob = NULL;
|
lob = NULL;
|
||||||
for (ob = ptr->cell; ob != NULL;) {
|
for (ob = ptr->cell; ob != NULL;) {
|
||||||
|
|
@ -421,6 +525,8 @@ int deleteclass(struct hashlist *p, int file)
|
||||||
if ((*matchfunc)(ob->model.class, OldCell->name)) {
|
if ((*matchfunc)(ob->model.class, OldCell->name)) {
|
||||||
HashDelete(ob->instance.name, &(ptr->instdict));
|
HashDelete(ob->instance.name, &(ptr->instdict));
|
||||||
while (1) {
|
while (1) {
|
||||||
|
if (ob->type >= FIRSTPIN)
|
||||||
|
checknodes[ob->node] = (unsigned char)1;
|
||||||
FreeObjectAndHash(ob, ptr);
|
FreeObjectAndHash(ob, ptr);
|
||||||
ob = nob;
|
ob = nob;
|
||||||
if (ob == NULL) break;
|
if (ob == NULL) break;
|
||||||
|
|
@ -442,6 +548,26 @@ int deleteclass(struct hashlist *p, int file)
|
||||||
ob = nob;
|
ob = nob;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (i = 0; i <= ptr->nodename_cache_maxnodenum; i++) {
|
||||||
|
if (checknodes[i] != 0) {
|
||||||
|
portnode = NULL;
|
||||||
|
for (ob = ptr->cell; ob != NULL; ob = ob->next) {
|
||||||
|
if ((ob->type != PORT) && (portnode == NULL))
|
||||||
|
break;
|
||||||
|
else if ((ob->type == PORT) && (ob->node == i))
|
||||||
|
portnode = ob;
|
||||||
|
else if ((ob->type >= FIRSTPIN) && (ob->node == i))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if ((ob == NULL) && (portnode != NULL)) {
|
||||||
|
/* Port became disconnected when child was deleted */
|
||||||
|
portnode->node = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FREE(checknodes);
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Remove all instances of class "class" from the database */
|
/* Remove all instances of class "class" from the database */
|
||||||
|
|
@ -469,7 +595,7 @@ int renameinstances(struct hashlist *p, int file)
|
||||||
|
|
||||||
ptr = (struct nlist *)(p->ptr);
|
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) {
|
for (ob = ptr->cell; ob != NULL; ob = ob->next) {
|
||||||
if ((ob->type >= FIRSTPIN) && (ob->model.class != NULL)) {
|
if ((ob->type >= FIRSTPIN) && (ob->model.class != NULL)) {
|
||||||
|
|
@ -479,6 +605,7 @@ int renameinstances(struct hashlist *p, int file)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void InstanceRename(char *from, char *to, int file)
|
void InstanceRename(char *from, char *to, int file)
|
||||||
|
|
@ -501,9 +628,10 @@ int freeprop(struct hashlist *p)
|
||||||
struct property *prop;
|
struct property *prop;
|
||||||
|
|
||||||
prop = (struct property *)(p->ptr);
|
prop = (struct property *)(p->ptr);
|
||||||
if (prop->type == PROP_STRING)
|
if (prop->type == PROP_STRING) {
|
||||||
if (prop->pdefault.string != NULL)
|
if (prop->pdefault.string != NULL)
|
||||||
FREE(prop->pdefault.string);
|
FREE(prop->pdefault.string);
|
||||||
|
}
|
||||||
else if (prop->type == PROP_EXPRESSION) {
|
else if (prop->type == PROP_EXPRESSION) {
|
||||||
struct tokstack *stackptr, *nptr;
|
struct tokstack *stackptr, *nptr;
|
||||||
stackptr = prop->pdefault.stack;
|
stackptr = prop->pdefault.stack;
|
||||||
|
|
@ -522,58 +650,65 @@ int freeprop(struct hashlist *p)
|
||||||
|
|
||||||
void CellDelete(char *name, int fnum)
|
void CellDelete(char *name, int fnum)
|
||||||
{
|
{
|
||||||
/* delete all the contents of cell 'name', and remove 'name' from
|
/* delete all the contents of cell 'name', and remove 'name' from
|
||||||
the cell hash table. NOTE: this procedure does not care or check
|
the cell hash table. NOTE: this procedure does not care or check
|
||||||
if 'name' has been instanced anywhere. It is assumed that if this
|
if 'name' has been instanced anywhere. It is assumed that if this
|
||||||
is the case, the user will (quickly) define a new cell of that name.
|
is the case, the user will (quickly) define a new cell of that name.
|
||||||
*/
|
*/
|
||||||
struct objlist *ob, *obnext;
|
struct objlist *ob, *obnext;
|
||||||
struct nlist *tp;
|
struct nlist *tp;
|
||||||
|
|
||||||
tp = LookupCellFile(name, fnum);
|
tp = LookupCellFile(name, fnum);
|
||||||
if (tp == NULL) {
|
if (tp == NULL) {
|
||||||
Printf ("No cell '%s' found.\n", name);
|
Printf ("No cell '%s' found.\n", name);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
HashIntDelete(name, fnum, &cell_dict);
|
HashIntDelete(name, fnum, &cell_dict);
|
||||||
/* now make sure that we free all the fields of the nlist struct */
|
/* now make sure that we free all the fields of the nlist struct */
|
||||||
if (tp->name != NULL) FREE(tp->name);
|
if (tp->name != NULL) FREE(tp->name);
|
||||||
HashKill(&(tp->objdict));
|
HashKill(&(tp->objdict));
|
||||||
HashKill(&(tp->instdict));
|
HashKill(&(tp->instdict));
|
||||||
RecurseHashTable(&(tp->propdict), freeprop);
|
RecurseHashTable(&(tp->propdict), freeprop);
|
||||||
HashKill(&(tp->propdict));
|
HashKill(&(tp->propdict));
|
||||||
FreeNodeNames(tp);
|
FreeNodeNames(tp);
|
||||||
ob = tp->cell;
|
ob = tp->cell;
|
||||||
while (ob != NULL) {
|
while (ob != NULL) {
|
||||||
obnext = ob->next;
|
obnext = ob->next;
|
||||||
FreeObject (ob);
|
FreeObject (ob);
|
||||||
ob = obnext;
|
ob = obnext;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int PrintCellHashTableElement(struct hashlist *p)
|
static int PrintCellHashTableElement(struct hashlist *p)
|
||||||
{
|
{
|
||||||
struct nlist *ptr;
|
struct nlist *ptr;
|
||||||
|
|
||||||
ptr = (struct nlist *)(p->ptr);
|
ptr = (struct nlist *)(p->ptr);
|
||||||
if ((TopFile >= 0) && (ptr->file != TopFile)) return 1;
|
if ((TopFile >= 0) && (ptr->file != TopFile)) return 1;
|
||||||
|
|
||||||
if (ptr->class != CLASS_SUBCKT) {
|
if ((ptr->class != CLASS_SUBCKT) && (ptr->class != CLASS_MODULE)) {
|
||||||
/* only print primitive cells if Debug is enabled */
|
/* only print primitive cells if Debug is enabled */
|
||||||
if (Debug == 1) Printf("Cell: %s (instanced %d times); Primitive\n",
|
if (Debug == 1) Printf("Cell: %s (instanced %d times); Primitive\n",
|
||||||
ptr->name, ptr->number);
|
ptr->name, ptr->number);
|
||||||
}
|
else if (Debug == 3) { /* list */
|
||||||
else if (Debug == 2) { /* list only */
|
|
||||||
#ifdef TCL_NETGEN
|
#ifdef TCL_NETGEN
|
||||||
Tcl_AppendElement(netgeninterp, ptr->name);
|
Tcl_AppendElement(netgeninterp, ptr->name);
|
||||||
#else
|
#else
|
||||||
Printf("%s ", ptr->name);
|
Printf("%s ", ptr->name);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
else
|
}
|
||||||
Printf("Cell: %s (instanced %d times)\n",ptr->name,ptr->number);
|
else if ((Debug == 2) || (Debug == 3)) { /* list only */
|
||||||
return(1);
|
#ifdef TCL_NETGEN
|
||||||
|
Tcl_AppendElement(netgeninterp, ptr->name);
|
||||||
|
#else
|
||||||
|
Printf("%s ", ptr->name);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Printf("Cell: %s (instanced %d times)\n", ptr->name, ptr->number);
|
||||||
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Print the contents of the cell hash table. */
|
/* Print the contents of the cell hash table. */
|
||||||
|
|
@ -582,65 +717,65 @@ static int PrintCellHashTableElement(struct hashlist *p)
|
||||||
|
|
||||||
void PrintCellHashTable(int full, int filenum)
|
void PrintCellHashTable(int full, int filenum)
|
||||||
{
|
{
|
||||||
int total, bins;
|
int total, bins;
|
||||||
int OldDebug;
|
int OldDebug;
|
||||||
|
|
||||||
if ((filenum == -1) && (Circuit1 != NULL) && (Circuit2 != NULL)) {
|
if ((filenum == -1) && (Circuit1 != NULL) && (Circuit2 != NULL)) {
|
||||||
PrintCellHashTable(full, Circuit1->file);
|
PrintCellHashTable(full, Circuit1->file);
|
||||||
PrintCellHashTable(full, Circuit2->file);
|
PrintCellHashTable(full, Circuit2->file);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
TopFile = filenum;
|
TopFile = filenum;
|
||||||
|
|
||||||
bins = RecurseHashTable(&cell_dict, CountHashTableBinsUsed);
|
bins = RecurseHashTable(&cell_dict, CountHashTableBinsUsed);
|
||||||
total = RecurseHashTable(&cell_dict, CountHashTableEntries);
|
total = RecurseHashTable(&cell_dict, CountHashTableEntries);
|
||||||
if (full != 2)
|
if (full < 2)
|
||||||
Printf("Hash table: %d of %d bins used; %d cells total (%.2f per bin)\n",
|
Printf("Hash table: %d of %d bins used; %d cells total (%.2f per bin)\n",
|
||||||
bins, CELLHASHSIZE, total, (bins == 0) ? 0 :
|
bins, CELLHASHSIZE, total, (bins == 0) ? 0 :
|
||||||
(float)((float)total / (float)bins));
|
(float)((float)total / (float)bins));
|
||||||
|
|
||||||
OldDebug = Debug;
|
OldDebug = Debug;
|
||||||
Debug = full;
|
Debug = full;
|
||||||
RecurseHashTable(&cell_dict, PrintCellHashTableElement);
|
RecurseHashTable(&cell_dict, PrintCellHashTableElement);
|
||||||
Debug = OldDebug;
|
Debug = OldDebug;
|
||||||
#ifndef TCL_NETGEN
|
#ifndef TCL_NETGEN
|
||||||
if (full == 2) Printf("\n");
|
if (full >= 2) Printf("\n");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
struct nlist *FirstCell(void)
|
struct nlist *FirstCell(void)
|
||||||
{
|
{
|
||||||
return((struct nlist *)HashFirst(&cell_dict));
|
return((struct nlist *)HashFirst(&cell_dict));
|
||||||
}
|
}
|
||||||
|
|
||||||
struct nlist *NextCell(void)
|
struct nlist *NextCell(void)
|
||||||
{
|
{
|
||||||
return((struct nlist *)HashNext(&cell_dict));
|
return((struct nlist *)HashNext(&cell_dict));
|
||||||
}
|
}
|
||||||
|
|
||||||
static int ClearDumpedElement(struct hashlist *np)
|
static int ClearDumpedElement(struct hashlist *np)
|
||||||
{
|
{
|
||||||
struct nlist *p;
|
struct nlist *p;
|
||||||
|
|
||||||
p = (struct nlist *)(np->ptr);
|
p = (struct nlist *)(np->ptr);
|
||||||
p->dumped = 0;
|
p->dumped = 0;
|
||||||
return(1);
|
return(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClearDumpedList(void)
|
void ClearDumpedList(void)
|
||||||
{
|
{
|
||||||
RecurseHashTable(&cell_dict, ClearDumpedElement);
|
RecurseHashTable(&cell_dict, ClearDumpedElement);
|
||||||
}
|
}
|
||||||
|
|
||||||
int RecurseCellHashTable(int (*foo)(struct hashlist *np))
|
int RecurseCellHashTable(int (*foo)(struct hashlist *np))
|
||||||
{
|
{
|
||||||
return RecurseHashTable(&cell_dict, foo);
|
return RecurseHashTable(&cell_dict, foo);
|
||||||
}
|
}
|
||||||
|
|
||||||
int RecurseCellFileHashTable(int (*foo)(struct hashlist *, int), int value)
|
int RecurseCellFileHashTable(int (*foo)(struct hashlist *, int), int value)
|
||||||
{
|
{
|
||||||
return RecurseHashTableValue(&cell_dict, foo, value);
|
return RecurseHashTableValue(&cell_dict, foo, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Yet another version, passing one parameter that is a pointer */
|
/* Yet another version, passing one parameter that is a pointer */
|
||||||
|
|
@ -648,14 +783,14 @@ int RecurseCellFileHashTable(int (*foo)(struct hashlist *, int), int value)
|
||||||
struct nlist *RecurseCellHashTable2(struct nlist *(*foo)(struct hashlist *,
|
struct nlist *RecurseCellHashTable2(struct nlist *(*foo)(struct hashlist *,
|
||||||
void *), void *pointer)
|
void *), void *pointer)
|
||||||
{
|
{
|
||||||
return RecurseHashTablePointer(&cell_dict, foo, pointer);
|
return RecurseHashTablePointer(&cell_dict, foo, pointer);
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************** WILD-CARD STUFF *******************************/
|
/************************** WILD-CARD STUFF *******************************/
|
||||||
|
|
||||||
char *FixTemplate(char *t)
|
char *FixTemplate(char *t)
|
||||||
{
|
{
|
||||||
char buffer[200];
|
char buffer[MAX_STR_LEN];
|
||||||
char *rstr;
|
char *rstr;
|
||||||
int i,j;
|
int i,j;
|
||||||
int InsideBrace;
|
int InsideBrace;
|
||||||
|
|
@ -934,6 +1069,7 @@ struct objlist *CopyObjList(struct objlist *oldlist, unsigned char doforall)
|
||||||
newob->model.class = NULL;
|
newob->model.class = NULL;
|
||||||
else
|
else
|
||||||
newob->model.class = strsave(tmp->model.class);
|
newob->model.class = strsave(tmp->model.class);
|
||||||
|
newob->flags = tmp->flags;
|
||||||
newob->instance.name = (tmp->instance.name) ?
|
newob->instance.name = (tmp->instance.name) ?
|
||||||
strsave(tmp->instance.name) : NULL;
|
strsave(tmp->instance.name) : NULL;
|
||||||
}
|
}
|
||||||
|
|
@ -1071,13 +1207,17 @@ void FreeObjectAndHash(struct objlist *ob, struct nlist *ptr)
|
||||||
|
|
||||||
/*************** GENERAL UTILITIES ****************************/
|
/*************** GENERAL UTILITIES ****************************/
|
||||||
|
|
||||||
int NumberOfPorts(char *cellname)
|
int NumberOfPorts(char *cellname, int file)
|
||||||
{
|
{
|
||||||
struct nlist *tp;
|
struct nlist *tp;
|
||||||
struct objlist *ob;
|
struct objlist *ob;
|
||||||
int ports;
|
int ports;
|
||||||
|
|
||||||
tp = LookupCell(cellname);
|
if (file == -1)
|
||||||
|
tp = LookupCell(cellname);
|
||||||
|
else
|
||||||
|
tp = LookupCellFile(cellname, file);
|
||||||
|
|
||||||
if (tp == NULL) return(0);
|
if (tp == NULL) return(0);
|
||||||
ports = 0;
|
ports = 0;
|
||||||
for (ob = tp->cell; ob != NULL; ob = ob->next)
|
for (ob = tp->cell; ob != NULL; ob = ob->next)
|
||||||
|
|
@ -1161,7 +1301,7 @@ static char *OldNodeName(struct nlist *tp, int node)
|
||||||
struct objlist *firstuniqueglobal;
|
struct objlist *firstuniqueglobal;
|
||||||
struct objlist *firstglobal;
|
struct objlist *firstglobal;
|
||||||
struct objlist *firstpin;
|
struct objlist *firstpin;
|
||||||
static char StrBuffer[100];
|
static char StrBuffer[MAX_STR_LEN];
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/* make second pass, looking for ports */
|
/* make second pass, looking for ports */
|
||||||
|
|
|
||||||
|
|
@ -28,6 +28,8 @@
|
||||||
|
|
||||||
#define PROXY (0) /* Used in model.port record of ports */
|
#define PROXY (0) /* Used in model.port record of ports */
|
||||||
|
|
||||||
|
#define NO_CONNECT 1 /* Use in object list to flag an isolated net */
|
||||||
|
|
||||||
/* Lists of device properties. Order is defined at the time of */
|
/* Lists of device properties. Order is defined at the time of */
|
||||||
/* the cell definition; values are sorted at the time instances */
|
/* the cell definition; values are sorted at the time instances */
|
||||||
/* are read. */
|
/* are read. */
|
||||||
|
|
@ -103,22 +105,37 @@ struct valuelist {
|
||||||
|
|
||||||
/* Part 3: Keys & Defaults (kept in the cell record as a hash table) */
|
/* 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_NONE 0x00 /* Property does not change when devices merge */
|
||||||
#define MERGE_ADD 1 /* Properties sum with device merge */
|
|
||||||
#define MERGE_ADD_CRIT 2 /* Properties sum with device merge */
|
#define MERGE_P_ADD 0x01 /* Properties sum with device parallel merge */
|
||||||
#define MERGE_PAR 3 /* Properties add in parallel with device merge */
|
#define MERGE_P_PAR 0x02 /* Properties add in parallel with parallel merge */
|
||||||
#define MERGE_PAR_CRIT 4 /* Properties add in parallel with device merge */
|
#define MERGE_P_CRIT 0x04 /* This property enables parallel merging */
|
||||||
|
#define MERGE_P_XCRIT 0x08 /* Old "critical" behavior (deprecated) */
|
||||||
|
|
||||||
|
#define MERGE_S_ADD 0x10 /* Properties sum with device series merge */
|
||||||
|
#define MERGE_S_PAR 0x20 /* Properties add in parallel with series merge */
|
||||||
|
#define MERGE_S_CRIT 0x40 /* This property enables series merging */
|
||||||
|
#define MERGE_S_XCRIT 0x80 /* Old "critical" behavior (deprecated) */
|
||||||
|
|
||||||
|
#define MERGE_P_MASK (MERGE_P_ADD | MERGE_P_PAR | MERGE_P_CRIT | MERGE_P_XCRIT)
|
||||||
|
#define MERGE_S_MASK (MERGE_S_ADD | MERGE_S_PAR | MERGE_S_CRIT | MERGE_S_XCRIT)
|
||||||
|
#define MERGE_ALL_MASK (MERGE_P_MASK | MERGE_S_MASK)
|
||||||
|
|
||||||
|
/* Although the above are flags, "ADD" and "PAR" are mutually exclusive. */
|
||||||
|
|
||||||
/* Note: A "critical" merge means that the property causes the number of */
|
/* Note: A "critical" merge means that the property causes the number of */
|
||||||
/* devices to change. e.g., transistor width is critical; transistor drain */
|
/* 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.*/
|
/* 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. */
|
/* More than one property can be critical. e.g., width and number of fingers. */
|
||||||
|
/* Also it is possible for a property (e.g., "value") to be critical for both */
|
||||||
|
/* series and parallel merging. */
|
||||||
|
|
||||||
struct property {
|
struct property {
|
||||||
char *key; /* name of the property */
|
char *key; /* name of the property */
|
||||||
unsigned char idx; /* index into valuelist */
|
unsigned char idx; /* index into valuelist */
|
||||||
unsigned char type; /* string, integer, double, value, expression */
|
unsigned char type; /* string, integer, double, value, expression */
|
||||||
unsigned char merge; /* how property changes when devices are merged */
|
unsigned char merge; /* how property changes when devices are merged */
|
||||||
|
char *pin; /* associated pin (or NULL if not associated) */
|
||||||
union {
|
union {
|
||||||
char *string;
|
char *string;
|
||||||
double dval;
|
double dval;
|
||||||
|
|
@ -148,6 +165,7 @@ struct objlist {
|
||||||
/* (string) value of property for properties */
|
/* (string) value of property for properties */
|
||||||
struct valuelist *props; /* Property record */
|
struct valuelist *props; /* Property record */
|
||||||
} instance;
|
} instance;
|
||||||
|
unsigned char flags; /* Used by NODE type to flag isolated net */
|
||||||
int node; /* the electrical node number of the port/node/pin */
|
int node; /* the electrical node number of the port/node/pin */
|
||||||
struct objlist *next;
|
struct objlist *next;
|
||||||
};
|
};
|
||||||
|
|
@ -178,9 +196,8 @@ struct Permutation {
|
||||||
struct Permutation *next;
|
struct Permutation *next;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define OBJHASHSIZE 997 /* the size of the object and instance hash lists */
|
#define OBJHASHSIZE 42073 /* the size of the object and instance hash lists */
|
||||||
/* prime numbers are good choices as hash sizes */
|
/* prime numbers are good choices as hash sizes */
|
||||||
/* 101 is a good number for IBMPC */
|
|
||||||
|
|
||||||
/* cell definition for hash table */
|
/* cell definition for hash table */
|
||||||
/* NOTE: "file" must come first for the hash matching by name and file */
|
/* NOTE: "file" must come first for the hash matching by name and file */
|
||||||
|
|
@ -190,7 +207,7 @@ struct nlist {
|
||||||
char *name;
|
char *name;
|
||||||
int number; /* number of instances defined */
|
int number; /* number of instances defined */
|
||||||
int dumped; /* instance count, and general-purpose marker */
|
int dumped; /* instance count, and general-purpose marker */
|
||||||
unsigned char flags;
|
unsigned short flags;
|
||||||
unsigned char class;
|
unsigned char class;
|
||||||
unsigned long classhash; /* randomized hash value for cell class */
|
unsigned long classhash; /* randomized hash value for cell class */
|
||||||
struct Permutation *permutes; /* list of permuting pins */
|
struct Permutation *permutes; /* list of permuting pins */
|
||||||
|
|
@ -206,17 +223,18 @@ struct nlist {
|
||||||
|
|
||||||
/* Defined nlist structure flags */
|
/* Defined nlist structure flags */
|
||||||
|
|
||||||
#define CELL_MATCHED 0x01 /* cell matched to another */
|
#define CELL_MATCHED 0x001 /* cell matched to another */
|
||||||
#define CELL_NOCASE 0x02 /* cell is case-insensitive (e.g., SPICE) */
|
#define CELL_NOCASE 0x002 /* cell is case-insensitive (e.g., SPICE) */
|
||||||
#define CELL_TOP 0x04 /* cell is a top-level cell */
|
#define CELL_TOP 0x004 /* cell is a top-level cell */
|
||||||
#define CELL_PLACEHOLDER 0x08 /* cell is a placeholder cell */
|
#define CELL_PLACEHOLDER 0x008 /* cell is a placeholder cell */
|
||||||
#define CELL_PROPSMATCHED 0x10 /* properties matched to matching cell */
|
#define CELL_PROPSMATCHED 0x010 /* properties matched to matching cell */
|
||||||
#define CELL_DUPLICATE 0x20 /* cell has a duplicate */
|
#define CELL_DUPLICATE 0x020 /* cell has a duplicate */
|
||||||
|
#define CELL_VERILOG 0x040 /* cell is verilog module */
|
||||||
|
|
||||||
/* Flags for combination allowances */
|
/* Flags for combination allowances and prohibitions */
|
||||||
|
|
||||||
#define COMB_SERIAL 0x20
|
#define COMB_SERIES 0x100
|
||||||
#define COMB_PARALLEL 0x40
|
#define COMB_NO_PARALLEL 0x200
|
||||||
|
|
||||||
extern struct nlist *CurrentCell;
|
extern struct nlist *CurrentCell;
|
||||||
extern struct objlist *CurrentTail;
|
extern struct objlist *CurrentTail;
|
||||||
|
|
@ -228,7 +246,7 @@ extern void FreeObjectAndHash(struct objlist *ob, struct nlist *ptr);
|
||||||
extern void FreePorts(char *cellname);
|
extern void FreePorts(char *cellname);
|
||||||
extern struct IgnoreList *ClassIgnore;
|
extern struct IgnoreList *ClassIgnore;
|
||||||
|
|
||||||
extern int NumberOfPorts(char *cellname);
|
extern int NumberOfPorts(char *cellname, int file);
|
||||||
extern struct objlist *InstanceNumber(struct nlist *tp, int inst);
|
extern struct objlist *InstanceNumber(struct nlist *tp, int inst);
|
||||||
|
|
||||||
extern struct objlist *List(char *list_template);
|
extern struct objlist *List(char *list_template);
|
||||||
|
|
@ -291,11 +309,26 @@ extern int match(char *, char *);
|
||||||
extern int matchnocase(char *, char *);
|
extern int matchnocase(char *, char *);
|
||||||
extern int matchfile(char *, char *, int, int);
|
extern int matchfile(char *, char *, int, int);
|
||||||
extern int matchfilenocase(char *, char *, int, int);
|
extern int matchfilenocase(char *, char *, int, int);
|
||||||
|
extern int is_delimiter(char);
|
||||||
|
extern char *get_array_delimiter(char *, char *);
|
||||||
|
|
||||||
extern void GarbageCollect(void);
|
extern void GarbageCollect(void);
|
||||||
extern void InitGarbageCollection(void);
|
extern void InitGarbageCollection(void);
|
||||||
extern void AddToGarbageList(struct objlist *head);
|
extern void AddToGarbageList(struct objlist *head);
|
||||||
|
|
||||||
|
extern void DeleteProperties(struct keyvalue **topptr);
|
||||||
|
extern void AddProperty(struct keyvalue **topptr, char *key, char *value);
|
||||||
|
extern void AddScaledProperty(struct keyvalue **topptr, char *key, char *value, double scale);
|
||||||
|
extern void DeleteProperties(struct keyvalue **topptr);
|
||||||
|
extern struct objlist *LinkProperties(char *model, struct keyvalue *topptr);
|
||||||
|
|
||||||
|
extern void ClassDelete(char *class, int file);
|
||||||
|
extern void RemoveShorted(char *class, int file);
|
||||||
|
extern void CellRehash(char *name, char *newname, int file);
|
||||||
|
|
||||||
|
/* defined in netgen.c */
|
||||||
|
extern int ConvertStringToInteger(char *string, int *ival);
|
||||||
|
|
||||||
#ifdef HAVE_MALLINFO
|
#ifdef HAVE_MALLINFO
|
||||||
void PrintMemoryStats(void);
|
void PrintMemoryStats(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
||||||
20
base/place.c
20
base/place.c
|
|
@ -511,8 +511,8 @@ int OpenEmbeddingFile(char *cellname, char *filename)
|
||||||
/* returns 1 if OK */
|
/* returns 1 if OK */
|
||||||
{
|
{
|
||||||
struct nlist *tp;
|
struct nlist *tp;
|
||||||
char outfilename[200];
|
char outfilename[MAX_STR_LEN];
|
||||||
char logfilename[200];
|
char logfilename[MAX_STR_LEN];
|
||||||
|
|
||||||
tp = LookupCell(cellname);
|
tp = LookupCell(cellname);
|
||||||
if (tp == NULL) {
|
if (tp == NULL) {
|
||||||
|
|
@ -783,7 +783,7 @@ void SetupArray(char *prompt1, char *prompt2, char *prompt3, int *data,
|
||||||
void (*proc)(void))
|
void (*proc)(void))
|
||||||
{
|
{
|
||||||
int i, oldfanout;
|
int i, oldfanout;
|
||||||
char name[100];
|
char name[MAX_STR_LEN];
|
||||||
|
|
||||||
Printf(prompt1);
|
Printf(prompt1);
|
||||||
for (i = 1; i <= MAX_TREE_DEPTH; i++)
|
for (i = 1; i <= MAX_TREE_DEPTH; i++)
|
||||||
|
|
@ -792,7 +792,7 @@ void SetupArray(char *prompt1, char *prompt2, char *prompt3, int *data,
|
||||||
|
|
||||||
oldfanout = 1;
|
oldfanout = 1;
|
||||||
for (i = 1; i <= MAX_TREE_DEPTH; i++) {
|
for (i = 1; i <= MAX_TREE_DEPTH; i++) {
|
||||||
char prompt[100];
|
char prompt[MAX_STR_LEN];
|
||||||
int newfanout;
|
int newfanout;
|
||||||
sprintf(prompt, prompt2, i);
|
sprintf(prompt, prompt2, i);
|
||||||
promptstring(prompt, name);
|
promptstring(prompt, name);
|
||||||
|
|
@ -822,7 +822,7 @@ void SetupArrayFromString(char *prompt1, char *prompt3, int *data,
|
||||||
void (*proc)(void), char *text)
|
void (*proc)(void), char *text)
|
||||||
{
|
{
|
||||||
int i, oldfanout, newfanout;
|
int i, oldfanout, newfanout;
|
||||||
char string[100];
|
char string[MAX_STR_LEN];
|
||||||
char *ch;
|
char *ch;
|
||||||
char *endch;
|
char *endch;
|
||||||
|
|
||||||
|
|
@ -929,7 +929,7 @@ void ToggleDebug(void)
|
||||||
void DescribeCell(char *name, int detail)
|
void DescribeCell(char *name, int detail)
|
||||||
{
|
{
|
||||||
Printf("Cell: %s contains %d instances, %d nodes and %d ports\n", name,
|
Printf("Cell: %s contains %d instances, %d nodes and %d ports\n", name,
|
||||||
NumberOfInstances(name), RenumberNodes(name), NumberOfPorts(name));
|
NumberOfInstances(name), RenumberNodes(name), NumberOfPorts(name, -1));
|
||||||
PrintEmbeddingTree(stdout,name,detail);
|
PrintEmbeddingTree(stdout,name,detail);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -962,7 +962,7 @@ void ProtoPrintParameters(void)
|
||||||
void PROTOCHIP(void)
|
void PROTOCHIP(void)
|
||||||
/* a simple command interpreter to manage embedding/routing */
|
/* a simple command interpreter to manage embedding/routing */
|
||||||
{
|
{
|
||||||
char name[100];
|
char name[MAX_STR_LEN];
|
||||||
char ch;
|
char ch;
|
||||||
|
|
||||||
InitializeFanout();
|
InitializeFanout();
|
||||||
|
|
@ -1136,7 +1136,7 @@ void PROTOCHIP(void)
|
||||||
|
|
||||||
oldfanout = 1;
|
oldfanout = 1;
|
||||||
for (i = 1; i <= MAX_TREE_DEPTH; i++) {
|
for (i = 1; i <= MAX_TREE_DEPTH; i++) {
|
||||||
char prompt[100];
|
char prompt[MAX_STR_LEN];
|
||||||
int newfanout;
|
int newfanout;
|
||||||
sprintf(prompt,"Fanout for level %d (0 to quit): ",i);
|
sprintf(prompt,"Fanout for level %d (0 to quit): ",i);
|
||||||
promptstring(prompt, name);
|
promptstring(prompt, name);
|
||||||
|
|
@ -1168,7 +1168,7 @@ void PROTOCHIP(void)
|
||||||
|
|
||||||
oldfanout = 1;
|
oldfanout = 1;
|
||||||
for (i = 1; i <= MAX_TREE_DEPTH; i++) {
|
for (i = 1; i <= MAX_TREE_DEPTH; i++) {
|
||||||
char prompt[100];
|
char prompt[MAX_STR_LEN];
|
||||||
int newfanout;
|
int newfanout;
|
||||||
sprintf(prompt,"Common nodes for level %d (0 to quit): ",i);
|
sprintf(prompt,"Common nodes for level %d (0 to quit): ",i);
|
||||||
promptstring(prompt, name);
|
promptstring(prompt, name);
|
||||||
|
|
@ -1200,7 +1200,7 @@ void PROTOCHIP(void)
|
||||||
|
|
||||||
oldfanout = 1;
|
oldfanout = 1;
|
||||||
for (i = 1; i <= MAX_TREE_DEPTH; i++) {
|
for (i = 1; i <= MAX_TREE_DEPTH; i++) {
|
||||||
char prompt[100];
|
char prompt[MAX_STR_LEN];
|
||||||
int newfanout;
|
int newfanout;
|
||||||
sprintf(prompt,"Used leaves for level %d (0 to quit): ",i);
|
sprintf(prompt,"Used leaves for level %d (0 to quit): ",i);
|
||||||
promptstring(prompt, name);
|
promptstring(prompt, name);
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ extern int ColumnBase;
|
||||||
|
|
||||||
struct filestr {
|
struct filestr {
|
||||||
FILE *f;
|
FILE *f;
|
||||||
char buffer[200];
|
char buffer[MAX_STR_LEN];
|
||||||
int wrap; /* column to wrap around in, or 0 if no wrap */
|
int wrap; /* column to wrap around in, or 0 if no wrap */
|
||||||
} file_buffers[MAXFILES];
|
} file_buffers[MAXFILES];
|
||||||
|
|
||||||
|
|
@ -107,7 +107,7 @@ void Fprintf(FILE *f, char *format, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
int FileIndex;
|
int FileIndex;
|
||||||
char tmpstr[200];
|
char tmpstr[MAX_STR_LEN];
|
||||||
int bufferlongenough;
|
int bufferlongenough;
|
||||||
int linewrapexceeded;
|
int linewrapexceeded;
|
||||||
|
|
||||||
|
|
@ -203,7 +203,7 @@ void Printf(char *format, ...)
|
||||||
void Printf(char *format, ...)
|
void Printf(char *format, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
char tmpstr[200];
|
char tmpstr[MAX_STR_LEN];
|
||||||
|
|
||||||
va_start(ap, format);
|
va_start(ap, format);
|
||||||
vsprintf(tmpstr, format, ap);
|
vsprintf(tmpstr, format, ap);
|
||||||
|
|
|
||||||
43
base/query.c
43
base/query.c
|
|
@ -52,7 +52,7 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
/*************************************************************************/
|
/*************************************************************************/
|
||||||
|
|
||||||
static int SuppressPrompts = 0;
|
static int SuppressPrompts = 0;
|
||||||
static char InputLine[200];
|
static char InputLine[MAX_STR_LEN];
|
||||||
|
|
||||||
void typeahead(char *str)
|
void typeahead(char *str)
|
||||||
{
|
{
|
||||||
|
|
@ -73,7 +73,7 @@ but reads from 'promptstring_infile' if nec. */
|
||||||
/* If interactive, puts out 'prompt' */
|
/* If interactive, puts out 'prompt' */
|
||||||
{
|
{
|
||||||
char *nexttok;
|
char *nexttok;
|
||||||
char tmpstr[200];
|
char tmpstr[MAX_STR_LEN];
|
||||||
int echo;
|
int echo;
|
||||||
|
|
||||||
if (promptstring_infile == NULL)
|
if (promptstring_infile == NULL)
|
||||||
|
|
@ -319,7 +319,7 @@ void Fanout(char *cell, char *node, int filter)
|
||||||
while (ob != NULL) {
|
while (ob != NULL) {
|
||||||
char *obname = ob->name;
|
char *obname = ob->name;
|
||||||
if (*obname == '/') obname++;
|
if (*obname == '/') obname++;
|
||||||
if (ob->node == nodenum)
|
if (ob->node == nodenum) {
|
||||||
if (filter == ALLOBJECTS) {
|
if (filter == ALLOBJECTS) {
|
||||||
Printf(" %s (", obname);
|
Printf(" %s (", obname);
|
||||||
PrintObjectType(ob->type);
|
PrintObjectType(ob->type);
|
||||||
|
|
@ -331,6 +331,7 @@ void Fanout(char *cell, char *node, int filter)
|
||||||
else if (ob->type == filter) {
|
else if (ob->type == filter) {
|
||||||
Printf(" %s\n", obname);
|
Printf(" %s\n", obname);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
ob = ob->next;
|
ob = ob->next;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -801,9 +802,19 @@ void DescribeInstance(char *name, int file)
|
||||||
{
|
{
|
||||||
if (ob->node > nodemax) nodemax = ob->node;
|
if (ob->node > nodemax) nodemax = ob->node;
|
||||||
else if ((ob->node == -1) && (ob->model.port != PROXY)) {
|
else if ((ob->node == -1) && (ob->model.port != PROXY)) {
|
||||||
if (disconnectednodes == 0) Fprintf(stderr, "\n");
|
|
||||||
disconnectednodes++;
|
/* All black-box modules and placeholders by definition have all */
|
||||||
Fprintf(stderr, "Cell %s disconnected node: %s\n", tp->name, ob->name);
|
/* disconnected pins, so don't report those. */
|
||||||
|
|
||||||
|
if ((!(tp->flags & CELL_PLACEHOLDER)) && (tp->class != CLASS_MODULE)) {
|
||||||
|
// if (disconnectednodes == 0) Fprintf(stderr, "\n");
|
||||||
|
disconnectednodes++;
|
||||||
|
/* Don't report on ports marked "port_match_error", which is just confusing. */
|
||||||
|
if (strcmp(ob->name, "port_match_error")) {
|
||||||
|
Fprintf(stderr, "Cell %s (%d) disconnected node: %s\n",
|
||||||
|
tp->name, tp->file, ob->name);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
instlist = (unsigned char *) CALLOC((nodemax + 1), sizeof(unsigned char));
|
instlist = (unsigned char *) CALLOC((nodemax + 1), sizeof(unsigned char));
|
||||||
|
|
@ -900,7 +911,7 @@ void PrintLeavesInCell(char *cellname, int filenum)
|
||||||
np->dumped = 1;
|
np->dumped = 1;
|
||||||
|
|
||||||
if (np->class != CLASS_SUBCKT) {
|
if (np->class != CLASS_SUBCKT) {
|
||||||
Printf("%s; %d ports; Primitive.\n", cellname, NumberOfPorts(cellname));
|
Printf("%s; %d ports; Primitive.\n", cellname, NumberOfPorts(cellname, filenum));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -913,7 +924,7 @@ void PrintLeavesInCell(char *cellname, int filenum)
|
||||||
am_a_leaf = 0;
|
am_a_leaf = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (am_a_leaf) Printf("%s; %d ports\n", cellname, NumberOfPorts(cellname));
|
if (am_a_leaf) Printf("%s; %d ports\n", cellname, NumberOfPorts(cellname, filenum));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -923,7 +934,7 @@ static int PrintLeavesInCellHash(struct hashlist *p)
|
||||||
struct nlist *ptr;
|
struct nlist *ptr;
|
||||||
|
|
||||||
ptr = (struct nlist *)(p->ptr);
|
ptr = (struct nlist *)(p->ptr);
|
||||||
if ((ptr->class == CLASS_SUBCKT)) PrintLeavesInCell(ptr->name, ptr->file);
|
if (ptr->class == CLASS_SUBCKT) PrintLeavesInCell(ptr->name, ptr->file);
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -949,8 +960,8 @@ void Query(void)
|
||||||
{
|
{
|
||||||
/* little interactive debugger */
|
/* little interactive debugger */
|
||||||
char reply;
|
char reply;
|
||||||
char repstr[100];
|
char repstr[MAX_STR_LEN];
|
||||||
char repstr2[100];
|
char repstr2[MAX_STR_LEN];
|
||||||
float StartTime; /* for elapsed CPU times */
|
float StartTime; /* for elapsed CPU times */
|
||||||
int Timing; /* if true, print times of each command */
|
int Timing; /* if true, print times of each command */
|
||||||
int filenum = -1;
|
int filenum = -1;
|
||||||
|
|
@ -1024,6 +1035,10 @@ void Query(void)
|
||||||
promptstring("Write SPICE: circuit name: ", repstr);
|
promptstring("Write SPICE: circuit name: ", repstr);
|
||||||
SpiceCell(repstr, filenum, "");
|
SpiceCell(repstr, filenum, "");
|
||||||
break;
|
break;
|
||||||
|
case 'v':
|
||||||
|
promptstring("Write Verilog: circuit name: ", repstr);
|
||||||
|
VerilogTop(repstr, filenum, "");
|
||||||
|
break;
|
||||||
case 'E':
|
case 'E':
|
||||||
promptstring("Write ESACAP: circuit name: ", repstr);
|
promptstring("Write ESACAP: circuit name: ", repstr);
|
||||||
EsacapCell(repstr,"");
|
EsacapCell(repstr,"");
|
||||||
|
|
@ -1059,9 +1074,13 @@ void Query(void)
|
||||||
ActelLib();
|
ActelLib();
|
||||||
break;
|
break;
|
||||||
case 'S':
|
case 'S':
|
||||||
promptstring("Read SPICE (.ckt) file? ", repstr);
|
promptstring("Read SPICE (.spice) file? ", repstr);
|
||||||
ReadSpice(repstr, &filenum);
|
ReadSpice(repstr, &filenum);
|
||||||
break;
|
break;
|
||||||
|
case 'V':
|
||||||
|
promptstring("Read Verilog (.v) file? ", repstr);
|
||||||
|
ReadVerilog(repstr, &filenum);
|
||||||
|
break;
|
||||||
case 'G' :
|
case 'G' :
|
||||||
promptstring("Read NETGEN: file? ", repstr);
|
promptstring("Read NETGEN: file? ", repstr);
|
||||||
ReadNetgenFile(repstr, &filenum);
|
ReadNetgenFile(repstr, &filenum);
|
||||||
|
|
|
||||||
593
base/spice.c
593
base/spice.c
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,8 @@
|
||||||
|
#ifndef _TECH_H
|
||||||
|
#define _TECH_H
|
||||||
|
|
||||||
|
extern int ActelLibPresent(void);
|
||||||
|
extern void ActelLib(void);
|
||||||
|
extern void VerilogTop(char *name, int fnum, char *filename);
|
||||||
|
|
||||||
|
#endif /* _TECH_H */
|
||||||
|
|
@ -34,6 +34,8 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
#include "print.h"
|
#include "print.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
extern void Finsert(FILE *f);
|
||||||
|
|
||||||
void test_entry(void)
|
void test_entry(void)
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -23,6 +23,7 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
#ifdef IBMPC
|
#ifdef IBMPC
|
||||||
#include <stdlib.h> /* for strtol on PC */
|
#include <stdlib.h> /* for strtol on PC */
|
||||||
|
|
@ -33,6 +34,8 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
#include "netfile.h"
|
#include "netfile.h"
|
||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
#include "print.h"
|
#include "print.h"
|
||||||
|
#include "xilinx.h"
|
||||||
|
#include "flatten.h"
|
||||||
|
|
||||||
#define XILINXHASHSIZE 99
|
#define XILINXHASHSIZE 99
|
||||||
static long xilinxhashbase = 0xA00;
|
static long xilinxhashbase = 0xA00;
|
||||||
|
|
@ -132,9 +135,8 @@ char *xilinx_class(model)
|
||||||
}
|
}
|
||||||
return(model);
|
return(model);
|
||||||
}
|
}
|
||||||
Xilinx(cellname, filename)
|
|
||||||
char *cellname;
|
void Xilinx(char *cellname, char *filename)
|
||||||
char *filename;
|
|
||||||
{
|
{
|
||||||
char Path[500];
|
char Path[500];
|
||||||
char FileName[500];
|
char FileName[500];
|
||||||
|
|
@ -162,8 +164,7 @@ Xilinx(cellname, filename)
|
||||||
CloseFile(FileName);
|
CloseFile(FileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
xilinxCell(cell)
|
int xilinxCell(char *cell)
|
||||||
char *cell;
|
|
||||||
{
|
{
|
||||||
struct nlist *nl;
|
struct nlist *nl;
|
||||||
struct objlist *ob;
|
struct objlist *ob;
|
||||||
|
|
@ -251,9 +252,7 @@ struct objlist *xilinx_gate(ob,nl)
|
||||||
return(nob);
|
return(nob);
|
||||||
}
|
}
|
||||||
|
|
||||||
xilinx_sym(nl,gob)
|
void xilinx_sym(struct nlist *nl, struct objlist *gob)
|
||||||
struct nlist *nl;
|
|
||||||
struct objlist *gob;
|
|
||||||
{
|
{
|
||||||
struct objlist *ob;
|
struct objlist *ob;
|
||||||
char *cp,*rindex();
|
char *cp,*rindex();
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,10 @@
|
||||||
|
#ifndef _XILINX_H
|
||||||
|
#define _XILINX_H
|
||||||
|
|
||||||
|
extern void xilinx_sym(struct nlist *nl, struct objlist *gob);
|
||||||
|
extern void Xilinx(char *cellname, char *filename);
|
||||||
|
extern int xilinxCell(char *cell);
|
||||||
|
extern int XilinxLibPresent(void);
|
||||||
|
extern void XilinxLib(void);
|
||||||
|
|
||||||
|
#endif /* _XILINX_H */
|
||||||
|
|
@ -65,10 +65,10 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
Widget toplevel = NULL;
|
Widget toplevel = NULL;
|
||||||
|
|
||||||
char GlobalFileName[100],
|
char GlobalFileName[MAX_STR_LEN],
|
||||||
GlobalCellName[100],
|
GlobalCellName[MAX_STR_LEN],
|
||||||
GlobalOtherName[100],
|
GlobalOtherName[MAX_STR_LEN],
|
||||||
GlobalDataName[100];
|
GlobalDataName[MAX_STR_LEN];
|
||||||
|
|
||||||
/*********************************************************
|
/*********************************************************
|
||||||
* Menu structure: attaches label string to a function,
|
* Menu structure: attaches label string to a function,
|
||||||
|
|
@ -271,7 +271,7 @@ void initialize_netcmp_datastructures(Widget w, Widget textwidget,
|
||||||
{
|
{
|
||||||
X_START();
|
X_START();
|
||||||
Printf("Comparing cells '%s' and '%s'\n", get_cell(), get_other());
|
Printf("Comparing cells '%s' and '%s'\n", get_cell(), get_other());
|
||||||
CreateTwoLists(get_cell(), get_other());
|
CreateTwoLists(get_cell(), get_other(), 0);
|
||||||
Permute();
|
Permute();
|
||||||
#ifdef DEBUG_ALLOC
|
#ifdef DEBUG_ALLOC
|
||||||
PrintCoreStats();
|
PrintCoreStats();
|
||||||
|
|
@ -1708,7 +1708,7 @@ void X_main_loop(int argc, char *argv[])
|
||||||
|
|
||||||
XmStringCharSet cs = "ISOLatin1";
|
XmStringCharSet cs = "ISOLatin1";
|
||||||
|
|
||||||
static char prompt_response[100];
|
static char prompt_response[MAX_STR_LEN];
|
||||||
int prompt_done;
|
int prompt_done;
|
||||||
int calling_editor; /* which string are we trying to get ? */
|
int calling_editor; /* which string are we trying to get ? */
|
||||||
#define FILE_NAME 1
|
#define FILE_NAME 1
|
||||||
|
|
|
||||||
|
|
@ -4,4 +4,6 @@
|
||||||
# all of its config scripts in a different directory than the configure
|
# all of its config scripts in a different directory than the configure
|
||||||
# script itself.
|
# script itself.
|
||||||
|
|
||||||
( CFLAGS="-g" ; export CFLAGS ; cd scripts ; ./configure $* )
|
export CFLAGS="$CFLAGS -g"
|
||||||
|
cd scripts
|
||||||
|
exec ./configure "$@"
|
||||||
|
|
|
||||||
84
defs.mak
84
defs.mak
|
|
@ -1,84 +0,0 @@
|
||||||
# defs.mak.in --
|
|
||||||
# source file for autoconf-generated "defs.mak" for netgen
|
|
||||||
|
|
||||||
# defs.mak. Generated from defs.mak.in by configure.
|
|
||||||
# Feel free to change the values in here to suit your needs.
|
|
||||||
# Be aware that running scripts/configure again will overwrite
|
|
||||||
# any changes!
|
|
||||||
|
|
||||||
SHELL = /bin/sh
|
|
||||||
|
|
||||||
prefix = ${BUILDROOT}/usr/local
|
|
||||||
exec_prefix = ${prefix}
|
|
||||||
bindir = ${exec_prefix}/bin
|
|
||||||
libdir = ${exec_prefix}/lib
|
|
||||||
mandir = ${prefix}/share/man
|
|
||||||
|
|
||||||
VERSION =
|
|
||||||
|
|
||||||
SCRIPTS = ${NETGENDIR}/scripts
|
|
||||||
|
|
||||||
INSTALL = /bin/install -c
|
|
||||||
INSTALL_PROGRAM = ${INSTALL}
|
|
||||||
INSTALL_DATA = ${INSTALL} -m 644
|
|
||||||
INSTALL_SCRIPT = ${INSTALL}
|
|
||||||
|
|
||||||
# Override standard "make" target when compiling under TCL
|
|
||||||
ALL_TARGET = tcl
|
|
||||||
INSTALL_TARGET = install-tcl
|
|
||||||
|
|
||||||
# Change CADDIR to install in a different place
|
|
||||||
BINDIR = ${bindir}
|
|
||||||
MANDIR = ${mandir}
|
|
||||||
LIBDIR = ${libdir}
|
|
||||||
DOCDIR = ${libdir}/netgen/doc
|
|
||||||
TCLDIR = ${libdir}/netgen/tcl
|
|
||||||
|
|
||||||
MAIN_EXTRA_LIBS = ${NETGENDIR}/tcltk/libtcltk.o
|
|
||||||
LD_EXTRA_LIBS =
|
|
||||||
LD_SHARED =
|
|
||||||
TOP_EXTRA_LIBS =
|
|
||||||
SUB_EXTRA_LIBS =
|
|
||||||
|
|
||||||
MODULES += tcltk
|
|
||||||
UNUSED_MODULES +=
|
|
||||||
PROGRAMS += tcltk
|
|
||||||
INSTALL_CAD_DIRS += tcltk
|
|
||||||
|
|
||||||
RM = rm -f
|
|
||||||
CP = cp
|
|
||||||
AR = @AR@
|
|
||||||
ARFLAGS = crv
|
|
||||||
LINK = /bin/ld -r
|
|
||||||
LD = /bin/ld
|
|
||||||
M4 = /bin/m4
|
|
||||||
RANLIB = ranlib
|
|
||||||
SHDLIB_EXT = .so
|
|
||||||
LDDL_FLAGS = -shared -Wl,-soname,$@ -Wl,--version-script=${NETGENDIR}/netgen/symbol.map
|
|
||||||
LD_RUN_PATH =
|
|
||||||
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}\" -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=\"eda-dev@opencircuitdesign.com\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"60\" -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=\"eda-dev@opencircuitdesign.com\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"60\" -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 = -DX11 -DXLIB -DNDEBUG
|
|
||||||
GR_LIBS = -lX11
|
|
||||||
GR_SRCS = ${TK_SRCS}
|
|
||||||
|
|
||||||
OBJS = ${SRCS:.c=.o}
|
|
||||||
LIB_OBJS = ${LIB_SRCS:.c=.o}
|
|
||||||
CLEANS = ${OBJS} ${LIB_OBJS} lib${MODULE}.a lib${MODULE}.o ${MODULE}
|
|
||||||
18
doc/Makefile
18
doc/Makefile
|
|
@ -2,15 +2,15 @@ NETGENDIR = ..
|
||||||
|
|
||||||
include ${NETGENDIR}/defs.mak
|
include ${NETGENDIR}/defs.mak
|
||||||
|
|
||||||
MANDIRS = $(DESTDIR)${MANDIR} $(DESTDIR)${MANDIR}/man1
|
MANDIRS = $(DESTDIR)${INSTALL_MANDIR} $(DESTDIR)${INSTALL_MANDIR}/man1
|
||||||
DOCDIRS = $(DESTDIR)${DOCDIR}
|
DOCDIRS = $(DESTDIR)${INSTALL_DOCDIR}
|
||||||
|
|
||||||
MANFILES =
|
MANFILES =
|
||||||
DOCFILES = $(DESTDIR)${DOCDIR}/netgen.doc
|
DOCFILES = $(DESTDIR)${INSTALL_DOCDIR}/netgen.doc
|
||||||
|
|
||||||
install-tcl: ${MANDIRS} ${MANFILES} ${DOCDIRS} ${DOCFILES}
|
install-tcl: ${DOCDIRS} ${DOCFILES}
|
||||||
|
|
||||||
install: ${MANDIRS} ${MANFILES} ${DOCDIRS} ${DOCFILES}
|
install: ${DOCDIRS} ${DOCFILES}
|
||||||
|
|
||||||
${MANDIRS}: make-man-dirs
|
${MANDIRS}: make-man-dirs
|
||||||
|
|
||||||
|
|
@ -23,8 +23,8 @@ make-doc-dirs:
|
||||||
${SCRIPTS}/mkdirs ${DOCDIRS}
|
${SCRIPTS}/mkdirs ${DOCDIRS}
|
||||||
|
|
||||||
# This file does not actually exist. . .
|
# This file does not actually exist. . .
|
||||||
$(DESTDIR)${MANDIR}/man1/netgen.1: netgen.1 ${MANDIRS}
|
$(DESTDIR)${INSTALL_MANDIR}/man1/netgen.1: netgen.1 ${MANDIRS}
|
||||||
${CP} netgen.1 $(DESTDIR)${MANDIR}/man1/netgen.1
|
${CP} netgen.1 $(DESTDIR)${INSTALL_MANDIR}/man1/netgen.1
|
||||||
|
|
||||||
$(DESTDIR)${DOCDIR}/netgen.doc: netgen.doc ${DOCDIRS}
|
$(DESTDIR)${INSTALL_DOCDIR}/netgen.doc: netgen.doc ${DOCDIRS}
|
||||||
${CP} netgen.doc $(DESTDIR)${DOCDIR}/netgen.doc
|
${CP} netgen.doc $(DESTDIR)${INSTALL_DOCDIR}/netgen.doc
|
||||||
|
|
|
||||||
12
lib/Makefile
12
lib/Makefile
|
|
@ -4,14 +4,14 @@ include ${NETGENDIR}/defs.mak
|
||||||
|
|
||||||
LIB_FILES = ntk2adl.sh spice spice.bot spice.top
|
LIB_FILES = ntk2adl.sh spice spice.bot spice.top
|
||||||
|
|
||||||
LIB_INST_FILES= $(LIB_FILES:%=$(DESTDIR)${LIBDIR}/netgen/%)
|
LIB_INST_FILES= $(LIB_FILES:%=$(DESTDIR)${INSTALL_LIBDIR}/netgen/%)
|
||||||
BIN_INST_FILES= $(BIN_FILES:%=$(DESTDIR)${BINDIR}/%)
|
BIN_INST_FILES= $(BIN_FILES:%=$(DESTDIR)${INSTALL_BINDIR}/%)
|
||||||
|
|
||||||
install-tcl: ${LIB_INST_FILES}
|
install-tcl: ${LIB_INST_FILES}
|
||||||
|
|
||||||
install: ${LIB_INST_FILES}
|
install: ${LIB_INST_FILES}
|
||||||
|
|
||||||
$(DESTDIR)${LIBDIR}/netgen/%: %
|
$(DESTDIR)${INSTALL_LIBDIR}/netgen/%: %
|
||||||
../scripts/mkdirs $(DESTDIR)${LIBDIR}/netgen
|
../scripts/mkdirs $(DESTDIR)${INSTALL_LIBDIR}/netgen
|
||||||
${RM} $(DESTDIR)${LIBDIR}/netgen/$*
|
${RM} $(DESTDIR)${INSTALL_LIBDIR}/netgen/$*
|
||||||
${CP} $* $(DESTDIR)${LIBDIR}/netgen/$*
|
${CP} $* $(DESTDIR)${INSTALL_LIBDIR}/netgen/$*
|
||||||
|
|
|
||||||
|
|
@ -22,26 +22,26 @@ tclnetgen${SHDLIB_EXT}: ${EXTRA_LIBS}
|
||||||
@echo --- making netgen Tcl library \(tclnetgen${SHDLIB_EXT}\)
|
@echo --- making netgen Tcl library \(tclnetgen${SHDLIB_EXT}\)
|
||||||
${RM} tclnetgen${SHDLIB_EXT}
|
${RM} tclnetgen${SHDLIB_EXT}
|
||||||
${CC} ${CFLAGS} ${CPPFLAGS} -o $@ ${LDDL_FLAGS} \
|
${CC} ${CFLAGS} ${CPPFLAGS} -o $@ ${LDDL_FLAGS} \
|
||||||
${LD_RUN_PATH} ${EXTRA_LIBS} ${LD_EXTRA_LIBS} -lc ${LIBS} \
|
${LD_RUN_PATH} ${EXTRA_LIBS} ${LD_EXTRA_LIBS} \
|
||||||
${LIB_SPECS} ${LDFLAGS}
|
-lc ${LIBS} ${LIB_SPECS} ${LDFLAGS}
|
||||||
|
|
||||||
$(DESTDIR)${BINDIR}/netgen:
|
$(DESTDIR)${INSTALL_BINDIR}/netgen:
|
||||||
${RM} $@
|
${RM} $@
|
||||||
${CP} netgen $@
|
${CP} netgen $@
|
||||||
|
|
||||||
$(DESTDIR)${BINDIR}/ntk2adl:
|
$(DESTDIR)${INSTALL_BINDIR}/ntk2adl:
|
||||||
${RM} $@
|
${RM} $@
|
||||||
${CP} ntk2adl $@
|
${CP} ntk2adl $@
|
||||||
|
|
||||||
$(DESTDIR)${BINDIR}/ntk2xnf:
|
$(DESTDIR)${INSTALL_BINDIR}/ntk2xnf:
|
||||||
${RM} $@
|
${RM} $@
|
||||||
${CP} ntk2xnf $@
|
${CP} ntk2xnf $@
|
||||||
|
|
||||||
$(DESTDIR)${BINDIR}/netcomp:
|
$(DESTDIR)${INSTALL_BINDIR}/netcomp:
|
||||||
${RM} $@
|
${RM} $@
|
||||||
${CP} netcomp $@
|
${CP} netcomp $@
|
||||||
|
|
||||||
$(DESTDIR)${BINDIR}/inetcomp:
|
$(DESTDIR)${INSTALL_BINDIR}/inetcomp:
|
||||||
${RM} $@
|
${RM} $@
|
||||||
${CP} inetcomp $@
|
${CP} inetcomp $@
|
||||||
|
|
||||||
|
|
@ -61,14 +61,14 @@ ntk2xnf: ntk2xnf.c
|
||||||
${CC} ${CFLAGS} ${CPPFLAGS} ${DFLAGS} ntk2xnf.c -o $@ ${EXTRA_LIBS} \
|
${CC} ${CFLAGS} ${CPPFLAGS} ${DFLAGS} ntk2xnf.c -o $@ ${EXTRA_LIBS} \
|
||||||
${LIBS} ${LDFLAGS}
|
${LIBS} ${LDFLAGS}
|
||||||
|
|
||||||
install: $(DESTDIR)${BINDIR}/netgen $(DESTDIR)${BINDIR}/netcomp \
|
install: $(DESTDIR)${INSTALL_BINDIR}/netgen $(DESTDIR)${INSTALL_BINDIR}/netcomp \
|
||||||
$(DESTDIR)${BINDIR}/inetcomp $(DESTDIR)${BINDIR}/ntk2adl \
|
$(DESTDIR)${INSTALL_BINDIR}/inetcomp $(DESTDIR)${INSTALL_BINDIR}/ntk2adl \
|
||||||
$(DESTDIR)${BINDIR}/ntk2xnf
|
$(DESTDIR)${INSTALL_BINDIR}/ntk2xnf
|
||||||
|
|
||||||
install-tcl: $(DESTDIR)${TCLDIR} $(DESTDIR)${TCLDIR}/tclnetgen${SHDLIB_EXT}
|
install-tcl: $(DESTDIR)${INSTALL_TCLDIR} $(DESTDIR)${INSTALL_TCLDIR}/tclnetgen${SHDLIB_EXT}
|
||||||
|
|
||||||
$(DESTDIR)${TCLDIR}/tclnetgen${SHDLIB_EXT}: tclnetgen${SHDLIB_EXT}
|
$(DESTDIR)${INSTALL_TCLDIR}/tclnetgen${SHDLIB_EXT}: tclnetgen${SHDLIB_EXT}
|
||||||
${RM} $(DESTDIR)${TCLDIR}/tclnetgen${SHDLIB_EXT}
|
${RM} $(DESTDIR)${INSTALL_TCLDIR}/tclnetgen${SHDLIB_EXT}
|
||||||
${CP} tclnetgen${SHDLIB_EXT} $(DESTDIR)${TCLDIR}/tclnetgen${SHDLIB_EXT}
|
${CP} tclnetgen${SHDLIB_EXT} $(DESTDIR)${INSTALL_TCLDIR}/tclnetgen${SHDLIB_EXT}
|
||||||
|
|
||||||
include ${NETGENDIR}/rules.mak
|
include ${NETGENDIR}/rules.mak
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@ along with this program; see the file copying. If not, write to
|
||||||
the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
/* inetcomp.c -- a simple wrapper to the NETCOMP() function */
|
/* inetcomp.c -- a simple wrapper to the NETCOMP() function */
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "netgen.h"
|
#include "netgen.h"
|
||||||
|
|
@ -33,7 +34,7 @@ void STRCPY(char *dest, char *source)
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
char cell1[200], cell2[200];
|
char cell1[MAX_STR_LEN], cell2[MAX_STR_LEN];
|
||||||
|
|
||||||
Debug = 0;
|
Debug = 0;
|
||||||
if (argc != 1) {
|
if (argc != 1) {
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,7 @@ along with this program; see the file copying. If not, write to
|
||||||
the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
/* netcomp.c -- a simple wrapper to provide netlist comparison functionality */
|
/* netcomp.c -- a simple wrapper to provide netlist comparison functionality */
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "netgen.h"
|
#include "netgen.h"
|
||||||
|
|
@ -51,7 +52,7 @@ void STRCPY(char *dest, char *source)
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
#ifndef HAVE_GETOPT
|
#ifndef HAVE_GETOPT
|
||||||
char cell1[200], cell2[200];
|
char cell1[MAX_STR_LEN], cell2[MAX_STR_LEN];
|
||||||
int filenum = -1;
|
int filenum = -1;
|
||||||
|
|
||||||
Debug = 0;
|
Debug = 0;
|
||||||
|
|
@ -67,7 +68,7 @@ int main(int argc, char *argv[])
|
||||||
STRCPY(cell2, ReadNetlist(argv[2], &filenum));
|
STRCPY(cell2, ReadNetlist(argv[2], &filenum));
|
||||||
if (argc == 5) STRCPY(cell2, argv[4]); /* if explicit cell name specified */
|
if (argc == 5) STRCPY(cell2, argv[4]); /* if explicit cell name specified */
|
||||||
#else
|
#else
|
||||||
char cell1[200], cell2[200];
|
char cell1[MAX_STR_LEN], cell2[MAX_STR_LEN];
|
||||||
int usage = 0;
|
int usage = 0;
|
||||||
int args;
|
int args;
|
||||||
int c;
|
int c;
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
#include <stdlib.h> /* for getenv */
|
#include <stdlib.h> /* for getenv */
|
||||||
#endif
|
#endif
|
||||||
#include "netgen.h"
|
#include "netgen.h"
|
||||||
|
#include "print.h"
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -20,9 +20,11 @@ along with this program; see the file copying. If not, write to
|
||||||
the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
|
|
||||||
/* ntk2xnf.c -- a simple wrapper to translate .ntk to Xilinx XNF format */
|
/* ntk2xnf.c -- a simple wrapper to translate .ntk to Xilinx XNF format */
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include "netgen.h"
|
#include "netgen.h"
|
||||||
|
#include "xilinx.h"
|
||||||
|
|
||||||
#ifdef HAVE_X11
|
#ifdef HAVE_X11
|
||||||
/* the following two X procedures are to permit linking
|
/* the following two X procedures are to permit linking
|
||||||
|
|
@ -47,7 +49,7 @@ void STRCPY(char *dest, char *source)
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
char cellname[200];
|
char cellname[MAX_STR_LEN];
|
||||||
int filenum = -1;
|
int filenum = -1;
|
||||||
|
|
||||||
Debug = 0;
|
Debug = 0;
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,57 @@
|
||||||
|
MODULE = python
|
||||||
|
NETGENDIR = ..
|
||||||
|
SRCS =
|
||||||
|
SCRIPTS = consoletext.py helpwindow.py lvs_manager.py treeviewsplit.py
|
||||||
|
SCRIPTS += tksimpledialog.py tooltip.py lvs_help.txt
|
||||||
|
|
||||||
|
SCRIPTINSTALL = $(DESTDIR)${INSTALL_PYDIR}
|
||||||
|
|
||||||
|
include ${NETGENDIR}/defs.mak
|
||||||
|
|
||||||
|
CLEANS += lvs_manager.py
|
||||||
|
|
||||||
|
main: lvs_manager.py
|
||||||
|
|
||||||
|
tcl-main: lvs_manager.py
|
||||||
|
|
||||||
|
$(DESTDIR)${INSTALL_PYDIR}/consoletext.py:
|
||||||
|
${RM} $@
|
||||||
|
${CP} consoletext.py $@
|
||||||
|
|
||||||
|
$(DESTDIR)${INSTALL_PYDIR}/helpwindow.py:
|
||||||
|
${RM} $@
|
||||||
|
${CP} helpwindow.py $@
|
||||||
|
|
||||||
|
lvs_manager.py: lvs_manager.py.in
|
||||||
|
sed -e '/SUBST_SCRIPT_DIR/s#SUBST_SCRIPT_DIR#$(SCRIPTINSTALL)#' \
|
||||||
|
lvs_manager.py.in > lvs_manager.py
|
||||||
|
|
||||||
|
$(DESTDIR)${INSTALL_PYDIR}/lvs_manager.py: lvs_manager.py
|
||||||
|
${RM} $@
|
||||||
|
${CP} lvs_manager.py $@
|
||||||
|
chmod a+x $@
|
||||||
|
|
||||||
|
$(DESTDIR)${INSTALL_PYDIR}/treeviewsplit.py: treeviewsplit.py
|
||||||
|
${RM} $@
|
||||||
|
${CP} treeviewsplit.py $@
|
||||||
|
|
||||||
|
$(DESTDIR)${INSTALL_PYDIR}/tksimpledialog.py: tksimpledialog.py
|
||||||
|
${RM} $@
|
||||||
|
${CP} tksimpledialog.py $@
|
||||||
|
|
||||||
|
$(DESTDIR)${INSTALL_PYDIR}/tooltip.py: tooltip.py
|
||||||
|
${RM} $@
|
||||||
|
${CP} tooltip.py $@
|
||||||
|
|
||||||
|
$(DESTDIR)${INSTALL_PYDIR}/lvs_help.txt: lvs_help.txt
|
||||||
|
${RM} $@
|
||||||
|
${CP} lvs_help.txt $@
|
||||||
|
|
||||||
|
install: install-tcl
|
||||||
|
|
||||||
|
install-tcl: $(DESTDIR)${INSTALL_PYDIR} $(DESTDIR)${INSTALL_PYDIR}/consoletext.py \
|
||||||
|
$(DESTDIR)${INSTALL_PYDIR}/helpwindow.py $(DESTDIR)${INSTALL_PYDIR}/lvs_manager.py \
|
||||||
|
$(DESTDIR)${INSTALL_PYDIR}/treeviewsplit.py $(DESTDIR)${INSTALL_PYDIR}/tksimpledialog.py \
|
||||||
|
$(DESTDIR)${INSTALL_PYDIR}/tooltip.py $(DESTDIR)${INSTALL_PYDIR}/lvs_help.txt
|
||||||
|
|
||||||
|
include ${NETGENDIR}/rules.mak
|
||||||
|
|
@ -0,0 +1,54 @@
|
||||||
|
#!/bin/env python3
|
||||||
|
#
|
||||||
|
#--------------------------------------------------------
|
||||||
|
"""
|
||||||
|
consoletext --- extends tkinter class Text
|
||||||
|
with stdout and stderr redirection.
|
||||||
|
"""
|
||||||
|
#--------------------------------------------------------
|
||||||
|
# Written by Tim Edwards
|
||||||
|
# efabless, inc.
|
||||||
|
# September 11, 2016
|
||||||
|
# Version 0.1
|
||||||
|
#--------------------------------------------------------
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import tkinter
|
||||||
|
|
||||||
|
class ConsoleText(tkinter.Text):
|
||||||
|
linelimit = 500
|
||||||
|
class IORedirector(object):
|
||||||
|
'''A general class for redirecting I/O to this Text widget.'''
|
||||||
|
def __init__(self,text_area):
|
||||||
|
self.text_area = text_area
|
||||||
|
|
||||||
|
class StdoutRedirector(IORedirector):
|
||||||
|
'''A class for redirecting stdout to this Text widget.'''
|
||||||
|
def write(self,str):
|
||||||
|
self.text_area.write(str,False)
|
||||||
|
|
||||||
|
class StderrRedirector(IORedirector):
|
||||||
|
'''A class for redirecting stderr to this Text widget.'''
|
||||||
|
def write(self,str):
|
||||||
|
self.text_area.write(str,True)
|
||||||
|
|
||||||
|
def __init__(self, master=None, cnf={}, **kw):
|
||||||
|
'''See the __init__ for Tkinter.Text.'''
|
||||||
|
|
||||||
|
tkinter.Text.__init__(self, master, cnf, **kw)
|
||||||
|
|
||||||
|
self.tag_configure('stdout',background='white',foreground='black')
|
||||||
|
self.tag_configure('stderr',background='white',foreground='red')
|
||||||
|
# None of these works! Cannot change selected text background!
|
||||||
|
self.config(selectbackground='blue', selectforeground='white')
|
||||||
|
self.tag_configure('sel',background='blue',foreground='white')
|
||||||
|
|
||||||
|
def write(self, val, is_stderr=False):
|
||||||
|
lines = int(self.index('end-1c').split('.')[0])
|
||||||
|
if lines > self.linelimit:
|
||||||
|
self.delete('1.0', str(lines - self.linelimit) + '.0')
|
||||||
|
self.insert('end',val,'stderr' if is_stderr else 'stdout')
|
||||||
|
self.see('end')
|
||||||
|
|
||||||
|
def limit(self, val):
|
||||||
|
self.linelimit = val
|
||||||
|
|
@ -0,0 +1,229 @@
|
||||||
|
#!/bin/env python3
|
||||||
|
#
|
||||||
|
#--------------------------------------------------------
|
||||||
|
# Help Window for the Open Galaxy project manager
|
||||||
|
#
|
||||||
|
#--------------------------------------------------------
|
||||||
|
# Written by Tim Edwards
|
||||||
|
# efabless, inc.
|
||||||
|
# September 12, 2016
|
||||||
|
# Version 0.1
|
||||||
|
#--------------------------------------------------------
|
||||||
|
|
||||||
|
import re
|
||||||
|
import tkinter
|
||||||
|
from tkinter import ttk
|
||||||
|
|
||||||
|
class HelpWindow(tkinter.Toplevel):
|
||||||
|
"""Open Galaxy help window."""
|
||||||
|
|
||||||
|
def __init__(self, parent=None, fontsize = 11, *args, **kwargs):
|
||||||
|
'''See the __init__ for Tkinter.Toplevel.'''
|
||||||
|
tkinter.Toplevel.__init__(self, parent, *args, **kwargs)
|
||||||
|
|
||||||
|
s = ttk.Style()
|
||||||
|
s.configure('normal.TButton', font=('Helvetica', fontsize), border = 3, relief = 'raised')
|
||||||
|
|
||||||
|
self.withdraw()
|
||||||
|
self.title('Open Galaxy Help')
|
||||||
|
|
||||||
|
self.helptitle = ttk.Label(self, style='title.TLabel', text = '(no text)')
|
||||||
|
self.helptitle.grid(column = 0, row = 0, sticky = "news")
|
||||||
|
self.helpbar = ttk.Separator(self, orient='horizontal')
|
||||||
|
self.helpbar.grid(column = 0, row = 1, sticky = "news")
|
||||||
|
|
||||||
|
self.hframe = tkinter.Frame(self)
|
||||||
|
self.hframe.grid(column = 0, row = 2, sticky = "news")
|
||||||
|
self.hframe.helpdisplay = ttk.Frame(self.hframe)
|
||||||
|
self.hframe.helpdisplay.pack(side = 'left', fill = 'both', expand = 'true')
|
||||||
|
|
||||||
|
self.hframe.helpdisplay.helptext = tkinter.Text(self.hframe.helpdisplay, wrap='word')
|
||||||
|
self.hframe.helpdisplay.helptext.pack(side = 'top', fill = 'both', expand = 'true')
|
||||||
|
# Add scrollbar to help window
|
||||||
|
self.hframe.scrollbar = ttk.Scrollbar(self.hframe)
|
||||||
|
self.hframe.scrollbar.pack(side='right', fill='y')
|
||||||
|
# attach help window to scrollbar
|
||||||
|
self.hframe.helpdisplay.helptext.config(yscrollcommand = self.hframe.scrollbar.set)
|
||||||
|
self.hframe.scrollbar.config(command = self.hframe.helpdisplay.helptext.yview)
|
||||||
|
|
||||||
|
self.hframe.toc = ttk.Treeview(self.hframe, selectmode='browse')
|
||||||
|
self.hframe.toc.bind('<<TreeviewSelect>>', self.toc_to_page)
|
||||||
|
self.hframe.toc.bind('<<TreeviewOpen>>', self.toc_toggle)
|
||||||
|
self.hframe.toc.bind('<<TreeviewClose>>', self.toc_toggle)
|
||||||
|
self.hframe.toc.tag_configure('title', font=('Helvetica', fontsize, 'bold italic'),
|
||||||
|
foreground = 'brown', anchor = 'center')
|
||||||
|
self.hframe.toc.heading('#0', text = "Table of Contents")
|
||||||
|
|
||||||
|
self.bbar = ttk.Frame(self)
|
||||||
|
self.bbar.grid(column = 0, row = 3, sticky = "news")
|
||||||
|
self.bbar.close_button = ttk.Button(self.bbar, text='Close',
|
||||||
|
command=self.close, style = 'normal.TButton')
|
||||||
|
self.bbar.close_button.grid(column=0, row=0, padx = 5)
|
||||||
|
|
||||||
|
self.bbar.prev_button = ttk.Button(self.bbar, text='Prev',
|
||||||
|
command=self.prevpage, style = 'normal.TButton')
|
||||||
|
self.bbar.prev_button.grid(column=1, row=0, padx = 5)
|
||||||
|
|
||||||
|
self.bbar.next_button = ttk.Button(self.bbar, text='Next',
|
||||||
|
command=self.nextpage, style = 'normal.TButton')
|
||||||
|
self.bbar.next_button.grid(column=2, row=0, padx = 5)
|
||||||
|
|
||||||
|
self.bbar.contents_button = ttk.Button(self.bbar, text='Table of Contents',
|
||||||
|
command=self.page_to_toc, style = 'normal.TButton')
|
||||||
|
self.bbar.contents_button.grid(column=3, row=0, padx = 5)
|
||||||
|
|
||||||
|
self.rowconfigure(0, weight=0)
|
||||||
|
self.rowconfigure(1, weight=0)
|
||||||
|
self.rowconfigure(2, weight=1)
|
||||||
|
self.rowconfigure(3, weight=0)
|
||||||
|
self.columnconfigure(0, weight=1)
|
||||||
|
|
||||||
|
# Help pages
|
||||||
|
self.pages = []
|
||||||
|
self.pageno = -1 # No page
|
||||||
|
self.toggle = False
|
||||||
|
|
||||||
|
def grid_configure(self, padx, pady):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def redisplay(self):
|
||||||
|
# remove contents
|
||||||
|
if self.pageno >= 0 and self.pageno < len(self.pages):
|
||||||
|
self.hframe.helpdisplay.helptext.delete('1.0', 'end')
|
||||||
|
self.hframe.helpdisplay.helptext.insert('end', self.pages[self.pageno]['text'])
|
||||||
|
self.helptitle.configure(text = self.pages[self.pageno]['title'])
|
||||||
|
|
||||||
|
def toc_toggle(self, event):
|
||||||
|
self.toggle = True
|
||||||
|
|
||||||
|
def toc_to_page(self, event):
|
||||||
|
treeview = event.widget
|
||||||
|
selection = treeview.item(treeview.selection())
|
||||||
|
|
||||||
|
# Make sure any open/close callback is handled first!
|
||||||
|
self.update_idletasks()
|
||||||
|
if self.toggle:
|
||||||
|
# Item was opened or closed, so consider this a 'false select' and
|
||||||
|
# do not go to the page.
|
||||||
|
self.toggle = False
|
||||||
|
return
|
||||||
|
|
||||||
|
if 'values' in selection:
|
||||||
|
pagenum = selection['values'][0]
|
||||||
|
else:
|
||||||
|
print('Unknown page selected.')
|
||||||
|
pagenum = 0
|
||||||
|
|
||||||
|
# Display a page after displaying the table of contents
|
||||||
|
self.hframe.toc.pack_forget()
|
||||||
|
self.hframe.scrollbar.pack_forget()
|
||||||
|
self.hframe.helpdisplay.pack(side='left', fill='both', expand = 'true')
|
||||||
|
self.hframe.scrollbar.pack(side='right', fill='y')
|
||||||
|
self.hframe.scrollbar.config(command = self.hframe.helpdisplay.helptext.yview)
|
||||||
|
# Enable Prev and Next buttons
|
||||||
|
self.bbar.prev_button.configure(state='enabled')
|
||||||
|
self.bbar.next_button.configure(state='enabled')
|
||||||
|
# Redisplay
|
||||||
|
self.page(pagenum)
|
||||||
|
|
||||||
|
def page_to_toc(self):
|
||||||
|
# Display the table of contents after displaying a page
|
||||||
|
self.hframe.scrollbar.pack_forget()
|
||||||
|
self.hframe.helpdisplay.pack_forget()
|
||||||
|
self.hframe.toc.pack(side='left', fill='both', expand = 'true')
|
||||||
|
self.hframe.scrollbar.pack(side='right', fill='y')
|
||||||
|
self.hframe.scrollbar.config(command = self.hframe.toc.yview)
|
||||||
|
# Disable Prev and Next buttons
|
||||||
|
self.bbar.prev_button.configure(state='disabled')
|
||||||
|
self.bbar.next_button.configure(state='disabled')
|
||||||
|
|
||||||
|
# Simple add page with a single block of plain text
|
||||||
|
def add_page(self, toc_text, text_block):
|
||||||
|
newdict = {}
|
||||||
|
newdict['text'] = text_block
|
||||||
|
newdict['title'] = toc_text
|
||||||
|
self.pages.append(newdict)
|
||||||
|
newpageno = len(self.pages)
|
||||||
|
self.hframe.toc.insert('', 'end', text=str(newpageno) + '. ' + toc_text,
|
||||||
|
tag='title', value = newpageno - 1)
|
||||||
|
if self.pageno < 0:
|
||||||
|
self.pageno = 0 # First page
|
||||||
|
|
||||||
|
# Fill the help text from a file. The format of the file is:
|
||||||
|
# <page_num>
|
||||||
|
# <title>
|
||||||
|
# <text>
|
||||||
|
# '.'
|
||||||
|
# Text is multi-line and ends when '.' is encountered by itself
|
||||||
|
|
||||||
|
def add_pages_from_file(self, filename):
|
||||||
|
endpagerex = re.compile('^\.$')
|
||||||
|
newpagerex = re.compile('^[0-9\.]+$')
|
||||||
|
commentrex = re.compile('^[\-]+$')
|
||||||
|
hierarchy = ''
|
||||||
|
print('Loading help text from file ' + filename)
|
||||||
|
with open(filename, 'r') as f:
|
||||||
|
toc_text = []
|
||||||
|
page_text = []
|
||||||
|
for line in f:
|
||||||
|
if newpagerex.match(line) or endpagerex.match(line):
|
||||||
|
if toc_text and page_text:
|
||||||
|
newdict = {}
|
||||||
|
self.pages.append(newdict)
|
||||||
|
newpageno = len(self.pages)
|
||||||
|
if '.' in hierarchy:
|
||||||
|
pageinfo = hierarchy.rsplit('.', 1)
|
||||||
|
if pageinfo[1] == '':
|
||||||
|
parentid = ''
|
||||||
|
pageid = pageinfo[0]
|
||||||
|
else:
|
||||||
|
parentid = pageinfo[0]
|
||||||
|
pageid = pageinfo[1]
|
||||||
|
else:
|
||||||
|
parentid = ''
|
||||||
|
pageid = hierarchy
|
||||||
|
if parentid:
|
||||||
|
pageid = parentid + '.' + pageid
|
||||||
|
newdict['text'] = page_text
|
||||||
|
newdict['title'] = pageid + '. ' + toc_text
|
||||||
|
self.hframe.toc.insert(parentid, 'end',
|
||||||
|
text=newdict['title'], tag='title',
|
||||||
|
value = newpageno - 1, iid = pageid)
|
||||||
|
if newpagerex.match(line):
|
||||||
|
hierarchy = line.rstrip()
|
||||||
|
toc_text = []
|
||||||
|
elif not toc_text:
|
||||||
|
toc_text = line.rstrip()
|
||||||
|
page_text = []
|
||||||
|
elif not commentrex.match(line):
|
||||||
|
if not page_text:
|
||||||
|
page_text = line
|
||||||
|
else:
|
||||||
|
page_text += line
|
||||||
|
|
||||||
|
def nextpage(self):
|
||||||
|
# Go to next page
|
||||||
|
if self.pageno < len(self.pages) - 1:
|
||||||
|
self.pageno += 1
|
||||||
|
self.redisplay()
|
||||||
|
|
||||||
|
def prevpage(self):
|
||||||
|
# Go to previous page
|
||||||
|
if self.pageno > 0:
|
||||||
|
self.pageno -= 1
|
||||||
|
self.redisplay()
|
||||||
|
|
||||||
|
def page(self, pagenum):
|
||||||
|
# Go to indicated page
|
||||||
|
if pagenum >= 0 and pagenum < len(self.pages):
|
||||||
|
self.pageno = pagenum
|
||||||
|
self.redisplay()
|
||||||
|
|
||||||
|
def close(self):
|
||||||
|
# pop down help window
|
||||||
|
self.withdraw()
|
||||||
|
|
||||||
|
def open(self):
|
||||||
|
# pop up help window
|
||||||
|
self.deiconify()
|
||||||
|
self.lift()
|
||||||
|
|
@ -0,0 +1,5 @@
|
||||||
|
1.
|
||||||
|
Selecting a project
|
||||||
|
-------
|
||||||
|
Start by selecting a project. This step is only necessary if the application is started from the command line. If started from the project manager, then it can only be run if a project was selected.
|
||||||
|
.
|
||||||
|
|
@ -0,0 +1,891 @@
|
||||||
|
#!/bin/env python3
|
||||||
|
#
|
||||||
|
#--------------------------------------------------------
|
||||||
|
# LVS Manager GUI.
|
||||||
|
#
|
||||||
|
# This is a Python tkinter script that handles the
|
||||||
|
# process of running LVS and interpreting results.
|
||||||
|
#
|
||||||
|
#--------------------------------------------------------
|
||||||
|
# Written by Tim Edwards
|
||||||
|
# efabless, inc.
|
||||||
|
# Version 1. November 30, 2016
|
||||||
|
# Version 2. March 6, 2017. Reads JSON format output
|
||||||
|
# Version 3. April 25, 2018. Handles layout vs. verilog
|
||||||
|
#--------------------------------------------------------
|
||||||
|
|
||||||
|
import io
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import sys
|
||||||
|
import json
|
||||||
|
import shutil
|
||||||
|
import signal
|
||||||
|
import socket
|
||||||
|
import select
|
||||||
|
import datetime
|
||||||
|
import contextlib
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
import tkinter
|
||||||
|
from tkinter import ttk
|
||||||
|
from tkinter import filedialog
|
||||||
|
|
||||||
|
import tksimpledialog
|
||||||
|
import tooltip
|
||||||
|
from consoletext import ConsoleText
|
||||||
|
from helpwindow import HelpWindow
|
||||||
|
from treeviewsplit import TreeViewSplit
|
||||||
|
|
||||||
|
# User preferences file (if it exists)
|
||||||
|
prefsfile = '~/.profile/prefs.json'
|
||||||
|
|
||||||
|
netgen_script_dir = 'SUBST_SCRIPT_DIR'
|
||||||
|
|
||||||
|
#------------------------------------------------------
|
||||||
|
# Simple dialog for confirming quit
|
||||||
|
#------------------------------------------------------
|
||||||
|
|
||||||
|
class ConfirmDialog(tksimpledialog.Dialog):
|
||||||
|
def body(self, master, warning, seed):
|
||||||
|
if warning:
|
||||||
|
ttk.Label(master, text=warning, wraplength=500).grid(row = 0, columnspan = 2, sticky = 'wns')
|
||||||
|
return self
|
||||||
|
|
||||||
|
def apply(self):
|
||||||
|
return 'okay'
|
||||||
|
|
||||||
|
#------------------------------------------------------
|
||||||
|
# Main class for this application
|
||||||
|
#------------------------------------------------------
|
||||||
|
|
||||||
|
class LVSManager(ttk.Frame):
|
||||||
|
"""LVS Manager GUI."""
|
||||||
|
|
||||||
|
def __init__(self, parent, *args, **kwargs):
|
||||||
|
ttk.Frame.__init__(self, parent, *args, **kwargs)
|
||||||
|
self.root = parent
|
||||||
|
self.init_gui()
|
||||||
|
parent.protocol("WM_DELETE_WINDOW", self.on_quit)
|
||||||
|
|
||||||
|
def on_quit(self):
|
||||||
|
"""Exits program."""
|
||||||
|
if self.msock:
|
||||||
|
self.msock.close()
|
||||||
|
quit()
|
||||||
|
|
||||||
|
def init_gui(self):
|
||||||
|
"""Builds GUI."""
|
||||||
|
global prefsfile
|
||||||
|
|
||||||
|
message = []
|
||||||
|
fontsize = 11
|
||||||
|
|
||||||
|
# Read user preferences file, get default font size from it.
|
||||||
|
prefspath = os.path.expanduser(prefsfile)
|
||||||
|
if os.path.exists(prefspath):
|
||||||
|
with open(prefspath, 'r') as f:
|
||||||
|
self.prefs = json.load(f)
|
||||||
|
if 'fontsize' in self.prefs:
|
||||||
|
fontsize = self.prefs['fontsize']
|
||||||
|
else:
|
||||||
|
self.prefs = {}
|
||||||
|
|
||||||
|
s = ttk.Style()
|
||||||
|
|
||||||
|
available_themes = s.theme_names()
|
||||||
|
s.theme_use(available_themes[0])
|
||||||
|
|
||||||
|
s.configure('bg.TFrame', background='gray40')
|
||||||
|
s.configure('italic.TLabel', font=('Helvetica', fontsize, 'italic'))
|
||||||
|
s.configure('title.TLabel', font=('Helvetica', fontsize, 'bold italic'),
|
||||||
|
foreground = 'brown', anchor = 'center')
|
||||||
|
s.configure('normal.TLabel', font=('Helvetica', fontsize))
|
||||||
|
s.configure('red.TLabel', font=('Helvetica', fontsize), foreground = 'red')
|
||||||
|
s.configure('green.TLabel', font=('Helvetica', fontsize), foreground = 'green3')
|
||||||
|
s.configure('blue.TLabel', font=('Helvetica', fontsize), foreground = 'blue')
|
||||||
|
s.configure('normal.TButton', font=('Helvetica', fontsize),
|
||||||
|
border = 3, relief = 'raised')
|
||||||
|
s.configure('red.TButton', font=('Helvetica', fontsize), foreground = 'red',
|
||||||
|
border = 3, relief = 'raised')
|
||||||
|
s.configure('green.TButton', font=('Helvetica', fontsize), foreground = 'green3',
|
||||||
|
border = 3, relief = 'raised')
|
||||||
|
s.configure('blue.TButton', font=('Helvetica', fontsize), foreground = 'blue',
|
||||||
|
border = 3, relief = 'raised')
|
||||||
|
s.configure('redtitle.TButton', font=('Helvetica', fontsize, 'bold italic'),
|
||||||
|
foreground = 'red', border = 3, relief = 'raised')
|
||||||
|
s.configure('bluetitle.TButton', font=('Helvetica', fontsize, 'bold italic'),
|
||||||
|
foreground = 'blue', border = 3, relief = 'raised')
|
||||||
|
|
||||||
|
# These values to be overridden from arguments
|
||||||
|
self.rootpath = None
|
||||||
|
self.project = None
|
||||||
|
self.logfile = None
|
||||||
|
self.msock = None
|
||||||
|
self.help = None
|
||||||
|
|
||||||
|
# Create the help window
|
||||||
|
if os.path.exists(netgen_script_dir + '/netgen_help.txt'):
|
||||||
|
self.help = HelpWindow(self, fontsize = fontsize)
|
||||||
|
with io.StringIO() as buf, contextlib.redirect_stdout(buf):
|
||||||
|
self.help.add_pages_from_file('lvs_help.txt')
|
||||||
|
message = buf.getvalue()
|
||||||
|
|
||||||
|
# Set the help display to the first page
|
||||||
|
self.help.page(0)
|
||||||
|
|
||||||
|
# Variables used by option menus and other stuff
|
||||||
|
self.project = "(no selection)"
|
||||||
|
self.layout = "(default)"
|
||||||
|
self.schematic = "(default)"
|
||||||
|
self.tech = "(none)"
|
||||||
|
self.lvs_setup = ''
|
||||||
|
self.lvsdata = {}
|
||||||
|
|
||||||
|
# Root window title
|
||||||
|
self.root.title('LVS Manager')
|
||||||
|
self.root.option_add('*tearOff', 'FALSE')
|
||||||
|
self.pack(side = 'top', fill = 'both', expand = 'true')
|
||||||
|
|
||||||
|
pane = tkinter.PanedWindow(self, orient = 'vertical', sashrelief='groove', sashwidth=6)
|
||||||
|
pane.pack(side = 'top', fill = 'both', expand = 'true')
|
||||||
|
self.toppane = ttk.Frame(pane)
|
||||||
|
self.botpane = ttk.Frame(pane)
|
||||||
|
|
||||||
|
# Get username
|
||||||
|
if 'username' in self.prefs:
|
||||||
|
username = self.prefs['username']
|
||||||
|
else:
|
||||||
|
username = os.environ['USER']
|
||||||
|
|
||||||
|
# Label with the user
|
||||||
|
self.toppane.title_frame = ttk.Frame(self.toppane)
|
||||||
|
self.toppane.title_frame.pack(side = 'top', fill = 'x')
|
||||||
|
|
||||||
|
self.toppane.title_frame.title = ttk.Label(self.toppane.title_frame, text='User:', style = 'red.TLabel')
|
||||||
|
self.toppane.title_frame.user = ttk.Label(self.toppane.title_frame, text=username, style = 'blue.TLabel')
|
||||||
|
|
||||||
|
self.toppane.title_frame.title.grid(column=0, row=0, ipadx = 5)
|
||||||
|
self.toppane.title_frame.user.grid(column=1, row=0, ipadx = 5)
|
||||||
|
|
||||||
|
self.toppane.title2_frame = ttk.Frame(self.toppane)
|
||||||
|
self.toppane.title2_frame.pack(side = 'top', fill = 'x')
|
||||||
|
self.toppane.title2_frame.project_label = ttk.Label(self.toppane.title2_frame, text="Project:",
|
||||||
|
style = 'title.TLabel')
|
||||||
|
self.toppane.title2_frame.project_label.grid(column=0, row=0, ipadx = 5)
|
||||||
|
|
||||||
|
# New project select button
|
||||||
|
self.toppane.title2_frame.project_select = ttk.Button(self.toppane.title2_frame,
|
||||||
|
text=self.project, style='normal.TButton', command=self.choose_project)
|
||||||
|
self.toppane.title2_frame.project_select.grid(column=1, row=0, ipadx = 5)
|
||||||
|
|
||||||
|
tooltip.ToolTip(self.toppane.title2_frame.project_select,
|
||||||
|
text = "Select new project")
|
||||||
|
|
||||||
|
# Show path to project
|
||||||
|
self.toppane.title2_frame.path_label = ttk.Label(self.toppane.title2_frame, text=self.project,
|
||||||
|
style = 'normal.TLabel')
|
||||||
|
self.toppane.title2_frame.path_label.grid(column=2, row=0, ipadx = 5, padx = 10)
|
||||||
|
|
||||||
|
# Show top-level layout cellname with select button. Initial cell name is the top-level cell.
|
||||||
|
self.toppane.title2_frame.tech_label = ttk.Label(self.toppane.title2_frame, text="Technology setup:",
|
||||||
|
style = 'title.TLabel')
|
||||||
|
|
||||||
|
self.toppane.title2_frame.tech_label.grid(column=3, row=0, ipadx = 5)
|
||||||
|
self.toppane.title2_frame.tech_select = ttk.Button(self.toppane.title2_frame,
|
||||||
|
text=self.tech, style='normal.TButton', command=self.choose_tech)
|
||||||
|
self.toppane.title2_frame.tech_select.grid(column=4, row=0, ipadx = 3, padx = 3)
|
||||||
|
|
||||||
|
self.toppane.title2_frame.layout_label = ttk.Label(self.toppane.title2_frame, text="Layout:",
|
||||||
|
style = 'title.TLabel')
|
||||||
|
self.toppane.title2_frame.layout_label.grid(column=0, row=1, ipadx = 5)
|
||||||
|
self.toppane.title2_frame.layout_select = ttk.Button(self.toppane.title2_frame,
|
||||||
|
text=self.layout, style='normal.TButton', command=self.choose_layout)
|
||||||
|
self.toppane.title2_frame.layout_select.grid(column=1, row=1, ipadx = 3, padx = 3)
|
||||||
|
|
||||||
|
# Show top-level schematic cellname with select button. Initial cell name is the top-level cell.
|
||||||
|
self.toppane.title2_frame.schem_label = ttk.Label(self.toppane.title2_frame, text="Schematic:",
|
||||||
|
style = 'title.TLabel')
|
||||||
|
self.toppane.title2_frame.schem_label.grid(column=3, row=1, ipadx = 5)
|
||||||
|
self.toppane.title2_frame.schem_select = ttk.Button(self.toppane.title2_frame,
|
||||||
|
text=self.schematic, style='normal.TButton', command=self.choose_netlist)
|
||||||
|
self.toppane.title2_frame.schem_select.grid(column=4, row=1, ipadx = 3, padx = 3)
|
||||||
|
|
||||||
|
tooltip.ToolTip(self.toppane.title2_frame.project_select,
|
||||||
|
text = "Select new project")
|
||||||
|
tooltip.ToolTip(self.toppane.title2_frame.layout_select,
|
||||||
|
text = "Select a layout subcirucit to compare")
|
||||||
|
tooltip.ToolTip(self.toppane.title2_frame.schem_select,
|
||||||
|
text = "Select a schematic subcirucit to compare")
|
||||||
|
|
||||||
|
#---------------------------------------------
|
||||||
|
ttk.Separator(self.toppane, orient='horizontal').pack(side = 'top', fill = 'x')
|
||||||
|
#---------------------------------------------
|
||||||
|
|
||||||
|
# Create listbox of Circuit1 vs. Circuit2 results
|
||||||
|
height = 10
|
||||||
|
self.toppane.lvsreport = TreeViewSplit(self.toppane, fontsize = fontsize)
|
||||||
|
self.toppane.lvsreport.populate("Layout:", [], "Schematic:", [],
|
||||||
|
[["Run", True, self.run_lvs],
|
||||||
|
# ["Find", True, self.findrecord]
|
||||||
|
], height = height)
|
||||||
|
self.toppane.lvsreport.set_title("Line")
|
||||||
|
self.toppane.lvsreport.pack(side = 'top', fill = 'both', expand = 'true')
|
||||||
|
|
||||||
|
tooltip.ToolTip(self.toppane.lvsreport.get_button(0), text="Run LVS")
|
||||||
|
|
||||||
|
#---------------------------------------------
|
||||||
|
# ttk.Separator(self, orient='horizontal').grid(column=0, row=3, sticky='ew')
|
||||||
|
#---------------------------------------------
|
||||||
|
|
||||||
|
# Add a text window below the project name to capture output. Redirect
|
||||||
|
# print statements to it.
|
||||||
|
|
||||||
|
self.botpane.console = ttk.Frame(self.botpane)
|
||||||
|
self.botpane.console.pack(side = 'top', fill = 'both', expand = 'true')
|
||||||
|
|
||||||
|
self.text_box = ConsoleText(self.botpane.console, wrap='word', height = 4)
|
||||||
|
self.text_box.pack(side='left', fill='both', expand='true')
|
||||||
|
console_scrollbar = ttk.Scrollbar(self.botpane.console)
|
||||||
|
console_scrollbar.pack(side='right', fill='y')
|
||||||
|
# attach console to scrollbar
|
||||||
|
self.text_box.config(yscrollcommand = console_scrollbar.set)
|
||||||
|
console_scrollbar.config(command = self.text_box.yview)
|
||||||
|
|
||||||
|
# Add button bar at the bottom of the window
|
||||||
|
self.botpane.bbar = ttk.Frame(self.botpane)
|
||||||
|
self.botpane.bbar.pack(side = 'top', fill = 'x')
|
||||||
|
|
||||||
|
# Define the "quit" button and action
|
||||||
|
self.botpane.bbar.quit_button = ttk.Button(self.botpane.bbar, text='Quit', command=self.on_quit,
|
||||||
|
style = 'normal.TButton')
|
||||||
|
self.botpane.bbar.quit_button.grid(column=0, row=0, padx = 5)
|
||||||
|
|
||||||
|
# Define help button
|
||||||
|
if self.help:
|
||||||
|
self.botpane.bbar.help_button = ttk.Button(self.botpane.bbar, text='Help',
|
||||||
|
command=self.help.open, style = 'normal.TButton')
|
||||||
|
self.botpane.bbar.help_button.grid(column = 2, row = 0, padx = 5)
|
||||||
|
tooltip.ToolTip(self.botpane.bbar.help_button, text = "Show help window")
|
||||||
|
|
||||||
|
# Add the panes once the internal geometry is known.
|
||||||
|
pane.add(self.toppane)
|
||||||
|
pane.add(self.botpane)
|
||||||
|
pane.paneconfig(self.toppane, stretch='first')
|
||||||
|
|
||||||
|
# Redirect stdout and stderr to the console as the last thing to do. . .
|
||||||
|
# Otherwise errors in the GUI get sucked into the void.
|
||||||
|
|
||||||
|
self.stdout = sys.stdout
|
||||||
|
self.stderr = sys.stderr
|
||||||
|
sys.stdout = ConsoleText.StdoutRedirector(self.text_box)
|
||||||
|
sys.stderr = ConsoleText.StderrRedirector(self.text_box)
|
||||||
|
|
||||||
|
if message:
|
||||||
|
print(message)
|
||||||
|
|
||||||
|
def logprint(self, message, doflush=False):
|
||||||
|
if self.logfile:
|
||||||
|
self.logfile.buffer.write(message.encode('utf-8'))
|
||||||
|
self.logfile.buffer.write('\n'.encode('utf-8'))
|
||||||
|
if doflush:
|
||||||
|
self.logfile.flush()
|
||||||
|
|
||||||
|
def printout(self, output):
|
||||||
|
# Generate output
|
||||||
|
if not output:
|
||||||
|
return
|
||||||
|
|
||||||
|
outlines = output.splitlines()
|
||||||
|
for line in outlines:
|
||||||
|
try:
|
||||||
|
print(line)
|
||||||
|
except TypeError:
|
||||||
|
line = line.decode('utf-8')
|
||||||
|
pritn(line)
|
||||||
|
|
||||||
|
def printwarn(self, output):
|
||||||
|
# Check output for warning or error
|
||||||
|
if not output:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
warnrex = re.compile('.*warning', re.IGNORECASE)
|
||||||
|
errrex = re.compile('.*error', re.IGNORECASE)
|
||||||
|
|
||||||
|
errors = 0
|
||||||
|
outlines = output.splitlines()
|
||||||
|
for line in outlines:
|
||||||
|
try:
|
||||||
|
wmatch = warnrex.match(line)
|
||||||
|
except TypeError:
|
||||||
|
line = line.decode('utf-8')
|
||||||
|
wmatch = warnrex.match(line)
|
||||||
|
ematch = errrex.match(line)
|
||||||
|
if ematch:
|
||||||
|
errors += 1
|
||||||
|
if ematch or wmatch:
|
||||||
|
print(line)
|
||||||
|
return errors
|
||||||
|
|
||||||
|
def choose_tech(self):
|
||||||
|
try:
|
||||||
|
project_path = self.rootpath
|
||||||
|
initdirname = self.rootpath + '/tech',
|
||||||
|
except:
|
||||||
|
print('Must choose a project first.')
|
||||||
|
return
|
||||||
|
techname = filedialog.askopenfilename(multiple=False,
|
||||||
|
initialdir = initdirname,
|
||||||
|
filetypes = (("Tcl script", "*.tcl"),("All Files","*.*")),
|
||||||
|
title = "Choose a netgen technology setup script.")
|
||||||
|
if techname != '':
|
||||||
|
print("Selected technology setup script " + techname)
|
||||||
|
techbase = os.path.split(techname)[1]
|
||||||
|
self.tech = os.path.splitext(techbase)[0]
|
||||||
|
self.lvs_setup = techname
|
||||||
|
self.toppane.title2_frame.tech_select.config(text = self.tech)
|
||||||
|
|
||||||
|
def choose_layout(self):
|
||||||
|
try:
|
||||||
|
project_path = self.rootpath
|
||||||
|
initdirname = self.rootpath + '/layout',
|
||||||
|
except:
|
||||||
|
print('Must choose a project first.')
|
||||||
|
return
|
||||||
|
cellname = filedialog.askopenfilename(multiple=False,
|
||||||
|
initialdir = initdirname,
|
||||||
|
filetypes = (("Magic layout", "*.mag"),("All Files","*.*")),
|
||||||
|
title = "Choose a layout cell to compare.")
|
||||||
|
if cellname != '':
|
||||||
|
print("Selected compare cell " + cellname)
|
||||||
|
self.layout = cellname
|
||||||
|
cellbase = os.path.split(cellname)[1]
|
||||||
|
layoutname = os.path.splitext(cellbase)[0]
|
||||||
|
self.toppane.title2_frame.layout_select.config(text = layoutname)
|
||||||
|
fileext = os.path.splitext(cellbase)[1]
|
||||||
|
if fileext == '.mag':
|
||||||
|
self.toppane.title2_frame.layout_label.config(text = 'Layout:')
|
||||||
|
else:
|
||||||
|
self.toppane.title2_frame.layout_label.config(text = 'Layout netlist:')
|
||||||
|
|
||||||
|
def choose_netlist(self):
|
||||||
|
try:
|
||||||
|
project_path = self.rootpath
|
||||||
|
initdirname = self.rootpath + '/netlist/' + self.project + '.spice'
|
||||||
|
except:
|
||||||
|
print('Must choose a project first.')
|
||||||
|
return
|
||||||
|
cellname = filedialog.askopenfilename(multiple=False,
|
||||||
|
initialdir = initdirname,
|
||||||
|
filetypes = (("Spice netlist", "*.spice"),("Verilog netlist", "*.v"),("All Files","*.*")),
|
||||||
|
title = "Choose a netlist to compare.")
|
||||||
|
if cellname != '':
|
||||||
|
print("Selected compare cell " + cellname)
|
||||||
|
self.schematic = cellname
|
||||||
|
cellbase = os.path.split(cellname)[1]
|
||||||
|
schematic_name = os.path.splitext(cellbase)[0]
|
||||||
|
self.toppane.title2_frame.schem_select.config(text = schematic_name)
|
||||||
|
fileext = os.path.splitext(cellbase)[1]
|
||||||
|
if fileext == '.v':
|
||||||
|
self.toppane.title2_frame.schem_label.config(text = 'Verilog netlist:')
|
||||||
|
elif fileext == '.sp' or fileext == '.spice' or fileext == '.spi' or fileext == '.spc' or fileext == '.ckt':
|
||||||
|
self.toppane.title2_frame.schem_label.config(text = 'SPICE netlist:')
|
||||||
|
elif fileext == '.cdl':
|
||||||
|
self.toppane.title2_frame.schem_label.config(text = 'CDL netlist:')
|
||||||
|
else:
|
||||||
|
self.toppane.title2_frame.schem_label.config(text = 'Unknown netlist:')
|
||||||
|
|
||||||
|
def choose_project(self):
|
||||||
|
project = filedialog.askdirectory(initialdir = os.getcwd(),
|
||||||
|
title = "Find a project.")
|
||||||
|
if project != '':
|
||||||
|
print("Selected project " + str(project))
|
||||||
|
result = self.set_project(project)
|
||||||
|
|
||||||
|
def set_project(self, rootpath, project_name=None):
|
||||||
|
|
||||||
|
# Check if rootpath is valid. For LVS, there should be subdirectories
|
||||||
|
# "layout/" and "netlist/" or "verilog/".
|
||||||
|
|
||||||
|
haslay = os.path.isdir(rootpath + '/layout')
|
||||||
|
hasvlog = os.path.isdir(rootpath + '/verilog')
|
||||||
|
hasnet = os.path.isdir(rootpath + '/netlist')
|
||||||
|
if not haslay or not (hasvlog or hasnet):
|
||||||
|
if not haslay:
|
||||||
|
print("Project path has no layout (/layout) subdirectory.")
|
||||||
|
if not (hasvlog or hasnet):
|
||||||
|
print("Project path has no verilog (/verilog), or netlist (/netlist) subdirectory.")
|
||||||
|
# Continue anyway; assume that netlists will be selected manually
|
||||||
|
|
||||||
|
if self.logfile:
|
||||||
|
self.logfile.close()
|
||||||
|
self.logfile = None
|
||||||
|
|
||||||
|
if not project_name:
|
||||||
|
project = os.path.split(rootpath)[1]
|
||||||
|
else:
|
||||||
|
project = project_name
|
||||||
|
|
||||||
|
if self.project != project:
|
||||||
|
|
||||||
|
self.rootpath = rootpath
|
||||||
|
self.project = project
|
||||||
|
|
||||||
|
# Clear out old project data
|
||||||
|
self.toppane.lvsreport.repopulate([], [])
|
||||||
|
|
||||||
|
# Close any open logfile.
|
||||||
|
if self.logfile:
|
||||||
|
self.logfile.close()
|
||||||
|
self.logfile = None
|
||||||
|
|
||||||
|
# Put new log file called 'lvs.log' in the mag/ subdirectory
|
||||||
|
if os.path.exists(rootpath + '/layout'):
|
||||||
|
self.logfile = open(rootpath + '/layout/lvs.log', 'w')
|
||||||
|
else:
|
||||||
|
self.logfile = open(rootpath + '/lvs.log', 'w')
|
||||||
|
# Print some initial information to the logfile.
|
||||||
|
self.logprint('Starting new log file ' + datetime.datetime.now().strftime('%c'),
|
||||||
|
doflush=True)
|
||||||
|
|
||||||
|
# Update project button
|
||||||
|
self.toppane.title2_frame.project_select.config(text = self.project)
|
||||||
|
self.toppane.title2_frame.path_label.config(text = self.rootpath)
|
||||||
|
# Cell name is the same as project name initially
|
||||||
|
self.layout = self.project
|
||||||
|
self.schematic = self.project
|
||||||
|
layname = os.path.splitext(os.path.split(self.layout)[1])[0]
|
||||||
|
self.toppane.title2_frame.layout_select.config(text = layname)
|
||||||
|
schemname = os.path.splitext(os.path.split(self.schematic)[1])[0]
|
||||||
|
self.toppane.title2_frame.schem_select.config(text = schemname)
|
||||||
|
|
||||||
|
# Update schematic button
|
||||||
|
if os.path.splitext(self.schematic)[1] == '.v':
|
||||||
|
self.toppane.title2_frame.schem_label.config(text = 'Verilog netlist:')
|
||||||
|
else:
|
||||||
|
self.toppane.title2_frame.schem_label.config(text = 'Schematic netlist:')
|
||||||
|
|
||||||
|
# Update layout button
|
||||||
|
if os.path.splitext(self.layout)[1] == '.mag':
|
||||||
|
self.toppane.title2_frame.schem_label.config(text = 'Layout:')
|
||||||
|
else:
|
||||||
|
self.toppane.title2_frame.schem_label.config(text = 'Layout netlist:')
|
||||||
|
|
||||||
|
# If there is a comparison file that post-dates both netlists, load it.
|
||||||
|
self.check_lvs()
|
||||||
|
return True
|
||||||
|
|
||||||
|
def check_layout_out_of_date(self, spipath, layoutpath):
|
||||||
|
# Check if a netlist (spipath) is out-of-date relative to the layouts
|
||||||
|
# (layoutpath). Need to read the netlist and check all of the subcells.
|
||||||
|
need_capture = False
|
||||||
|
if not os.path.isfile(spipath):
|
||||||
|
return True
|
||||||
|
if os.path.isfile(layoutpath):
|
||||||
|
spi_statbuf = os.stat(spipath)
|
||||||
|
lay_statbuf = os.stat(layoutpath)
|
||||||
|
if spi_statbuf.st_mtime < lay_statbuf.st_mtime:
|
||||||
|
# netlist exists but is out-of-date
|
||||||
|
need_capture = True
|
||||||
|
else:
|
||||||
|
# only found that the top-level-layout is older than the
|
||||||
|
# netlist. Now need to read the netlist, find all subcircuits,
|
||||||
|
# and check those dates, too.
|
||||||
|
layoutdir = os.path.split(layoutpath)[0]
|
||||||
|
subrex = re.compile('^[^\*]*[ \t]*.subckt[ \t]+([^ \t]+).*$', re.IGNORECASE)
|
||||||
|
with open(spipath, 'r') as ifile:
|
||||||
|
duttext = ifile.read()
|
||||||
|
|
||||||
|
dutlines = duttext.replace('\n+', ' ').splitlines()
|
||||||
|
for line in dutlines:
|
||||||
|
lmatch = subrex.match(line)
|
||||||
|
if lmatch:
|
||||||
|
subname = lmatch.group(1)
|
||||||
|
sublayout = layoutdir + '/' + subname + '.mag'
|
||||||
|
# subcircuits that cannot be found in the current directory are
|
||||||
|
# assumed to be library components and therefore never out-of-date.
|
||||||
|
if os.path.exists(sublayout):
|
||||||
|
sub_statbuf = os.stat(sublayout)
|
||||||
|
if spi_statbuf.st_mtime < lay_statbuf.st_mtime:
|
||||||
|
# netlist exists but is out-of-date
|
||||||
|
need_capture = True
|
||||||
|
break
|
||||||
|
return need_capture
|
||||||
|
|
||||||
|
def check_schematic_out_of_date(self, spipath, schempath):
|
||||||
|
# Check if a netlist (spipath) is out-of-date relative to the schematics
|
||||||
|
# (schempath). Need to read the netlist and check all of the subcells.
|
||||||
|
need_capture = False
|
||||||
|
if not os.path.isfile(spipath):
|
||||||
|
return True
|
||||||
|
if os.path.isfile(schempath):
|
||||||
|
spi_statbuf = os.stat(spipath)
|
||||||
|
sch_statbuf = os.stat(schempath)
|
||||||
|
if spi_statbuf.st_mtime < sch_statbuf.st_mtime:
|
||||||
|
# netlist exists but is out-of-date
|
||||||
|
need_capture = True
|
||||||
|
else:
|
||||||
|
# only found that the top-level-schematic is older than the
|
||||||
|
# netlist. Now need to read the netlist, find all subcircuits,
|
||||||
|
# and check those dates, too.
|
||||||
|
schemdir = os.path.split(schempath)[0]
|
||||||
|
subrex = re.compile('^[^\*]*[ \t]*.subckt[ \t]+([^ \t]+).*$', re.IGNORECASE)
|
||||||
|
with open(spipath, 'r') as ifile:
|
||||||
|
duttext = ifile.read()
|
||||||
|
|
||||||
|
dutlines = duttext.replace('\n+', ' ').splitlines()
|
||||||
|
for line in dutlines:
|
||||||
|
lmatch = subrex.match(line)
|
||||||
|
if lmatch:
|
||||||
|
subname = lmatch.group(1)
|
||||||
|
# NOTE: Electric uses library:cell internally to track libraries,
|
||||||
|
# and maps the ":" to "__" in the netlist. Not entirely certain that
|
||||||
|
# the double-underscore uniquely identifies the library:cell. . .
|
||||||
|
librex = re.compile('(.*)__(.*)', re.IGNORECASE)
|
||||||
|
lmatch = librex.match(subname)
|
||||||
|
if lmatch:
|
||||||
|
elecpath = os.path.split(os.path.split(schempath)[0])[0]
|
||||||
|
libname = lmatch.group(1)
|
||||||
|
subschem = elecpath + '/' + libname + '.delib/' + lmatch.group(2) + '.sch'
|
||||||
|
else:
|
||||||
|
libname = {}
|
||||||
|
subschem = schemdir + '/' + subname + '.sch'
|
||||||
|
# subcircuits that cannot be found in the current directory are
|
||||||
|
# assumed to be library components and therefore never out-of-date.
|
||||||
|
if os.path.exists(subschem):
|
||||||
|
sub_statbuf = os.stat(subschem)
|
||||||
|
if spi_statbuf.st_mtime < sub_statbuf.st_mtime:
|
||||||
|
# netlist exists but is out-of-date
|
||||||
|
need_capture = True
|
||||||
|
break
|
||||||
|
# mapping of characters to what's allowed in SPICE makes finding
|
||||||
|
# the associated schematic file a bit difficult. Requires wild-card
|
||||||
|
# searching.
|
||||||
|
elif libname:
|
||||||
|
restr = lmatch.group(2) + '.sch'
|
||||||
|
restr = restr.replace('.', '\.')
|
||||||
|
restr = restr.replace('_', '.')
|
||||||
|
schrex = re.compile(restr, re.IGNORECASE)
|
||||||
|
libpath = elecpath + '/' + libname + '.delib'
|
||||||
|
if os.path.exists(libpath):
|
||||||
|
liblist = os.listdir(libpath)
|
||||||
|
for file in liblist:
|
||||||
|
lmatch = schrex.match(file)
|
||||||
|
if lmatch:
|
||||||
|
subschem = libpath + '/' + file
|
||||||
|
sub_statbuf = os.stat(subschem)
|
||||||
|
if spi_statbuf.st_mtime < sch_statbuf.st_mtime:
|
||||||
|
# netlist exists but is out-of-date
|
||||||
|
need_capture = True
|
||||||
|
break
|
||||||
|
return need_capture
|
||||||
|
|
||||||
|
def check_lvs(self):
|
||||||
|
# If both netlists exist, and comp.json is more recent than both, then
|
||||||
|
# load LVS results from comp.json
|
||||||
|
project_path = self.rootpath
|
||||||
|
project_name = self.project
|
||||||
|
layout_path = project_path + '/layout/' + project_name + '.spice'
|
||||||
|
net_path = project_path + '/netlist/' + project_name + '.spice'
|
||||||
|
comp_path = project_path + '/layout/comp.json'
|
||||||
|
|
||||||
|
if os.path.exists(layout_path) and os.path.exists(net_path) and os.path.exists(comp_path):
|
||||||
|
magtime = os.stat(layout_path).st_mtime
|
||||||
|
schemtime = os.stat(net_path).st_mtime
|
||||||
|
comptime = os.stat(comp_path).st_mtime
|
||||||
|
if comptime > magtime and comptime > schemtime:
|
||||||
|
print("Loading LVS results from file.")
|
||||||
|
self.generate(comp_path)
|
||||||
|
|
||||||
|
def generate_layout_netlist(self, layout_path, layout_src, project_path):
|
||||||
|
# Does layout netlist exist and is it current?
|
||||||
|
if self.check_layout_out_of_date(layout_path, layout_src):
|
||||||
|
print('Generating layout netlist.')
|
||||||
|
self.update_idletasks()
|
||||||
|
mproc = subprocess.Popen(['magic', '-dnull', '-noconsole',
|
||||||
|
self.layout], stdin = subprocess.PIPE, stdout = subprocess.PIPE,
|
||||||
|
stderr = subprocess.PIPE, cwd = project_path + '/layout',
|
||||||
|
universal_newlines = True)
|
||||||
|
mproc.stdin.write("select top cell\n")
|
||||||
|
mproc.stdin.write("expand\n")
|
||||||
|
mproc.stdin.write("extract all\n")
|
||||||
|
mproc.stdin.write("ext2spice hierarchy on\n")
|
||||||
|
mproc.stdin.write("ext2spice format ngspice\n")
|
||||||
|
mproc.stdin.write("ext2spice scale off\n")
|
||||||
|
mproc.stdin.write("ext2spice renumber off\n")
|
||||||
|
mproc.stdin.write("ext2spice subcircuit top auto\n")
|
||||||
|
mproc.stdin.write("ext2spice cthresh infinite\n")
|
||||||
|
mproc.stdin.write("ext2spice rthresh infinite\n")
|
||||||
|
mproc.stdin.write("ext2spice blackbox on\n")
|
||||||
|
mproc.stdin.write("ext2spice -o " + self.layout + ".spice\n")
|
||||||
|
mproc.stdin.write("quit -noprompt\n")
|
||||||
|
magicout = mproc.communicate()[0]
|
||||||
|
self.printwarn(magicout)
|
||||||
|
if mproc.returncode != 0:
|
||||||
|
print('Failure to generate new layout netlist.')
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Move .spice netlist to project_dir/netlist/lvs/
|
||||||
|
shutil.move(project_path + '/layout/' + self.layout + '.spice', layout_path)
|
||||||
|
# Remove extraction files
|
||||||
|
for file in os.listdir(project_path + '/layout'):
|
||||||
|
if os.path.splitext(file)[1] == '.ext':
|
||||||
|
os.remove(project_path + '/layout/' + file)
|
||||||
|
else:
|
||||||
|
print('Layout netlist is up-to-date, not regenerating.')
|
||||||
|
return True
|
||||||
|
|
||||||
|
def run_lvs(self, value):
|
||||||
|
# "value" is ignored (?)
|
||||||
|
|
||||||
|
# Check if netlists exist and are current; otherwise create them.
|
||||||
|
# Then run LVS.
|
||||||
|
|
||||||
|
project_path = self.rootpath
|
||||||
|
project_name = self.project
|
||||||
|
|
||||||
|
# Diagnostic:
|
||||||
|
print('project_name is ' + project_name)
|
||||||
|
print('project_path is ' + project_path)
|
||||||
|
print('self.layout is ' + self.layout)
|
||||||
|
print('self.schematic is ' + self.schematic)
|
||||||
|
print('self.lvs_setup is ' + self.lvs_setup)
|
||||||
|
|
||||||
|
has_vlog = False
|
||||||
|
vlog_path = project_path + '/verilog/' + project_name + '.v'
|
||||||
|
|
||||||
|
if os.path.isfile(self.layout):
|
||||||
|
layout_path = self.layout
|
||||||
|
layout_src = None
|
||||||
|
else:
|
||||||
|
layout_path = project_path + '/netlist/lvs/' + self.layout + '.spice'
|
||||||
|
layout_src = project_path + '/layout/' + self.layout + '.mag'
|
||||||
|
|
||||||
|
comp_dir = os.path.split(layout_path)[0]
|
||||||
|
comp_path = comp_dir + '/comp.json'
|
||||||
|
|
||||||
|
if os.path.isfile(self.schematic):
|
||||||
|
net_path = self.schematic
|
||||||
|
else:
|
||||||
|
net_path = project_path + '/netlist/schem/' + self.schematic + '.spice'
|
||||||
|
|
||||||
|
# Does the setup file exist (this is optional)?
|
||||||
|
if self.lvs_setup == '' and not os.path.isfile('setup.tcl'):
|
||||||
|
print('No technology setup file selected.')
|
||||||
|
elif not os.path.isfile(self.lvs_setup):
|
||||||
|
print("Can't find technology setup file " + self.lvs_setup)
|
||||||
|
|
||||||
|
# Does schematic netlist exist?
|
||||||
|
if not os.path.isfile(vlog_path) and not os.path.isfile(net_path):
|
||||||
|
print('Error: No schematic netlist or verilog netlist.')
|
||||||
|
return
|
||||||
|
|
||||||
|
# Does LVS netlist subdirectory exist?
|
||||||
|
if os.path.exists(project_path + '/netlist'):
|
||||||
|
if not os.path.exists(project_path + '/netlist/lvs'):
|
||||||
|
os.makedirs(project_path + '/netlist/lvs')
|
||||||
|
|
||||||
|
# Does layout netlist exist and is it current?
|
||||||
|
if layout_src:
|
||||||
|
if not self.generate_layout_netlist(layout_path, layout_src, project_path):
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Final checks
|
||||||
|
if not os.path.isfile(layout_path):
|
||||||
|
print('Error: No netlist generated from magic.')
|
||||||
|
return
|
||||||
|
|
||||||
|
else:
|
||||||
|
# Read in netlist and convert commas from [X,Y] arrays to vertical bars
|
||||||
|
# as something that can be converted back as necessary. ngspice treats
|
||||||
|
# commas as special characters for some reason.
|
||||||
|
with open(layout_path) as ifile:
|
||||||
|
spitext = ifile.read()
|
||||||
|
|
||||||
|
# Check the netlist to see if the cell to match is a subcircuit. If
|
||||||
|
# not, then assume it is the top level.
|
||||||
|
|
||||||
|
layoutcell = os.path.splitext(os.path.split(self.layout)[1])[0]
|
||||||
|
is_subckt = False
|
||||||
|
subname = None
|
||||||
|
subrex = re.compile('^[^\*]*[ \t]*.subckt[ \t]+([^ \t]+).*$', re.IGNORECASE)
|
||||||
|
dutlines = spitext.replace('\n+', ' ').splitlines()
|
||||||
|
for line in dutlines:
|
||||||
|
lmatch = subrex.match(line)
|
||||||
|
if lmatch:
|
||||||
|
subname = lmatch.group(1)
|
||||||
|
if subname == layoutcell:
|
||||||
|
is_subckt = True
|
||||||
|
break
|
||||||
|
|
||||||
|
if is_subckt:
|
||||||
|
layout_arg = self.layout + ' ' + layoutcell
|
||||||
|
layout_text = '"' + layout_arg + '"'
|
||||||
|
elif subname:
|
||||||
|
layout_arg = self.layout + ' ' + subname
|
||||||
|
layout_text = '"' + layout_arg + '"'
|
||||||
|
else:
|
||||||
|
layout_arg = layout_path
|
||||||
|
layout_text = layout_arg
|
||||||
|
|
||||||
|
if has_vlog:
|
||||||
|
schem_arg = vlog_path + ' ' + self.schematic
|
||||||
|
else:
|
||||||
|
# Final checks
|
||||||
|
if not os.path.isfile(net_path):
|
||||||
|
print('Error: No netlist from schematic.')
|
||||||
|
return
|
||||||
|
|
||||||
|
with open(net_path) as ifile:
|
||||||
|
spitext = ifile.read()
|
||||||
|
|
||||||
|
# Check the netlist to see if the cell to match is a subcircuit. If
|
||||||
|
# not, then assume it is the top level.
|
||||||
|
|
||||||
|
schemcell = os.path.splitext(os.path.split(self.schematic)[1])[0]
|
||||||
|
subname = None
|
||||||
|
is_subckt = False
|
||||||
|
subrex = re.compile('^[^\*]*[ \t]*.subckt[ \t]+([^ \t]+).*$', re.IGNORECASE)
|
||||||
|
dutlines = spitext.replace('\n+', ' ').splitlines()
|
||||||
|
for line in dutlines:
|
||||||
|
lmatch = subrex.match(line)
|
||||||
|
if lmatch:
|
||||||
|
subname = lmatch.group(1)
|
||||||
|
if subname == schemcell:
|
||||||
|
is_subckt = True
|
||||||
|
break
|
||||||
|
|
||||||
|
if is_subckt:
|
||||||
|
schem_arg = self.schematic + ' ' + schemcell
|
||||||
|
schem_text = '"' + schem_arg + '"'
|
||||||
|
elif subname:
|
||||||
|
schem_arg = self.schematic + ' ' + subname
|
||||||
|
schem_text = '"' + schem_arg + '"'
|
||||||
|
else:
|
||||||
|
schem_arg = net_path
|
||||||
|
schem_text = schem_arg
|
||||||
|
|
||||||
|
# Remove any previous comparison output file
|
||||||
|
comp_out_path = os.path.splitext(comp_path)[0] + '.out'
|
||||||
|
if os.path.exists(comp_out_path):
|
||||||
|
os.remove(comp_out_path)
|
||||||
|
|
||||||
|
# Run netgen as subprocess
|
||||||
|
print('Running: netgen -batch lvs ' + layout_text +
|
||||||
|
' ' + schem_text + ' ' + self.lvs_setup + ' ' + comp_out_path +
|
||||||
|
' -json -blackbox')
|
||||||
|
# Note: Because arguments to subprocess are list items, the {filename cell}
|
||||||
|
# pair does *not* have to be quoted or braced. Doing so causes a parse
|
||||||
|
# error.
|
||||||
|
self.lvsproc = subprocess.Popen(['netgen', '-batch', 'lvs',
|
||||||
|
layout_arg, schem_arg,
|
||||||
|
self.lvs_setup, comp_out_path, '-json', '-blackbox'],
|
||||||
|
cwd=comp_dir,
|
||||||
|
stdout=subprocess.PIPE, stderr=subprocess.PIPE, bufsize=0)
|
||||||
|
# This is largely unnecessary as netgen usually runs to completion very quickly.
|
||||||
|
self.watchclock(comp_path)
|
||||||
|
|
||||||
|
def watchclock(self, filename):
|
||||||
|
if self.lvsproc == None:
|
||||||
|
return
|
||||||
|
|
||||||
|
lvs_status = self.lvsproc.poll()
|
||||||
|
sresult = select.select([self.lvsproc.stdout, self.lvsproc.stderr], [], [], 0)[0]
|
||||||
|
if self.lvsproc.stdout in sresult:
|
||||||
|
outstring = self.lvsproc.stdout.readline().decode().strip()
|
||||||
|
self.logprint(outstring, doflush=True)
|
||||||
|
print(outstring)
|
||||||
|
elif self.lvsproc.stderr in sresult:
|
||||||
|
errstring = self.lvsproc.stderr.readline().decode().strip()
|
||||||
|
self.logprint(errstring, doflush = True)
|
||||||
|
print(errstring, file=sys.stderr)
|
||||||
|
|
||||||
|
if lvs_status != None:
|
||||||
|
print("netgen LVS exited with status " + str(lvs_status))
|
||||||
|
self.lvsproc = None
|
||||||
|
if lvs_status != 0:
|
||||||
|
print('Errors encountered in LVS.')
|
||||||
|
self.logprint('Errors in LVS, lvs status = ' + str(lvs_status), doflush=True)
|
||||||
|
# Done; now read comp.json and fill the treeview listbox.
|
||||||
|
self.generate(filename)
|
||||||
|
else:
|
||||||
|
self.after(500, lambda: self.watchclock(filename))
|
||||||
|
|
||||||
|
# Generate display from "comp.out" file (json file now preferred)
|
||||||
|
|
||||||
|
def generate_orig(self, lvspath):
|
||||||
|
lefttext = []
|
||||||
|
righttext = []
|
||||||
|
print("Reading LVS output file " + lvspath)
|
||||||
|
if os.path.exists(lvspath):
|
||||||
|
with open(lvspath, 'r') as ifile:
|
||||||
|
lvslines = ifile.read().splitlines()
|
||||||
|
for line in lvslines:
|
||||||
|
if '|' in line:
|
||||||
|
# parts = line.split('|')
|
||||||
|
# lefttext.append(parts[0])
|
||||||
|
# righttext.append(parts[1])
|
||||||
|
lefttext.append(line[0:42].strip())
|
||||||
|
righttext.append(line[44:].strip())
|
||||||
|
else:
|
||||||
|
lefttext.append(line)
|
||||||
|
righttext.append('')
|
||||||
|
# Populate treeview with text
|
||||||
|
self.toppane.lvsreport.repopulate(lefttext, righttext)
|
||||||
|
|
||||||
|
else:
|
||||||
|
print("Error: No output file generated from LVS.")
|
||||||
|
|
||||||
|
# Generate output from LVS report JSON file comp.json
|
||||||
|
|
||||||
|
def generate(self, lvspath):
|
||||||
|
lefttext = []
|
||||||
|
righttext = []
|
||||||
|
print("Reading LVS output file " + lvspath)
|
||||||
|
if os.path.exists(lvspath):
|
||||||
|
with open(lvspath, 'r') as ifile:
|
||||||
|
self.lvsdata = json.load(ifile)
|
||||||
|
|
||||||
|
# Populate treeview with text
|
||||||
|
self.toppane.lvsreport.json_repopulate(self.lvsdata)
|
||||||
|
|
||||||
|
else:
|
||||||
|
print("Error: No output file generated from LVS.")
|
||||||
|
|
||||||
|
def findrecord(self, value):
|
||||||
|
print("Unimplemented function")
|
||||||
|
|
||||||
|
def findrecord_test(self, value):
|
||||||
|
# Check if socket is defined; if not, attempt to open one
|
||||||
|
if not self.msock:
|
||||||
|
try:
|
||||||
|
self.msock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
|
except:
|
||||||
|
print("No response from layout tool.")
|
||||||
|
|
||||||
|
if self.msock:
|
||||||
|
self.msock.connect(("0.0.0.0", 12946))
|
||||||
|
self.msock.setblocking(False)
|
||||||
|
if self.msock:
|
||||||
|
# Pull name of net or device from 'value'
|
||||||
|
# This is a test:
|
||||||
|
self.msock.sendall(b'box 0 0 100 100\r\n')
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
options = []
|
||||||
|
arguments = []
|
||||||
|
for item in sys.argv[1:]:
|
||||||
|
if item.find('-', 0) == 0:
|
||||||
|
options.append(item)
|
||||||
|
else:
|
||||||
|
arguments.append(item)
|
||||||
|
|
||||||
|
root = tkinter.Tk()
|
||||||
|
app = LVSManager(root)
|
||||||
|
if arguments:
|
||||||
|
if len(arguments) >= 2:
|
||||||
|
app.set_project(arguments[0], project_name=arguments[1])
|
||||||
|
else:
|
||||||
|
app.set_project(arguments[0])
|
||||||
|
|
||||||
|
root.mainloop()
|
||||||
|
|
@ -0,0 +1,86 @@
|
||||||
|
#!/bin/env python3
|
||||||
|
#
|
||||||
|
# Dialog class for tkinter
|
||||||
|
|
||||||
|
import os
|
||||||
|
import tkinter
|
||||||
|
from tkinter import ttk
|
||||||
|
|
||||||
|
class Dialog(tkinter.Toplevel):
|
||||||
|
|
||||||
|
def __init__(self, parent, message = None, title = None, seed = None, border = 'blue', **kwargs):
|
||||||
|
|
||||||
|
tkinter.Toplevel.__init__(self, parent)
|
||||||
|
self.transient(parent)
|
||||||
|
|
||||||
|
if title:
|
||||||
|
self.title(title)
|
||||||
|
|
||||||
|
self.configure(background=border, padx=2, pady=2)
|
||||||
|
self.obox = ttk.Frame(self)
|
||||||
|
self.obox.pack(side = 'left', fill = 'both', expand = 'true')
|
||||||
|
|
||||||
|
self.parent = parent
|
||||||
|
self.result = None
|
||||||
|
body = ttk.Frame(self.obox)
|
||||||
|
self.initial_focus = self.body(body, message, seed, **kwargs)
|
||||||
|
body.pack(padx = 5, pady = 5)
|
||||||
|
self.buttonbox()
|
||||||
|
self.grab_set()
|
||||||
|
|
||||||
|
if not self.initial_focus:
|
||||||
|
self.initial_focus = self
|
||||||
|
|
||||||
|
self.protocol("WM_DELETE_WINDOW", self.cancel)
|
||||||
|
self.geometry("+%d+%d" % (parent.winfo_rootx() + 50,
|
||||||
|
parent.winfo_rooty() + 50))
|
||||||
|
|
||||||
|
self.initial_focus.focus_set()
|
||||||
|
self.wait_window(self)
|
||||||
|
|
||||||
|
# Construction hooks
|
||||||
|
|
||||||
|
def body(self, master, **kwargs):
|
||||||
|
# Create dialog body. Return widget that should have
|
||||||
|
# initial focus. This method should be overridden
|
||||||
|
pass
|
||||||
|
|
||||||
|
def buttonbox(self):
|
||||||
|
# Add standard button box. Override if you don't want the
|
||||||
|
# standard buttons
|
||||||
|
|
||||||
|
box = ttk.Frame(self.obox)
|
||||||
|
|
||||||
|
self.okb = ttk.Button(box, text="OK", width=10, command=self.ok, default='active')
|
||||||
|
self.okb.pack(side='left', padx=5, pady=5)
|
||||||
|
w = ttk.Button(box, text="Cancel", width=10, command=self.cancel)
|
||||||
|
w.pack(side='left', padx=5, pady=5)
|
||||||
|
|
||||||
|
self.bind("<Return>", self.ok)
|
||||||
|
self.bind("<Escape>", self.cancel)
|
||||||
|
box.pack(fill='x', expand='true')
|
||||||
|
|
||||||
|
# Standard button semantics
|
||||||
|
|
||||||
|
def ok(self, event=None):
|
||||||
|
|
||||||
|
if not self.validate():
|
||||||
|
self.initial_focus.focus_set() # put focus back
|
||||||
|
return
|
||||||
|
|
||||||
|
self.withdraw()
|
||||||
|
self.update_idletasks()
|
||||||
|
self.result = self.apply()
|
||||||
|
self.cancel()
|
||||||
|
|
||||||
|
def cancel(self, event=None):
|
||||||
|
|
||||||
|
# Put focus back to the parent window
|
||||||
|
self.parent.focus_set()
|
||||||
|
self.destroy()
|
||||||
|
|
||||||
|
def validate(self):
|
||||||
|
return 1 # Override this
|
||||||
|
|
||||||
|
def apply(self):
|
||||||
|
return None # Override this
|
||||||
|
|
@ -0,0 +1,158 @@
|
||||||
|
#!/bin/env python3
|
||||||
|
'''Michael Lange <klappnase (at) freakmail (dot) de>
|
||||||
|
The ToolTip class provides a flexible tooltip widget for tkinter; it is based on IDLE's ToolTip
|
||||||
|
module which unfortunately seems to be broken (at least the version I saw).
|
||||||
|
INITIALIZATION OPTIONS:
|
||||||
|
anchor : where the text should be positioned inside the widget, must be on of "n", "s", "e", "w", "nw" and so on;
|
||||||
|
default is "center"
|
||||||
|
bd : borderwidth of the widget; default is 1 (NOTE: don't use "borderwidth" here)
|
||||||
|
bg : background color to use for the widget; default is "lightyellow" (NOTE: don't use "background")
|
||||||
|
delay : time in ms that it takes for the widget to appear on the screen when the mouse pointer has
|
||||||
|
entered the parent widget; default is 1500
|
||||||
|
fg : foreground (i.e. text) color to use; default is "black" (NOTE: don't use "foreground")
|
||||||
|
follow_mouse : if set to 1 the tooltip will follow the mouse pointer instead of being displayed
|
||||||
|
outside of the parent widget; this may be useful if you want to use tooltips for
|
||||||
|
large widgets like listboxes or canvases; default is 0
|
||||||
|
font : font to use for the widget; default is system specific
|
||||||
|
justify : how multiple lines of text will be aligned, must be "left", "right" or "center"; default is "left"
|
||||||
|
padx : extra space added to the left and right within the widget; default is 4
|
||||||
|
pady : extra space above and below the text; default is 2
|
||||||
|
relief : one of "flat", "ridge", "groove", "raised", "sunken" or "solid"; default is "solid"
|
||||||
|
state : must be "normal" or "disabled"; if set to "disabled" the tooltip will not appear; default is "normal"
|
||||||
|
text : the text that is displayed inside the widget
|
||||||
|
textvariable : if set to an instance of tkinter.StringVar() the variable's value will be used as text for the widget
|
||||||
|
width : width of the widget; the default is 0, which means that "wraplength" will be used to limit the widgets width
|
||||||
|
wraplength : limits the number of characters in each line; default is 150
|
||||||
|
|
||||||
|
WIDGET METHODS:
|
||||||
|
configure(**opts) : change one or more of the widget's options as described above; the changes will take effect the
|
||||||
|
next time the tooltip shows up; NOTE: follow_mouse cannot be changed after widget initialization
|
||||||
|
|
||||||
|
Other widget methods that might be useful if you want to subclass ToolTip:
|
||||||
|
enter() : callback when the mouse pointer enters the parent widget
|
||||||
|
leave() : called when the mouse pointer leaves the parent widget
|
||||||
|
motion() : is called when the mouse pointer moves inside the parent widget if follow_mouse is set to 1 and the
|
||||||
|
tooltip has shown up to continually update the coordinates of the tooltip window
|
||||||
|
coords() : calculates the screen coordinates of the tooltip window
|
||||||
|
create_contents() : creates the contents of the tooltip window (by default a tkinter.Label)
|
||||||
|
'''
|
||||||
|
# Ideas gleaned from PySol
|
||||||
|
|
||||||
|
import tkinter
|
||||||
|
|
||||||
|
class ToolTip:
|
||||||
|
def __init__(self, master, text='Your text here', delay=1500, **opts):
|
||||||
|
self.master = master
|
||||||
|
self._opts = {'anchor':'center', 'bd':1, 'bg':'lightyellow', 'delay':delay, 'fg':'black',\
|
||||||
|
'follow_mouse':0, 'font':None, 'justify':'left', 'padx':4, 'pady':2,\
|
||||||
|
'relief':'solid', 'state':'normal', 'text':text, 'textvariable':None,\
|
||||||
|
'width':0, 'wraplength':150}
|
||||||
|
self.configure(**opts)
|
||||||
|
self._tipwindow = None
|
||||||
|
self._id = None
|
||||||
|
self._id1 = self.master.bind("<Enter>", self.enter, '+')
|
||||||
|
self._id2 = self.master.bind("<Leave>", self.leave, '+')
|
||||||
|
self._id3 = self.master.bind("<ButtonPress>", self.leave, '+')
|
||||||
|
self._follow_mouse = 0
|
||||||
|
if self._opts['follow_mouse']:
|
||||||
|
self._id4 = self.master.bind("<Motion>", self.motion, '+')
|
||||||
|
self._follow_mouse = 1
|
||||||
|
|
||||||
|
def configure(self, **opts):
|
||||||
|
for key in opts:
|
||||||
|
if key in self._opts:
|
||||||
|
self._opts[key] = opts[key]
|
||||||
|
else:
|
||||||
|
KeyError = 'KeyError: Unknown option: "%s"' %key
|
||||||
|
raise KeyError
|
||||||
|
|
||||||
|
##----these methods handle the callbacks on "<Enter>", "<Leave>" and "<Motion>"---------------##
|
||||||
|
##----events on the parent widget; override them if you want to change the widget's behavior--##
|
||||||
|
|
||||||
|
def enter(self, event=None):
|
||||||
|
self._schedule()
|
||||||
|
|
||||||
|
def leave(self, event=None):
|
||||||
|
self._unschedule()
|
||||||
|
self._hide()
|
||||||
|
|
||||||
|
def motion(self, event=None):
|
||||||
|
if self._tipwindow and self._follow_mouse:
|
||||||
|
x, y = self.coords()
|
||||||
|
self._tipwindow.wm_geometry("+%d+%d" % (x, y))
|
||||||
|
|
||||||
|
##------the methods that do the work:---------------------------------------------------------##
|
||||||
|
|
||||||
|
def _schedule(self):
|
||||||
|
self._unschedule()
|
||||||
|
if self._opts['state'] == 'disabled':
|
||||||
|
return
|
||||||
|
self._id = self.master.after(self._opts['delay'], self._show)
|
||||||
|
|
||||||
|
def _unschedule(self):
|
||||||
|
id = self._id
|
||||||
|
self._id = None
|
||||||
|
if id:
|
||||||
|
self.master.after_cancel(id)
|
||||||
|
|
||||||
|
def _show(self):
|
||||||
|
if self._opts['state'] == 'disabled':
|
||||||
|
self._unschedule()
|
||||||
|
return
|
||||||
|
if not self._tipwindow:
|
||||||
|
self._tipwindow = tw = tkinter.Toplevel(self.master)
|
||||||
|
# hide the window until we know the geometry
|
||||||
|
tw.withdraw()
|
||||||
|
tw.wm_overrideredirect(1)
|
||||||
|
|
||||||
|
if tw.tk.call("tk", "windowingsystem") == 'aqua':
|
||||||
|
tw.tk.call("::tk::unsupported::MacWindowStyle", "style", tw._w, "help", "none")
|
||||||
|
|
||||||
|
self.create_contents()
|
||||||
|
tw.update_idletasks()
|
||||||
|
x, y = self.coords()
|
||||||
|
tw.wm_geometry("+%d+%d" % (x, y))
|
||||||
|
tw.deiconify()
|
||||||
|
tw.lift()
|
||||||
|
|
||||||
|
def _hide(self):
|
||||||
|
tw = self._tipwindow
|
||||||
|
self._tipwindow = None
|
||||||
|
if tw:
|
||||||
|
tw.destroy()
|
||||||
|
|
||||||
|
##----these methods might be overridden in derived classes:----------------------------------##
|
||||||
|
|
||||||
|
def coords(self):
|
||||||
|
# The tip window must be completely outside the master widget;
|
||||||
|
# otherwise when the mouse enters the tip window we get
|
||||||
|
# a leave event and it disappears, and then we get an enter
|
||||||
|
# event and it reappears, and so on forever :-(
|
||||||
|
# or we take care that the mouse pointer is always outside the tipwindow :-)
|
||||||
|
tw = self._tipwindow
|
||||||
|
twx, twy = tw.winfo_reqwidth(), tw.winfo_reqheight()
|
||||||
|
w, h = tw.winfo_screenwidth(), tw.winfo_screenheight()
|
||||||
|
# calculate the y coordinate:
|
||||||
|
if self._follow_mouse:
|
||||||
|
y = tw.winfo_pointery() + 20
|
||||||
|
# make sure the tipwindow is never outside the screen:
|
||||||
|
if y + twy > h:
|
||||||
|
y = y - twy - 30
|
||||||
|
else:
|
||||||
|
y = self.master.winfo_rooty() + self.master.winfo_height() + 3
|
||||||
|
if y + twy > h:
|
||||||
|
y = self.master.winfo_rooty() - twy - 3
|
||||||
|
# we can use the same x coord in both cases:
|
||||||
|
x = tw.winfo_pointerx() - twx / 2
|
||||||
|
if x < 0:
|
||||||
|
x = 0
|
||||||
|
elif x + twx > w:
|
||||||
|
x = w - twx
|
||||||
|
return x, y
|
||||||
|
|
||||||
|
def create_contents(self):
|
||||||
|
opts = self._opts.copy()
|
||||||
|
for opt in ('delay', 'follow_mouse', 'state'):
|
||||||
|
del opts[opt]
|
||||||
|
label = tkinter.Label(self._tipwindow, **opts)
|
||||||
|
label.pack()
|
||||||
|
|
@ -0,0 +1,653 @@
|
||||||
|
#!/bin/env python3
|
||||||
|
#
|
||||||
|
# Simple ttk treeview with split view, scrollbar, and
|
||||||
|
# row of callback buttons
|
||||||
|
|
||||||
|
import os
|
||||||
|
import re
|
||||||
|
import itertools
|
||||||
|
|
||||||
|
import tkinter
|
||||||
|
from tkinter import ttk
|
||||||
|
|
||||||
|
#------------------------------------------------------
|
||||||
|
# Tree view used as a multi-column list box
|
||||||
|
#------------------------------------------------------
|
||||||
|
|
||||||
|
class TreeViewSplit(ttk.Frame):
|
||||||
|
def __init__(self, parent, fontsize=11, *args, **kwargs):
|
||||||
|
ttk.Frame.__init__(self, parent, *args, **kwargs)
|
||||||
|
s = ttk.Style()
|
||||||
|
s.configure('normal.TLabel', font=('Helvetica', fontsize))
|
||||||
|
s.configure('title.TLabel', font=('Helvetica', fontsize, 'bold'))
|
||||||
|
s.configure('normal.TButton', font=('Helvetica', fontsize),
|
||||||
|
border = 3, relief = 'raised')
|
||||||
|
s.configure('Treeview.Heading', font=('Helvetica', fontsize, 'bold'))
|
||||||
|
s.configure('Treeview.Column', font=('Helvetica', fontsize))
|
||||||
|
self.fontsize = fontsize
|
||||||
|
|
||||||
|
# Last item is a list of 2-item lists, each containing the name of a button
|
||||||
|
# to place along the button bar at the bottom, and a callback function to
|
||||||
|
# run when the button is pressed.
|
||||||
|
|
||||||
|
def populate(self, title1="", item1list=[], title2="", item2list=[], buttons=[], height=10):
|
||||||
|
self.item1list = item1list[:]
|
||||||
|
self.item2list = item2list[:]
|
||||||
|
columns = [0, 1]
|
||||||
|
|
||||||
|
treeFrame = ttk.Frame(self)
|
||||||
|
treeFrame.pack(side='top', padx=5, pady=5, fill='both', expand='true')
|
||||||
|
|
||||||
|
scrollBar = ttk.Scrollbar(treeFrame)
|
||||||
|
scrollBar.pack(side='right', fill='y')
|
||||||
|
self.treeView = ttk.Treeview(treeFrame, selectmode='browse', columns=columns, height=height)
|
||||||
|
self.treeView.pack(side='left', fill='both', expand='true')
|
||||||
|
scrollBar.config(command=self.treeView.yview)
|
||||||
|
self.treeView.config(yscrollcommand=scrollBar.set)
|
||||||
|
self.treeView.column('#0', width=120, stretch='false')
|
||||||
|
self.treeView.heading(0, text=title1, anchor='w')
|
||||||
|
self.treeView.heading(1, text=title2, anchor='w')
|
||||||
|
buttonFrame = ttk.Frame(self)
|
||||||
|
buttonFrame.pack(side='bottom', fill='x')
|
||||||
|
|
||||||
|
self.treeView.tag_configure('select',background='darkslategray',foreground='white')
|
||||||
|
|
||||||
|
# Test type tags
|
||||||
|
self.treeView.tag_configure('error', font=('Helvetica', self.fontsize - 1), foreground = 'red')
|
||||||
|
self.treeView.tag_configure('clean', font=('Helvetica', self.fontsize - 1), foreground = 'green3')
|
||||||
|
self.treeView.tag_configure('normal', font=('Helvetica', self.fontsize - 1), foreground = 'black')
|
||||||
|
self.treeView.tag_configure('prep', font=('Helvetica', self.fontsize, 'bold italic'),
|
||||||
|
foreground = 'black', anchor = 'center')
|
||||||
|
self.treeView.tag_configure('header1', font=('Helvetica', self.fontsize, 'bold italic'),
|
||||||
|
foreground = 'brown', anchor = 'center')
|
||||||
|
self.treeView.tag_configure('header2', font=('Helvetica', self.fontsize - 1, 'bold'),
|
||||||
|
foreground = 'blue', anchor = 'center')
|
||||||
|
self.treeView.tag_configure('header3', font=('Helvetica', self.fontsize - 1, 'italic'),
|
||||||
|
foreground = 'green4', anchor = 'center')
|
||||||
|
self.treeView.tag_configure('header4', font=('Helvetica', self.fontsize - 1),
|
||||||
|
foreground = 'purple', anchor = 'center')
|
||||||
|
|
||||||
|
|
||||||
|
self.func_buttons = []
|
||||||
|
for button in buttons:
|
||||||
|
func = button[2]
|
||||||
|
# Each func_buttons entry is a list of two items; first is the
|
||||||
|
# button widget, and the second is a boolean that is True if the
|
||||||
|
# button is to be present always, False if the button is only
|
||||||
|
# present when there are entries in the itemlists.
|
||||||
|
self.func_buttons.append([ttk.Button(buttonFrame, text=button[0],
|
||||||
|
style = 'normal.TButton',
|
||||||
|
command = lambda func=func: self.func_callback(func)),
|
||||||
|
button[1]])
|
||||||
|
|
||||||
|
self.selectcallback = None
|
||||||
|
self.lastselected = None
|
||||||
|
self.lasttag = None
|
||||||
|
self.repopulate(item1list, item2list)
|
||||||
|
|
||||||
|
def get_button(self, index):
|
||||||
|
if index >= 0 and index < len(self.func_buttons):
|
||||||
|
return self.func_buttons[index][0]
|
||||||
|
else:
|
||||||
|
return None
|
||||||
|
|
||||||
|
def set_title(self, title):
|
||||||
|
self.treeView.heading('#0', text=title, anchor='w')
|
||||||
|
|
||||||
|
def repopulate(self, item1list=[], item2list=[]):
|
||||||
|
|
||||||
|
# Remove all children of treeview
|
||||||
|
self.treeView.delete(*self.treeView.get_children())
|
||||||
|
|
||||||
|
self.item1list = item1list[:]
|
||||||
|
self.item2list = item2list[:]
|
||||||
|
lines = max(len(self.item1list), len(self.item2list))
|
||||||
|
|
||||||
|
# Parse the information coming from comp.out. This is preferably
|
||||||
|
# handled from inside netgen, but that requires development in netgen.
|
||||||
|
# Note: A top-level group is denoted by an empty string.
|
||||||
|
|
||||||
|
nested = ['']
|
||||||
|
if lines > 0:
|
||||||
|
# print("Create item ID 0 parent = ''")
|
||||||
|
self.treeView.insert(nested[-1], 'end', text='-', iid='0',
|
||||||
|
value=['Initialize', 'Initialize'], tags=['prep'])
|
||||||
|
nested.append('0')
|
||||||
|
tagstyle = 'header1'
|
||||||
|
|
||||||
|
emptyrec = re.compile('^[\t ]*$')
|
||||||
|
subrex = re.compile('Subcircuit summary')
|
||||||
|
cktrex = re.compile('Circuit[\t ]+[12]:[\t ]+([^ \t]+)')
|
||||||
|
netrex = re.compile('NET mismatches')
|
||||||
|
devrex = re.compile('DEVICE mismatches')
|
||||||
|
seprex = re.compile('-----')
|
||||||
|
sumrex = re.compile('Netlists ')
|
||||||
|
matchrex = re.compile('.*\*\*Mismatch\*\*')
|
||||||
|
incircuit = False
|
||||||
|
watchgroup = False
|
||||||
|
groupnum = 0
|
||||||
|
|
||||||
|
for item1, item2, index in zip(self.item1list, self.item2list, range(lines)):
|
||||||
|
cname1 = 'Layout' # Placeholder
|
||||||
|
cname2 = 'Schematic' # Placeholder
|
||||||
|
|
||||||
|
# Remove blank lines from the display
|
||||||
|
lmatch = emptyrec.match(item1)
|
||||||
|
if lmatch:
|
||||||
|
lmatch = emptyrec.match(item2)
|
||||||
|
if lmatch:
|
||||||
|
continue
|
||||||
|
index = str(index + 1)
|
||||||
|
# Parse text to determine how to structure and display it.
|
||||||
|
tagstyle = 'normal'
|
||||||
|
nextnest = None
|
||||||
|
lmatch = subrex.match(item1)
|
||||||
|
if lmatch:
|
||||||
|
nested = [''] # pop back to topmost level
|
||||||
|
nextnest = index
|
||||||
|
tagstyle = 'header1'
|
||||||
|
incircuit = False
|
||||||
|
watchgroup = False
|
||||||
|
groupnum = 0
|
||||||
|
item1 = 'Layout compare'
|
||||||
|
item2 = 'Schematic compare'
|
||||||
|
else:
|
||||||
|
lmatch = cktrex.match(item1)
|
||||||
|
if lmatch and not incircuit:
|
||||||
|
# Pick up circuit names and replace them in the title, then use them
|
||||||
|
# for all following titles.
|
||||||
|
cname1 = lmatch.group(1)
|
||||||
|
lmatch = cktrex.match(item2)
|
||||||
|
cname2 = lmatch.group(1)
|
||||||
|
print("Circuit names " + cname1 + " " + cname2)
|
||||||
|
# Rewrite title
|
||||||
|
cktitem = self.treeView.item(nested[-1], values=[cname1 + ' compare',
|
||||||
|
cname2 + ' compare'])
|
||||||
|
nextnest = index
|
||||||
|
tagstyle = 'header2'
|
||||||
|
incircuit = True
|
||||||
|
item1 = cname1 + ' Summary'
|
||||||
|
item2 = cname2 + ' Summary'
|
||||||
|
elif lmatch:
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
lmatch = netrex.match(item1)
|
||||||
|
if lmatch:
|
||||||
|
if watchgroup:
|
||||||
|
nested = nested[0:-1]
|
||||||
|
nested = nested[0:-1]
|
||||||
|
nextnest = index
|
||||||
|
tagstyle = 'header2'
|
||||||
|
groupnum = 1
|
||||||
|
watchgroup = True
|
||||||
|
item1 = cname1 + ' Net mismatches'
|
||||||
|
item2 = cname2 + ' Net mismatches'
|
||||||
|
else:
|
||||||
|
lmatch = devrex.match(item1)
|
||||||
|
if lmatch:
|
||||||
|
if watchgroup:
|
||||||
|
nested = nested[0:-1]
|
||||||
|
nested = nested[0:-1]
|
||||||
|
nextnest = index
|
||||||
|
tagstyle = 'header2'
|
||||||
|
groupnum = 1
|
||||||
|
watchgroup = True
|
||||||
|
item1 = cname1 + ' Device mismatches'
|
||||||
|
item2 = cname2 + ' Device mismatches'
|
||||||
|
else:
|
||||||
|
lmatch = seprex.match(item1)
|
||||||
|
if lmatch:
|
||||||
|
if watchgroup:
|
||||||
|
tagstyle = 'header3'
|
||||||
|
item1 = 'Group ' + str(groupnum)
|
||||||
|
item2 = 'Group ' + str(groupnum)
|
||||||
|
if groupnum > 1:
|
||||||
|
nested = nested[0:-1]
|
||||||
|
groupnum += 1
|
||||||
|
nextnest = index
|
||||||
|
watchgroup = False
|
||||||
|
else:
|
||||||
|
if groupnum > 0:
|
||||||
|
watchgroup = True
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
lmatch = sumrex.match(item1)
|
||||||
|
if lmatch:
|
||||||
|
if watchgroup:
|
||||||
|
nested = nested[0:-1]
|
||||||
|
nested = nested[0:-1]
|
||||||
|
watchgroup = False
|
||||||
|
tagstyle = 'header2'
|
||||||
|
groupnum = 0
|
||||||
|
|
||||||
|
lmatch1 = matchrex.match(item1)
|
||||||
|
lmatch2 = matchrex.match(item2)
|
||||||
|
if lmatch1 or lmatch2:
|
||||||
|
tagstyle='error'
|
||||||
|
|
||||||
|
# print("Create item ID " + str(index) + " parent = " + str(nested[-1]))
|
||||||
|
self.treeView.insert(nested[-1], 'end', text=index, iid=index, value=[item1, item2],
|
||||||
|
tags=[tagstyle])
|
||||||
|
|
||||||
|
if nextnest:
|
||||||
|
nested.append(nextnest)
|
||||||
|
|
||||||
|
for button in self.func_buttons:
|
||||||
|
button[0].pack_forget()
|
||||||
|
|
||||||
|
if lines == 0:
|
||||||
|
self.treeView.insert('', 'end', text='-', value=['(no items)', '(no items)'])
|
||||||
|
for button in self.func_buttons:
|
||||||
|
if button[1]:
|
||||||
|
button[0].pack(side='left', padx = 5)
|
||||||
|
else:
|
||||||
|
for button in self.func_buttons:
|
||||||
|
button[0].pack(side='left', padx = 5)
|
||||||
|
|
||||||
|
# Special routine to pull in the JSON file data produced by netgen-1.5.72
|
||||||
|
def json_repopulate(self, lvsdata):
|
||||||
|
|
||||||
|
# Remove all children of treeview
|
||||||
|
self.treeView.delete(*self.treeView.get_children())
|
||||||
|
|
||||||
|
# Parse the information coming from comp.out. This is preferably
|
||||||
|
# handled from inside netgen, but that requires development in netgen.
|
||||||
|
# Note: A top-level group is denoted by an empty string.
|
||||||
|
|
||||||
|
index = 0
|
||||||
|
errtotal = {}
|
||||||
|
errtotal['net'] = 0
|
||||||
|
errtotal['netmatch'] = 0
|
||||||
|
errtotal['device'] = 0
|
||||||
|
errtotal['devmatch'] = 0
|
||||||
|
errtotal['property'] = 0
|
||||||
|
errtotal['pin'] = 0
|
||||||
|
ncells = len(lvsdata)
|
||||||
|
for c in range(0, ncells):
|
||||||
|
cellrec = lvsdata[c]
|
||||||
|
if c == ncells - 1:
|
||||||
|
topcell = True
|
||||||
|
else:
|
||||||
|
topcell = False
|
||||||
|
|
||||||
|
errcell = {}
|
||||||
|
errcell['net'] = 0
|
||||||
|
errcell['netmatch'] = 0
|
||||||
|
errcell['device'] = 0
|
||||||
|
errcell['devmatch'] = 0
|
||||||
|
errcell['property'] = 0
|
||||||
|
errcell['pin'] = 0;
|
||||||
|
|
||||||
|
cname1 = 'Layout'
|
||||||
|
cname2 = 'Schematic'
|
||||||
|
|
||||||
|
# cellrec is a dictionary. Parse the cell summary, then failing nets,
|
||||||
|
# devices, and properties, and finally pins.
|
||||||
|
|
||||||
|
if 'name' in cellrec:
|
||||||
|
names = cellrec['name']
|
||||||
|
cname1 = names[0]
|
||||||
|
cname2 = names[1]
|
||||||
|
else:
|
||||||
|
# This is an error but don't halt the program because of it.
|
||||||
|
cname1 = '(unknown layout)'
|
||||||
|
cname2 = '(unknown schematic)'
|
||||||
|
|
||||||
|
item1 = cname1
|
||||||
|
item2 = cname2
|
||||||
|
tagstyle = 'header1'
|
||||||
|
index += 1
|
||||||
|
nest0 = index
|
||||||
|
self.treeView.insert('', 'end', text=index, iid=index, value=[item1, item2],
|
||||||
|
tags=[tagstyle])
|
||||||
|
|
||||||
|
if 'devices' in cellrec or 'nets' in cellrec:
|
||||||
|
item1 = cname1 + " Summary"
|
||||||
|
item2 = cname2 + " Summary"
|
||||||
|
tagstyle = 'header2'
|
||||||
|
index += 1
|
||||||
|
nest1 = index
|
||||||
|
self.treeView.insert(nest0, 'end', text=index, iid=index, value=[item1, item2],
|
||||||
|
tags=[tagstyle])
|
||||||
|
|
||||||
|
if 'devices' in cellrec:
|
||||||
|
item1 = cname1 + " Devices"
|
||||||
|
item2 = cname2 + " Devices"
|
||||||
|
tagstyle = 'header3'
|
||||||
|
index += 1
|
||||||
|
nest2 = index
|
||||||
|
self.treeView.insert(nest1, 'end', text=index, iid=index, value=[item1, item2],
|
||||||
|
tags=[tagstyle])
|
||||||
|
|
||||||
|
devices = cellrec['devices']
|
||||||
|
devlist = [val for pair in zip(devices[0], devices[1]) for val in pair]
|
||||||
|
devpair = list(devlist[p:p + 2] for p in range(0, len(devlist), 2))
|
||||||
|
for dev in devpair:
|
||||||
|
c1dev = dev[0]
|
||||||
|
c2dev = dev[1]
|
||||||
|
|
||||||
|
item1 = c1dev[0] + "(" + str(c1dev[1]) + ")"
|
||||||
|
item2 = c2dev[0] + "(" + str(c2dev[1]) + ")"
|
||||||
|
|
||||||
|
diffdevs = abs(c1dev[1] - c2dev[1])
|
||||||
|
if diffdevs == 0:
|
||||||
|
tagstyle = 'normal'
|
||||||
|
else:
|
||||||
|
tagstyle = 'error'
|
||||||
|
errcell['device'] += diffdevs
|
||||||
|
if topcell:
|
||||||
|
errtotal['device'] += diffdevs
|
||||||
|
index += 1
|
||||||
|
nest2 = index
|
||||||
|
self.treeView.insert(nest1, 'end', text=index, iid=index,
|
||||||
|
value=[item1, item2], tags=[tagstyle])
|
||||||
|
|
||||||
|
if 'nets' in cellrec:
|
||||||
|
item1 = cname1 + " Nets"
|
||||||
|
item2 = cname2 + " Nets"
|
||||||
|
tagstyle = 'header3'
|
||||||
|
index += 1
|
||||||
|
nest2 = index
|
||||||
|
self.treeView.insert(nest1, 'end', text=index, iid=index, value=[item1, item2],
|
||||||
|
tags=[tagstyle])
|
||||||
|
|
||||||
|
nets = cellrec['nets']
|
||||||
|
|
||||||
|
item1 = nets[0]
|
||||||
|
item2 = nets[1]
|
||||||
|
diffnets = abs(nets[0] - nets[1])
|
||||||
|
if diffnets == 0:
|
||||||
|
tagstyle = 'normal'
|
||||||
|
else:
|
||||||
|
tagstyle = 'error'
|
||||||
|
errcell['net'] = diffnets
|
||||||
|
if topcell:
|
||||||
|
errtotal['net'] += diffnets
|
||||||
|
index += 1
|
||||||
|
nest2 = index
|
||||||
|
self.treeView.insert(nest1, 'end', text=index, iid=index,
|
||||||
|
value=[item1, item2], tags=[tagstyle])
|
||||||
|
|
||||||
|
if 'badnets' in cellrec:
|
||||||
|
badnets = cellrec['badnets']
|
||||||
|
|
||||||
|
if len(badnets) > 0:
|
||||||
|
item1 = cname1 + " Net Mismatches"
|
||||||
|
item2 = cname2 + " Net Mismatches"
|
||||||
|
tagstyle = 'header2'
|
||||||
|
index += 1
|
||||||
|
nest1 = index
|
||||||
|
self.treeView.insert(nest0, 'end', text=index, iid=index,
|
||||||
|
value=[item1, item2], tags=[tagstyle])
|
||||||
|
|
||||||
|
groupnum = 0
|
||||||
|
for group in badnets:
|
||||||
|
groupc1 = group[0]
|
||||||
|
groupc2 = group[1]
|
||||||
|
nnets = len(groupc1)
|
||||||
|
|
||||||
|
groupnum += 1
|
||||||
|
tagstyle = 'header3'
|
||||||
|
index += 1
|
||||||
|
nest2 = index
|
||||||
|
item1 = "Group " + str(groupnum) + ' (' + str(nnets) + ' nets)'
|
||||||
|
self.treeView.insert(nest1, 'end', text=index, iid=index,
|
||||||
|
value=[item1, item1], tags=[tagstyle])
|
||||||
|
|
||||||
|
tagstyle = 'error'
|
||||||
|
errcell['netmatch'] += nnets
|
||||||
|
if topcell:
|
||||||
|
errtotal['netmatch'] += nnets
|
||||||
|
|
||||||
|
for netnum in range(0, nnets):
|
||||||
|
if netnum > 0:
|
||||||
|
item1 = ""
|
||||||
|
index += 1
|
||||||
|
nest3 = index
|
||||||
|
self.treeView.insert(nest2, 'end', text=index, iid=index,
|
||||||
|
value=[item1, item1], tags=[tagstyle])
|
||||||
|
|
||||||
|
net1 = groupc1[netnum]
|
||||||
|
net2 = groupc2[netnum]
|
||||||
|
tagstyle = 'header4'
|
||||||
|
item1 = net1[0]
|
||||||
|
item2 = net2[0]
|
||||||
|
index += 1
|
||||||
|
nest3 = index
|
||||||
|
self.treeView.insert(nest2, 'end', text=index, iid=index,
|
||||||
|
value=[item1, item2], tags=[tagstyle])
|
||||||
|
|
||||||
|
# Pad shorter device list to the length of the longer one
|
||||||
|
netdevs = list(itertools.zip_longest(net1[1], net2[1]))
|
||||||
|
for devpair in netdevs:
|
||||||
|
devc1 = devpair[0]
|
||||||
|
devc2 = devpair[1]
|
||||||
|
tagstyle = 'normal'
|
||||||
|
if devc1 and devc1[0] != "":
|
||||||
|
item1 = devc1[0] + '/' + devc1[1] + ' = ' + str(devc1[2])
|
||||||
|
else:
|
||||||
|
item1 = ""
|
||||||
|
if devc2 and devc2[0] != "":
|
||||||
|
item2 = devc2[0] + '/' + devc2[1] + ' = ' + str(devc2[2])
|
||||||
|
else:
|
||||||
|
item2 = ""
|
||||||
|
index += 1
|
||||||
|
nest3 = index
|
||||||
|
self.treeView.insert(nest2, 'end', text=index, iid=index,
|
||||||
|
value=[item1, item2], tags=[tagstyle])
|
||||||
|
|
||||||
|
if 'badelements' in cellrec:
|
||||||
|
badelements = cellrec['badelements']
|
||||||
|
|
||||||
|
if len(badelements) > 0:
|
||||||
|
item1 = cname1 + " Device Mismatches"
|
||||||
|
item2 = cname2 + " Device Mismatches"
|
||||||
|
tagstyle = 'header2'
|
||||||
|
index += 1
|
||||||
|
nest1 = index
|
||||||
|
self.treeView.insert(nest0, 'end', text=index, iid=index,
|
||||||
|
value=[item1, item2], tags=[tagstyle])
|
||||||
|
|
||||||
|
groupnum = 0
|
||||||
|
for group in badelements:
|
||||||
|
groupc1 = group[0]
|
||||||
|
groupc2 = group[1]
|
||||||
|
ndevs = len(groupc1)
|
||||||
|
|
||||||
|
groupnum += 1
|
||||||
|
tagstyle = 'header3'
|
||||||
|
index += 1
|
||||||
|
nest2 = index
|
||||||
|
item1 = "Group " + str(groupnum) + ' (' + str(ndevs) + ' devices)'
|
||||||
|
self.treeView.insert(nest1, 'end', text=index, iid=index,
|
||||||
|
value=[item1, item1], tags=[tagstyle])
|
||||||
|
|
||||||
|
tagstyle = 'error'
|
||||||
|
errcell['devmatch'] += ndevs
|
||||||
|
if topcell:
|
||||||
|
errtotal['devmatch'] += ndevs
|
||||||
|
|
||||||
|
for elemnum in range(0, ndevs):
|
||||||
|
if elemnum > 0:
|
||||||
|
item1 = ""
|
||||||
|
index += 1
|
||||||
|
nest3 = index
|
||||||
|
self.treeView.insert(nest2, 'end', text=index, iid=index,
|
||||||
|
value=[item1, item1], tags=[tagstyle])
|
||||||
|
|
||||||
|
elem1 = groupc1[elemnum]
|
||||||
|
elem2 = groupc2[elemnum]
|
||||||
|
tagstyle = 'header4'
|
||||||
|
item1 = elem1[0]
|
||||||
|
item2 = elem2[0]
|
||||||
|
index += 1
|
||||||
|
nest3 = index
|
||||||
|
self.treeView.insert(nest2, 'end', text=index, iid=index,
|
||||||
|
value=[item1, item2], tags=[tagstyle])
|
||||||
|
|
||||||
|
# Pad shorter pin list to the length of the longer one
|
||||||
|
elempins = list(itertools.zip_longest(elem1[1], elem2[1]))
|
||||||
|
for pinpair in elempins:
|
||||||
|
pinc1 = pinpair[0]
|
||||||
|
pinc2 = pinpair[1]
|
||||||
|
tagstyle = 'normal'
|
||||||
|
if pinc1 and pinc1[0] != "":
|
||||||
|
item1 = pinc1[0] + ' = ' + str(pinc1[1])
|
||||||
|
else:
|
||||||
|
item1 = ""
|
||||||
|
if pinc2 and pinc2[0] != "":
|
||||||
|
item2 = pinc2[0] + ' = ' + str(pinc2[1])
|
||||||
|
else:
|
||||||
|
item2 = ""
|
||||||
|
index += 1
|
||||||
|
nest3 = index
|
||||||
|
self.treeView.insert(nest2, 'end', text=index, iid=index,
|
||||||
|
value=[item1, item2], tags=[tagstyle])
|
||||||
|
|
||||||
|
if 'properties' in cellrec:
|
||||||
|
properties = cellrec['properties']
|
||||||
|
numproperr = len(properties)
|
||||||
|
if numproperr > 0:
|
||||||
|
item1 = cname1 + " Properties"
|
||||||
|
item2 = cname2 + " Properties"
|
||||||
|
tagstyle = 'header2'
|
||||||
|
index += 1
|
||||||
|
nest1 = index
|
||||||
|
self.treeView.insert(nest0, 'end', text=index, iid=index, value=[item1, item2],
|
||||||
|
tags=[tagstyle])
|
||||||
|
errcell['property'] = numproperr
|
||||||
|
errtotal['property'] += numproperr
|
||||||
|
|
||||||
|
for prop in properties:
|
||||||
|
|
||||||
|
if prop != properties[0]:
|
||||||
|
item1 = ""
|
||||||
|
index += 1
|
||||||
|
nest2 = index
|
||||||
|
self.treeView.insert(nest1, 'end', text=index, iid=index,
|
||||||
|
value=[item1, item1], tags=[tagstyle])
|
||||||
|
|
||||||
|
propc1 = prop[0]
|
||||||
|
propc2 = prop[1]
|
||||||
|
|
||||||
|
tagstyle = 'header3'
|
||||||
|
item1 = propc1[0]
|
||||||
|
item2 = propc2[0]
|
||||||
|
index += 1
|
||||||
|
nest2 = index
|
||||||
|
self.treeView.insert(nest1, 'end', text=index, iid=index,
|
||||||
|
value=[item1, item2], tags=[tagstyle])
|
||||||
|
|
||||||
|
# Pad shorter property list to the length of the longer one
|
||||||
|
elemprops = list(itertools.zip_longest(propc1[1], propc2[1]))
|
||||||
|
for proppair in elemprops:
|
||||||
|
perrc1 = proppair[0]
|
||||||
|
perrc2 = proppair[1]
|
||||||
|
tagstyle = 'normal'
|
||||||
|
if perrc1 and perrc1[0] != "":
|
||||||
|
item1 = perrc1[0] + ' = ' + str(perrc1[1])
|
||||||
|
else:
|
||||||
|
item1 = ""
|
||||||
|
if perrc2 and perrc2[0] != "":
|
||||||
|
item2 = perrc2[0] + ' = ' + str(perrc2[1])
|
||||||
|
else:
|
||||||
|
item2 = ""
|
||||||
|
index += 1
|
||||||
|
nest2 = index
|
||||||
|
self.treeView.insert(nest1, 'end', text=index, iid=index,
|
||||||
|
value=[item1, item2], tags=[tagstyle])
|
||||||
|
|
||||||
|
if 'pins' in cellrec:
|
||||||
|
item1 = cname1 + " Pins"
|
||||||
|
item2 = cname2 + " Pins"
|
||||||
|
tagstyle = 'header2'
|
||||||
|
index += 1
|
||||||
|
nest1 = index
|
||||||
|
self.treeView.insert(nest0, 'end', text=index, iid=index, value=[item1, item2],
|
||||||
|
tags=[tagstyle])
|
||||||
|
|
||||||
|
pins = cellrec['pins']
|
||||||
|
pinlist = [val for pair in zip(pins[0], pins[1]) for val in pair]
|
||||||
|
pinpair = list(pinlist[p:p + 2] for p in range(0, len(pinlist), 2))
|
||||||
|
for pin in pinpair:
|
||||||
|
item1 = pin[0]
|
||||||
|
item2 = pin[1]
|
||||||
|
if item1.lower() == item2.lower():
|
||||||
|
tagstyle = 'header4'
|
||||||
|
else:
|
||||||
|
tagstyle = 'error'
|
||||||
|
errcell['pin'] += 1
|
||||||
|
if topcell:
|
||||||
|
errtotal['pin'] += 1
|
||||||
|
index += 1
|
||||||
|
nest2 = index
|
||||||
|
self.treeView.insert(nest1, 'end', text=index, iid=index,
|
||||||
|
value=[item1, item2], tags=[tagstyle])
|
||||||
|
|
||||||
|
allcellerror = errcell['net'] + errcell['device'] + errcell['property'] + errcell['pin'] + errcell['netmatch'] + errcell['devmatch']
|
||||||
|
if allcellerror > 0:
|
||||||
|
item1 = 'Errors: Net = ' + str(errcell['net']) + ', Device = ' + str(errcell['device']) + ', Property = ' + str(errcell['property']) + ', Pin = ' + str(errcell['pin']) + ', Net match = ' + str(errcell['netmatch']) + ', Device match = ' + str(errcell['devmatch'])
|
||||||
|
tagstyle = 'error'
|
||||||
|
else:
|
||||||
|
item1 = 'LVS Clean'
|
||||||
|
tagstyle = 'clean'
|
||||||
|
|
||||||
|
item2 = ""
|
||||||
|
index += 1
|
||||||
|
nest0 = index
|
||||||
|
self.treeView.insert('', 'end', text=index, iid=index, value=[item1, item2],
|
||||||
|
tags=[tagstyle])
|
||||||
|
|
||||||
|
item1 = "Final LVS result:"
|
||||||
|
item2 = ""
|
||||||
|
tagstyle = 'header1'
|
||||||
|
index += 1
|
||||||
|
nest0 = index
|
||||||
|
self.treeView.insert('', 'end', text=index, iid=index, value=[item1, item2],
|
||||||
|
tags=[tagstyle])
|
||||||
|
|
||||||
|
allerror = errtotal['net'] + errtotal['device'] + errtotal['property'] + errtotal['pin'] + errtotal['netmatch'] + errtotal['devmatch']
|
||||||
|
if allerror > 0:
|
||||||
|
item1 = 'Errors: Net = ' + str(errtotal['net']) + ', Device = ' + str(errtotal['device']) + ', Property = ' + str(errtotal['property']) + ', Pin = ' + str(errtotal['pin']) + ', Net match = ' + str(errtotal['netmatch']) + ', Device match = ' + str(errtotal['devmatch'])
|
||||||
|
tagstyle = 'error'
|
||||||
|
else:
|
||||||
|
item1 = 'LVS Clean'
|
||||||
|
tagstyle = 'clean'
|
||||||
|
|
||||||
|
item2 = ""
|
||||||
|
index += 1
|
||||||
|
nest0 = index
|
||||||
|
self.treeView.insert('', 'end', text=index, iid=index, value=[item1, item2],
|
||||||
|
tags=[tagstyle])
|
||||||
|
|
||||||
|
for button in self.func_buttons:
|
||||||
|
button[0].pack_forget()
|
||||||
|
|
||||||
|
if index == 0:
|
||||||
|
self.treeView.insert('', 'end', text='-', value=['(no items)', '(no items)'])
|
||||||
|
for button in self.func_buttons:
|
||||||
|
if button[1]:
|
||||||
|
button[0].pack(side='left', padx = 5)
|
||||||
|
else:
|
||||||
|
for button in self.func_buttons:
|
||||||
|
button[0].pack(side='left', padx = 5)
|
||||||
|
|
||||||
|
# Return values from the treeview
|
||||||
|
def getlist(self):
|
||||||
|
return self.treeView.get_children()
|
||||||
|
|
||||||
|
def func_callback(self, callback, event=None):
|
||||||
|
callback(self.treeView.item(self.treeView.selection()))
|
||||||
|
|
||||||
|
def bindselect(self, callback):
|
||||||
|
self.selectcallback = callback
|
||||||
|
|
||||||
|
def setselect(self, value):
|
||||||
|
self.treeView.selection_set(value)
|
||||||
|
|
||||||
|
def selected(self):
|
||||||
|
value = self.treeView.item(self.treeView.selection())
|
||||||
|
if value['values']:
|
||||||
|
return value
|
||||||
|
else:
|
||||||
|
return None
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -1,767 +0,0 @@
|
||||||
This file contains any messages produced by compilers while
|
|
||||||
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
|
|
||||||
|
|
||||||
## --------- ##
|
|
||||||
## Platform. ##
|
|
||||||
## --------- ##
|
|
||||||
|
|
||||||
hostname = stravinsky
|
|
||||||
uname -m = x86_64
|
|
||||||
uname -r = 3.18.3-201.fc21.x86_64
|
|
||||||
uname -s = Linux
|
|
||||||
uname -v = #1 SMP Mon Jan 19 15:59:31 UTC 2015
|
|
||||||
|
|
||||||
/usr/bin/uname -p = x86_64
|
|
||||||
/bin/uname -X = unknown
|
|
||||||
|
|
||||||
/bin/arch = x86_64
|
|
||||||
/usr/bin/arch -k = unknown
|
|
||||||
/usr/convex/getsysinfo = unknown
|
|
||||||
/usr/bin/hostinfo = unknown
|
|
||||||
/bin/machine = unknown
|
|
||||||
/usr/bin/oslevel = unknown
|
|
||||||
/bin/universe = unknown
|
|
||||||
|
|
||||||
PATH: .
|
|
||||||
PATH: /bin
|
|
||||||
PATH: /sbin
|
|
||||||
PATH: /usr/bin
|
|
||||||
PATH: /usr/sbin
|
|
||||||
PATH: /usr/local/bin
|
|
||||||
|
|
||||||
|
|
||||||
## ----------- ##
|
|
||||||
## Core tests. ##
|
|
||||||
## ----------- ##
|
|
||||||
|
|
||||||
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 20141101 (Red Hat 4.9.2-1)
|
|
||||||
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: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
|
|
||||||
Thread model: posix
|
|
||||||
gcc version 4.9.2 20141101 (Red Hat 4.9.2-1) (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:2844: $? = 4
|
|
||||||
configure:2833: gcc -qversion >&5
|
|
||||||
gcc: error: unrecognized command line option '-qversion'
|
|
||||||
gcc: fatal error: no input files
|
|
||||||
compilation terminated.
|
|
||||||
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:3359: $? = 1
|
|
||||||
configure: failed program was:
|
|
||||||
| /* confdefs.h */
|
|
||||||
| #define PACKAGE_NAME "netgen"
|
|
||||||
| #define PACKAGE_TARNAME "netgen"
|
|
||||||
| #define PACKAGE_VERSION "1.3"
|
|
||||||
| #define PACKAGE_STRING "netgen 1.3"
|
|
||||||
| #define PACKAGE_BUGREPORT "eda-dev@opencircuitdesign.com"
|
|
||||||
| #define PACKAGE_URL ""
|
|
||||||
| #define NETGEN_VERSION "1.5"
|
|
||||||
| #define NETGEN_REVISION "60"
|
|
||||||
| /* end confdefs.h. */
|
|
||||||
| #include <ac_nonexistent.h>
|
|
||||||
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:3418: $? = 1
|
|
||||||
configure: failed program was:
|
|
||||||
| /* confdefs.h */
|
|
||||||
| #define PACKAGE_NAME "netgen"
|
|
||||||
| #define PACKAGE_TARNAME "netgen"
|
|
||||||
| #define PACKAGE_VERSION "1.3"
|
|
||||||
| #define PACKAGE_STRING "netgen 1.3"
|
|
||||||
| #define PACKAGE_BUGREPORT "eda-dev@opencircuitdesign.com"
|
|
||||||
| #define PACKAGE_URL ""
|
|
||||||
| #define NETGEN_VERSION "1.5"
|
|
||||||
| #define NETGEN_REVISION "60"
|
|
||||||
| /* end confdefs.h. */
|
|
||||||
| #include <ac_nonexistent.h>
|
|
||||||
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: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
|
|
||||||
^
|
|
||||||
conftest.c:26:15: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'universal'
|
|
||||||
not a universal capable compiler
|
|
||||||
^
|
|
||||||
conftest.c:26:15: error: unknown type name 'universal'
|
|
||||||
configure:4260: $? = 1
|
|
||||||
configure: failed program was:
|
|
||||||
| /* confdefs.h */
|
|
||||||
| #define PACKAGE_NAME "netgen"
|
|
||||||
| #define PACKAGE_TARNAME "netgen"
|
|
||||||
| #define PACKAGE_VERSION "1.3"
|
|
||||||
| #define PACKAGE_STRING "netgen 1.3"
|
|
||||||
| #define PACKAGE_BUGREPORT "eda-dev@opencircuitdesign.com"
|
|
||||||
| #define PACKAGE_URL ""
|
|
||||||
| #define NETGEN_VERSION "1.5"
|
|
||||||
| #define NETGEN_REVISION "60"
|
|
||||||
| #define STDC_HEADERS 1
|
|
||||||
| #define HAVE_SYS_TYPES_H 1
|
|
||||||
| #define HAVE_SYS_STAT_H 1
|
|
||||||
| #define HAVE_STDLIB_H 1
|
|
||||||
| #define HAVE_STRING_H 1
|
|
||||||
| #define HAVE_MEMORY_H 1
|
|
||||||
| #define HAVE_STRINGS_H 1
|
|
||||||
| #define HAVE_INTTYPES_H 1
|
|
||||||
| #define HAVE_STDINT_H 1
|
|
||||||
| #define HAVE_UNISTD_H 1
|
|
||||||
| #define SIZEOF_VOID_P 8
|
|
||||||
| #define SIZEOF_UNSIGNED_INT 4
|
|
||||||
| #define SIZEOF_UNSIGNED_LONG 8
|
|
||||||
| #define SIZEOF_UNSIGNED_LONG_LONG 8
|
|
||||||
| /* end confdefs.h. */
|
|
||||||
| #ifndef __APPLE_CC__
|
|
||||||
| not a universal capable compiler
|
|
||||||
| #endif
|
|
||||||
| typedef int dummy;
|
|
||||||
|
|
|
||||||
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
|
|
||||||
^
|
|
||||||
conftest.c:32:12: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'endian'
|
|
||||||
not big endian
|
|
||||||
^
|
|
||||||
configure:4323: $? = 1
|
|
||||||
configure: failed program was:
|
|
||||||
| /* confdefs.h */
|
|
||||||
| #define PACKAGE_NAME "netgen"
|
|
||||||
| #define PACKAGE_TARNAME "netgen"
|
|
||||||
| #define PACKAGE_VERSION "1.3"
|
|
||||||
| #define PACKAGE_STRING "netgen 1.3"
|
|
||||||
| #define PACKAGE_BUGREPORT "eda-dev@opencircuitdesign.com"
|
|
||||||
| #define PACKAGE_URL ""
|
|
||||||
| #define NETGEN_VERSION "1.5"
|
|
||||||
| #define NETGEN_REVISION "60"
|
|
||||||
| #define STDC_HEADERS 1
|
|
||||||
| #define HAVE_SYS_TYPES_H 1
|
|
||||||
| #define HAVE_SYS_STAT_H 1
|
|
||||||
| #define HAVE_STDLIB_H 1
|
|
||||||
| #define HAVE_STRING_H 1
|
|
||||||
| #define HAVE_MEMORY_H 1
|
|
||||||
| #define HAVE_STRINGS_H 1
|
|
||||||
| #define HAVE_INTTYPES_H 1
|
|
||||||
| #define HAVE_STDINT_H 1
|
|
||||||
| #define HAVE_UNISTD_H 1
|
|
||||||
| #define SIZEOF_VOID_P 8
|
|
||||||
| #define SIZEOF_UNSIGNED_INT 4
|
|
||||||
| #define SIZEOF_UNSIGNED_LONG 8
|
|
||||||
| #define SIZEOF_UNSIGNED_LONG_LONG 8
|
|
||||||
| /* end confdefs.h. */
|
|
||||||
| #include <sys/types.h>
|
|
||||||
| #include <sys/param.h>
|
|
||||||
|
|
|
||||||
| int
|
|
||||||
| main ()
|
|
||||||
| {
|
|
||||||
| #if BYTE_ORDER != BIG_ENDIAN
|
|
||||||
| not big endian
|
|
||||||
| #endif
|
|
||||||
|
|
|
||||||
| ;
|
|
||||||
| return 0;
|
|
||||||
| }
|
|
||||||
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:4630: $? = 1
|
|
||||||
configure: failed program was:
|
|
||||||
| /* confdefs.h */
|
|
||||||
| #define PACKAGE_NAME "netgen"
|
|
||||||
| #define PACKAGE_TARNAME "netgen"
|
|
||||||
| #define PACKAGE_VERSION "1.3"
|
|
||||||
| #define PACKAGE_STRING "netgen 1.3"
|
|
||||||
| #define PACKAGE_BUGREPORT "eda-dev@opencircuitdesign.com"
|
|
||||||
| #define PACKAGE_URL ""
|
|
||||||
| #define NETGEN_VERSION "1.5"
|
|
||||||
| #define NETGEN_REVISION "60"
|
|
||||||
| #define STDC_HEADERS 1
|
|
||||||
| #define HAVE_SYS_TYPES_H 1
|
|
||||||
| #define HAVE_SYS_STAT_H 1
|
|
||||||
| #define HAVE_STDLIB_H 1
|
|
||||||
| #define HAVE_STRING_H 1
|
|
||||||
| #define HAVE_MEMORY_H 1
|
|
||||||
| #define HAVE_STRINGS_H 1
|
|
||||||
| #define HAVE_INTTYPES_H 1
|
|
||||||
| #define HAVE_STDINT_H 1
|
|
||||||
| #define HAVE_UNISTD_H 1
|
|
||||||
| #define SIZEOF_VOID_P 8
|
|
||||||
| #define SIZEOF_UNSIGNED_INT 4
|
|
||||||
| #define SIZEOF_UNSIGNED_LONG 8
|
|
||||||
| #define SIZEOF_UNSIGNED_LONG_LONG 8
|
|
||||||
| #define STDC_HEADERS 1
|
|
||||||
| #define HAVE_SETENV 1
|
|
||||||
| #define HAVE_PUTENV 1
|
|
||||||
| #define HAVE_DIRENT_H 1
|
|
||||||
| #define HAVE_LIMITS_H 1
|
|
||||||
| /* end confdefs.h. */
|
|
||||||
| #include <stdio.h>
|
|
||||||
| #ifdef HAVE_SYS_TYPES_H
|
|
||||||
| # include <sys/types.h>
|
|
||||||
| #endif
|
|
||||||
| #ifdef HAVE_SYS_STAT_H
|
|
||||||
| # include <sys/stat.h>
|
|
||||||
| #endif
|
|
||||||
| #ifdef STDC_HEADERS
|
|
||||||
| # include <stdlib.h>
|
|
||||||
| # include <stddef.h>
|
|
||||||
| #else
|
|
||||||
| # ifdef HAVE_STDLIB_H
|
|
||||||
| # include <stdlib.h>
|
|
||||||
| # endif
|
|
||||||
| #endif
|
|
||||||
| #ifdef HAVE_STRING_H
|
|
||||||
| # if !defined STDC_HEADERS && defined HAVE_MEMORY_H
|
|
||||||
| # include <memory.h>
|
|
||||||
| # endif
|
|
||||||
| # include <string.h>
|
|
||||||
| #endif
|
|
||||||
| #ifdef HAVE_STRINGS_H
|
|
||||||
| # include <strings.h>
|
|
||||||
| #endif
|
|
||||||
| #ifdef HAVE_INTTYPES_H
|
|
||||||
| # include <inttypes.h>
|
|
||||||
| #endif
|
|
||||||
| #ifdef HAVE_STDINT_H
|
|
||||||
| # include <stdint.h>
|
|
||||||
| #endif
|
|
||||||
| #ifdef HAVE_UNISTD_H
|
|
||||||
| # include <unistd.h>
|
|
||||||
| #endif
|
|
||||||
| #include <param.h>
|
|
||||||
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:4630: $? = 1
|
|
||||||
configure: failed program was:
|
|
||||||
| /* confdefs.h */
|
|
||||||
| #define PACKAGE_NAME "netgen"
|
|
||||||
| #define PACKAGE_TARNAME "netgen"
|
|
||||||
| #define PACKAGE_VERSION "1.3"
|
|
||||||
| #define PACKAGE_STRING "netgen 1.3"
|
|
||||||
| #define PACKAGE_BUGREPORT "eda-dev@opencircuitdesign.com"
|
|
||||||
| #define PACKAGE_URL ""
|
|
||||||
| #define NETGEN_VERSION "1.5"
|
|
||||||
| #define NETGEN_REVISION "60"
|
|
||||||
| #define STDC_HEADERS 1
|
|
||||||
| #define HAVE_SYS_TYPES_H 1
|
|
||||||
| #define HAVE_SYS_STAT_H 1
|
|
||||||
| #define HAVE_STDLIB_H 1
|
|
||||||
| #define HAVE_STRING_H 1
|
|
||||||
| #define HAVE_MEMORY_H 1
|
|
||||||
| #define HAVE_STRINGS_H 1
|
|
||||||
| #define HAVE_INTTYPES_H 1
|
|
||||||
| #define HAVE_STDINT_H 1
|
|
||||||
| #define HAVE_UNISTD_H 1
|
|
||||||
| #define SIZEOF_VOID_P 8
|
|
||||||
| #define SIZEOF_UNSIGNED_INT 4
|
|
||||||
| #define SIZEOF_UNSIGNED_LONG 8
|
|
||||||
| #define SIZEOF_UNSIGNED_LONG_LONG 8
|
|
||||||
| #define STDC_HEADERS 1
|
|
||||||
| #define HAVE_SETENV 1
|
|
||||||
| #define HAVE_PUTENV 1
|
|
||||||
| #define HAVE_DIRENT_H 1
|
|
||||||
| #define HAVE_LIMITS_H 1
|
|
||||||
| /* end confdefs.h. */
|
|
||||||
| #include <param.h>
|
|
||||||
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:6705: creating ./config.status
|
|
||||||
|
|
||||||
## ---------------------- ##
|
|
||||||
## Running config.status. ##
|
|
||||||
## ---------------------- ##
|
|
||||||
|
|
||||||
This file was extended by netgen config.status 1.3, which was
|
|
||||||
generated by GNU Autoconf 2.69. Invocation command line was
|
|
||||||
|
|
||||||
CONFIG_FILES =
|
|
||||||
CONFIG_HEADERS =
|
|
||||||
CONFIG_LINKS =
|
|
||||||
CONFIG_COMMANDS =
|
|
||||||
$ ./config.status
|
|
||||||
|
|
||||||
on stravinsky
|
|
||||||
|
|
||||||
config.status:783: creating defs.mak
|
|
||||||
config.status:886: WARNING: 'defs.mak.in' seems to ignore the --datarootdir setting
|
|
||||||
|
|
||||||
## ---------------- ##
|
|
||||||
## Cache variables. ##
|
|
||||||
## ---------------- ##
|
|
||||||
|
|
||||||
ac_cv_build=x86_64-unknown-linux-gnu
|
|
||||||
ac_cv_c___va_copy=yes
|
|
||||||
ac_cv_c_bigendian=no
|
|
||||||
ac_cv_c_compiler_gnu=yes
|
|
||||||
ac_cv_c_va_copy=yes
|
|
||||||
ac_cv_env_CC_set=
|
|
||||||
ac_cv_env_CC_value=
|
|
||||||
ac_cv_env_CFLAGS_set=set
|
|
||||||
ac_cv_env_CFLAGS_value=-g
|
|
||||||
ac_cv_env_CPPFLAGS_set=
|
|
||||||
ac_cv_env_CPPFLAGS_value=
|
|
||||||
ac_cv_env_CPP_set=
|
|
||||||
ac_cv_env_CPP_value=
|
|
||||||
ac_cv_env_LDFLAGS_set=
|
|
||||||
ac_cv_env_LDFLAGS_value=
|
|
||||||
ac_cv_env_LIBS_set=
|
|
||||||
ac_cv_env_LIBS_value=
|
|
||||||
ac_cv_env_XMKMF_set=
|
|
||||||
ac_cv_env_XMKMF_value=
|
|
||||||
ac_cv_env_build_alias_set=
|
|
||||||
ac_cv_env_build_alias_value=
|
|
||||||
ac_cv_env_host_alias_set=
|
|
||||||
ac_cv_env_host_alias_value=
|
|
||||||
ac_cv_env_target_alias_set=
|
|
||||||
ac_cv_env_target_alias_value=
|
|
||||||
ac_cv_func_connect=yes
|
|
||||||
ac_cv_func_gethostbyname=yes
|
|
||||||
ac_cv_func_putenv=yes
|
|
||||||
ac_cv_func_remove=yes
|
|
||||||
ac_cv_func_setenv=yes
|
|
||||||
ac_cv_func_shmat=yes
|
|
||||||
ac_cv_func_vfork=yes
|
|
||||||
ac_cv_have_x='have_x=yes ac_x_includes='\'''\'' ac_x_libraries='\'''\'''
|
|
||||||
ac_cv_header_dirent_h=yes
|
|
||||||
ac_cv_header_inttypes_h=yes
|
|
||||||
ac_cv_header_limits_h=yes
|
|
||||||
ac_cv_header_memory_h=yes
|
|
||||||
ac_cv_header_param_h=no
|
|
||||||
ac_cv_header_stdc=yes
|
|
||||||
ac_cv_header_stdint_h=yes
|
|
||||||
ac_cv_header_stdlib_h=yes
|
|
||||||
ac_cv_header_string_h=yes
|
|
||||||
ac_cv_header_strings_h=yes
|
|
||||||
ac_cv_header_sys_stat_h=yes
|
|
||||||
ac_cv_header_sys_types_h=yes
|
|
||||||
ac_cv_header_unistd_h=yes
|
|
||||||
ac_cv_host=x86_64-unknown-linux-gnu
|
|
||||||
ac_cv_lib_ICE_IceConnectionNumber=yes
|
|
||||||
ac_cv_objext=o
|
|
||||||
ac_cv_path_EGREP='/bin/grep -E'
|
|
||||||
ac_cv_path_GREP=/bin/grep
|
|
||||||
ac_cv_path_LD=/bin/ld
|
|
||||||
ac_cv_path_M4=/bin/m4
|
|
||||||
ac_cv_path_install='/bin/install -c'
|
|
||||||
ac_cv_prog_CPP='gcc -E'
|
|
||||||
ac_cv_prog_ac_ct_CC=gcc
|
|
||||||
ac_cv_prog_ac_ct_RANLIB=ranlib
|
|
||||||
ac_cv_prog_cc_c89=
|
|
||||||
ac_cv_prog_cc_g=yes
|
|
||||||
ac_cv_prog_gnu_ld=yes
|
|
||||||
ac_cv_search_strerror='none required'
|
|
||||||
ac_cv_sizeof_unsigned_int=4
|
|
||||||
ac_cv_sizeof_unsigned_long=8
|
|
||||||
ac_cv_sizeof_unsigned_long_long=8
|
|
||||||
ac_cv_sizeof_void_p=8
|
|
||||||
ac_cv_target=x86_64-unknown-linux-gnu
|
|
||||||
|
|
||||||
## ----------------- ##
|
|
||||||
## Output variables. ##
|
|
||||||
## ----------------- ##
|
|
||||||
|
|
||||||
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=\"eda-dev@opencircuitdesign.com\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"60\" -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='-ldl'
|
|
||||||
GREP='/bin/grep'
|
|
||||||
INC_SPECS=''
|
|
||||||
INSTALL_DATA='${INSTALL} -m 644'
|
|
||||||
INSTALL_PROGRAM='${INSTALL}'
|
|
||||||
INSTALL_SCRIPT='${INSTALL}'
|
|
||||||
INSTALL_TARGET='install-tcl'
|
|
||||||
LD='/bin/ld'
|
|
||||||
LDDL_FLAGS=' -shared -Wl,-soname,$@ -Wl,--version-script=${NETGENDIR}/netgen/symbol.map'
|
|
||||||
LDFLAGS=''
|
|
||||||
LD_RUN_PATH=''
|
|
||||||
LIBOBJS=''
|
|
||||||
LIBS=''
|
|
||||||
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'
|
|
||||||
PACKAGE='netgen'
|
|
||||||
PACKAGE_BUGREPORT='eda-dev@opencircuitdesign.com'
|
|
||||||
PACKAGE_NAME='netgen'
|
|
||||||
PACKAGE_STRING='netgen 1.3'
|
|
||||||
PACKAGE_TARNAME='netgen'
|
|
||||||
PACKAGE_URL=''
|
|
||||||
PACKAGE_VERSION='1.3'
|
|
||||||
PATH_SEPARATOR=':'
|
|
||||||
RANLIB='ranlib'
|
|
||||||
SCRIPTS=''
|
|
||||||
SHDLIB_EXT='.so'
|
|
||||||
SHELL='/bin/sh'
|
|
||||||
SHLIB_CFLAGS='-fPIC'
|
|
||||||
SHLIB_LD=''
|
|
||||||
SHLIB_LIB_SPECS=''
|
|
||||||
TCLSH_EXE='/usr/bin/tclsh'
|
|
||||||
TCL_LIB_DIR='/usr/lib'
|
|
||||||
VERSION=''
|
|
||||||
WISH_EXE='/usr/bin/wish'
|
|
||||||
XMKMF=''
|
|
||||||
X_CFLAGS=''
|
|
||||||
X_EXTRA_LIBS=''
|
|
||||||
X_LIBS=''
|
|
||||||
X_PRE_LIBS=' -lSM -lICE'
|
|
||||||
ac_ct_CC='gcc'
|
|
||||||
bindir='${exec_prefix}/bin'
|
|
||||||
build='x86_64-unknown-linux-gnu'
|
|
||||||
build_alias=''
|
|
||||||
build_cpu='x86_64'
|
|
||||||
build_os='linux-gnu'
|
|
||||||
build_vendor='unknown'
|
|
||||||
cadinstall=' tcltk'
|
|
||||||
datadir='${datarootdir}'
|
|
||||||
datarootdir='${prefix}/share'
|
|
||||||
docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
|
|
||||||
dvidir='${docdir}'
|
|
||||||
exec_prefix='${prefix}'
|
|
||||||
extra_defs=' -DCAD_DIR=\"${LIBDIR}\" -DTCL_DIR=\"${TCLDIR}\"'
|
|
||||||
extra_libs=' ${NETGENDIR}/tcltk/libtcltk.o'
|
|
||||||
gr_cflags=''
|
|
||||||
gr_dflags=' -DX11 -DXLIB'
|
|
||||||
gr_libs=' -lX11'
|
|
||||||
gr_srcs=' ${TK_SRCS}'
|
|
||||||
host='x86_64-unknown-linux-gnu'
|
|
||||||
host_alias=''
|
|
||||||
host_cpu='x86_64'
|
|
||||||
host_os='linux-gnu'
|
|
||||||
host_vendor='unknown'
|
|
||||||
htmldir='${docdir}'
|
|
||||||
includedir='${prefix}/include'
|
|
||||||
infodir='${datarootdir}/info'
|
|
||||||
ld_extra_libs=''
|
|
||||||
ld_extra_objs=''
|
|
||||||
libdir='${exec_prefix}/lib'
|
|
||||||
libexecdir='${exec_prefix}/libexec'
|
|
||||||
localedir='${datarootdir}/locale'
|
|
||||||
localstatedir='${prefix}/var'
|
|
||||||
mandir='${datarootdir}/man'
|
|
||||||
modules=' tcltk'
|
|
||||||
oldincludedir='/usr/include'
|
|
||||||
pdfdir='${docdir}'
|
|
||||||
prefix='/usr/local'
|
|
||||||
program_transform_name='s,x,x,'
|
|
||||||
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'
|
|
||||||
target_alias=''
|
|
||||||
target_cpu='x86_64'
|
|
||||||
target_os='linux-gnu'
|
|
||||||
target_vendor='unknown'
|
|
||||||
top_extra_libs=''
|
|
||||||
unused=''
|
|
||||||
|
|
||||||
## ----------- ##
|
|
||||||
## confdefs.h. ##
|
|
||||||
## ----------- ##
|
|
||||||
|
|
||||||
/* confdefs.h */
|
|
||||||
#define PACKAGE_NAME "netgen"
|
|
||||||
#define PACKAGE_TARNAME "netgen"
|
|
||||||
#define PACKAGE_VERSION "1.3"
|
|
||||||
#define PACKAGE_STRING "netgen 1.3"
|
|
||||||
#define PACKAGE_BUGREPORT "eda-dev@opencircuitdesign.com"
|
|
||||||
#define PACKAGE_URL ""
|
|
||||||
#define NETGEN_VERSION "1.5"
|
|
||||||
#define NETGEN_REVISION "60"
|
|
||||||
#define STDC_HEADERS 1
|
|
||||||
#define HAVE_SYS_TYPES_H 1
|
|
||||||
#define HAVE_SYS_STAT_H 1
|
|
||||||
#define HAVE_STDLIB_H 1
|
|
||||||
#define HAVE_STRING_H 1
|
|
||||||
#define HAVE_MEMORY_H 1
|
|
||||||
#define HAVE_STRINGS_H 1
|
|
||||||
#define HAVE_INTTYPES_H 1
|
|
||||||
#define HAVE_STDINT_H 1
|
|
||||||
#define HAVE_UNISTD_H 1
|
|
||||||
#define SIZEOF_VOID_P 8
|
|
||||||
#define SIZEOF_UNSIGNED_INT 4
|
|
||||||
#define SIZEOF_UNSIGNED_LONG 8
|
|
||||||
#define SIZEOF_UNSIGNED_LONG_LONG 8
|
|
||||||
#define STDC_HEADERS 1
|
|
||||||
#define HAVE_SETENV 1
|
|
||||||
#define HAVE_PUTENV 1
|
|
||||||
#define HAVE_DIRENT_H 1
|
|
||||||
#define HAVE_LIMITS_H 1
|
|
||||||
#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
|
|
||||||
|
|
||||||
configure: exit 0
|
|
||||||
|
|
@ -1,940 +0,0 @@
|
||||||
#! /bin/sh
|
|
||||||
# Generated by configure.
|
|
||||||
# Run this file to recreate the current configuration.
|
|
||||||
# Compiler output produced by configure, useful for debugging
|
|
||||||
# configure, is in config.log if it exists.
|
|
||||||
|
|
||||||
debug=false
|
|
||||||
ac_cs_recheck=false
|
|
||||||
ac_cs_silent=false
|
|
||||||
|
|
||||||
SHELL=${CONFIG_SHELL-/bin/sh}
|
|
||||||
export SHELL
|
|
||||||
## -------------------- ##
|
|
||||||
## M4sh Initialization. ##
|
|
||||||
## -------------------- ##
|
|
||||||
|
|
||||||
# Be more Bourne compatible
|
|
||||||
DUALCASE=1; export DUALCASE # for MKS sh
|
|
||||||
if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then :
|
|
||||||
emulate sh
|
|
||||||
NULLCMD=:
|
|
||||||
# Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which
|
|
||||||
# is contrary to our usage. Disable this feature.
|
|
||||||
alias -g '${1+"$@"}'='"$@"'
|
|
||||||
setopt NO_GLOB_SUBST
|
|
||||||
else
|
|
||||||
case `(set -o) 2>/dev/null` in #(
|
|
||||||
*posix*) :
|
|
||||||
set -o posix ;; #(
|
|
||||||
*) :
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
as_nl='
|
|
||||||
'
|
|
||||||
export as_nl
|
|
||||||
# Printing a long string crashes Solaris 7 /usr/bin/printf.
|
|
||||||
as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'
|
|
||||||
as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo
|
|
||||||
as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo
|
|
||||||
# Prefer a ksh shell builtin over an external printf program on Solaris,
|
|
||||||
# but without wasting forks for bash or zsh.
|
|
||||||
if test -z "$BASH_VERSION$ZSH_VERSION" \
|
|
||||||
&& (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then
|
|
||||||
as_echo='print -r --'
|
|
||||||
as_echo_n='print -rn --'
|
|
||||||
elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then
|
|
||||||
as_echo='printf %s\n'
|
|
||||||
as_echo_n='printf %s'
|
|
||||||
else
|
|
||||||
if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then
|
|
||||||
as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"'
|
|
||||||
as_echo_n='/usr/ucb/echo -n'
|
|
||||||
else
|
|
||||||
as_echo_body='eval expr "X$1" : "X\\(.*\\)"'
|
|
||||||
as_echo_n_body='eval
|
|
||||||
arg=$1;
|
|
||||||
case $arg in #(
|
|
||||||
*"$as_nl"*)
|
|
||||||
expr "X$arg" : "X\\(.*\\)$as_nl";
|
|
||||||
arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;;
|
|
||||||
esac;
|
|
||||||
expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl"
|
|
||||||
'
|
|
||||||
export as_echo_n_body
|
|
||||||
as_echo_n='sh -c $as_echo_n_body as_echo'
|
|
||||||
fi
|
|
||||||
export as_echo_body
|
|
||||||
as_echo='sh -c $as_echo_body as_echo'
|
|
||||||
fi
|
|
||||||
|
|
||||||
# The user is always right.
|
|
||||||
if test "${PATH_SEPARATOR+set}" != set; then
|
|
||||||
PATH_SEPARATOR=:
|
|
||||||
(PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {
|
|
||||||
(PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||
|
|
||||||
PATH_SEPARATOR=';'
|
|
||||||
}
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
# IFS
|
|
||||||
# We need space, tab and new line, in precisely that order. Quoting is
|
|
||||||
# there to prevent editors from complaining about space-tab.
|
|
||||||
# (If _AS_PATH_WALK were called with IFS unset, it would disable word
|
|
||||||
# splitting by setting IFS to empty value.)
|
|
||||||
IFS=" "" $as_nl"
|
|
||||||
|
|
||||||
# Find who we are. Look in the path if we contain no directory separator.
|
|
||||||
as_myself=
|
|
||||||
case $0 in #((
|
|
||||||
*[\\/]* ) as_myself=$0 ;;
|
|
||||||
*) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
|
||||||
for as_dir in $PATH
|
|
||||||
do
|
|
||||||
IFS=$as_save_IFS
|
|
||||||
test -z "$as_dir" && as_dir=.
|
|
||||||
test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break
|
|
||||||
done
|
|
||||||
IFS=$as_save_IFS
|
|
||||||
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
# We did not find ourselves, most probably we were run as `sh COMMAND'
|
|
||||||
# in which case we are not to be found in the path.
|
|
||||||
if test "x$as_myself" = x; then
|
|
||||||
as_myself=$0
|
|
||||||
fi
|
|
||||||
if test ! -f "$as_myself"; then
|
|
||||||
$as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Unset variables that we do not need and which cause bugs (e.g. in
|
|
||||||
# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1"
|
|
||||||
# suppresses any "Segmentation fault" message there. '((' could
|
|
||||||
# trigger a bug in pdksh 5.2.14.
|
|
||||||
for as_var in BASH_ENV ENV MAIL MAILPATH
|
|
||||||
do eval test x\${$as_var+set} = xset \
|
|
||||||
&& ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :
|
|
||||||
done
|
|
||||||
PS1='$ '
|
|
||||||
PS2='> '
|
|
||||||
PS4='+ '
|
|
||||||
|
|
||||||
# NLS nuisances.
|
|
||||||
LC_ALL=C
|
|
||||||
export LC_ALL
|
|
||||||
LANGUAGE=C
|
|
||||||
export LANGUAGE
|
|
||||||
|
|
||||||
# CDPATH.
|
|
||||||
(unset CDPATH) >/dev/null 2>&1 && unset CDPATH
|
|
||||||
|
|
||||||
|
|
||||||
# as_fn_error STATUS ERROR [LINENO LOG_FD]
|
|
||||||
# ----------------------------------------
|
|
||||||
# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are
|
|
||||||
# provided, also output the error to LOG_FD, referencing LINENO. Then exit the
|
|
||||||
# script with STATUS, using 1 if that was 0.
|
|
||||||
as_fn_error ()
|
|
||||||
{
|
|
||||||
as_status=$1; test $as_status -eq 0 && as_status=1
|
|
||||||
if test "$4"; then
|
|
||||||
as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
|
|
||||||
$as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4
|
|
||||||
fi
|
|
||||||
$as_echo "$as_me: error: $2" >&2
|
|
||||||
as_fn_exit $as_status
|
|
||||||
} # as_fn_error
|
|
||||||
|
|
||||||
|
|
||||||
# as_fn_set_status STATUS
|
|
||||||
# -----------------------
|
|
||||||
# Set $? to STATUS, without forking.
|
|
||||||
as_fn_set_status ()
|
|
||||||
{
|
|
||||||
return $1
|
|
||||||
} # as_fn_set_status
|
|
||||||
|
|
||||||
# as_fn_exit STATUS
|
|
||||||
# -----------------
|
|
||||||
# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
|
|
||||||
as_fn_exit ()
|
|
||||||
{
|
|
||||||
set +e
|
|
||||||
as_fn_set_status $1
|
|
||||||
exit $1
|
|
||||||
} # as_fn_exit
|
|
||||||
|
|
||||||
# as_fn_unset VAR
|
|
||||||
# ---------------
|
|
||||||
# Portably unset VAR.
|
|
||||||
as_fn_unset ()
|
|
||||||
{
|
|
||||||
{ eval $1=; unset $1;}
|
|
||||||
}
|
|
||||||
as_unset=as_fn_unset
|
|
||||||
# as_fn_append VAR VALUE
|
|
||||||
# ----------------------
|
|
||||||
# Append the text in VALUE to the end of the definition contained in VAR. Take
|
|
||||||
# advantage of any shell optimizations that allow amortized linear growth over
|
|
||||||
# repeated appends, instead of the typical quadratic growth present in naive
|
|
||||||
# implementations.
|
|
||||||
if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then :
|
|
||||||
eval 'as_fn_append ()
|
|
||||||
{
|
|
||||||
eval $1+=\$2
|
|
||||||
}'
|
|
||||||
else
|
|
||||||
as_fn_append ()
|
|
||||||
{
|
|
||||||
eval $1=\$$1\$2
|
|
||||||
}
|
|
||||||
fi # as_fn_append
|
|
||||||
|
|
||||||
# as_fn_arith ARG...
|
|
||||||
# ------------------
|
|
||||||
# Perform arithmetic evaluation on the ARGs, and store the result in the
|
|
||||||
# global $as_val. Take advantage of shells that can avoid forks. The arguments
|
|
||||||
# must be portable across $(()) and expr.
|
|
||||||
if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then :
|
|
||||||
eval 'as_fn_arith ()
|
|
||||||
{
|
|
||||||
as_val=$(( $* ))
|
|
||||||
}'
|
|
||||||
else
|
|
||||||
as_fn_arith ()
|
|
||||||
{
|
|
||||||
as_val=`expr "$@" || test $? -eq 1`
|
|
||||||
}
|
|
||||||
fi # as_fn_arith
|
|
||||||
|
|
||||||
|
|
||||||
if expr a : '\(a\)' >/dev/null 2>&1 &&
|
|
||||||
test "X`expr 00001 : '.*\(...\)'`" = X001; then
|
|
||||||
as_expr=expr
|
|
||||||
else
|
|
||||||
as_expr=false
|
|
||||||
fi
|
|
||||||
|
|
||||||
if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
|
|
||||||
as_basename=basename
|
|
||||||
else
|
|
||||||
as_basename=false
|
|
||||||
fi
|
|
||||||
|
|
||||||
if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then
|
|
||||||
as_dirname=dirname
|
|
||||||
else
|
|
||||||
as_dirname=false
|
|
||||||
fi
|
|
||||||
|
|
||||||
as_me=`$as_basename -- "$0" ||
|
|
||||||
$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
|
|
||||||
X"$0" : 'X\(//\)$' \| \
|
|
||||||
X"$0" : 'X\(/\)' \| . 2>/dev/null ||
|
|
||||||
$as_echo X/"$0" |
|
|
||||||
sed '/^.*\/\([^/][^/]*\)\/*$/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\/\(\/\/\)$/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\/\(\/\).*/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
s/.*/./; q'`
|
|
||||||
|
|
||||||
# Avoid depending upon Character Ranges.
|
|
||||||
as_cr_letters='abcdefghijklmnopqrstuvwxyz'
|
|
||||||
as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
|
||||||
as_cr_Letters=$as_cr_letters$as_cr_LETTERS
|
|
||||||
as_cr_digits='0123456789'
|
|
||||||
as_cr_alnum=$as_cr_Letters$as_cr_digits
|
|
||||||
|
|
||||||
ECHO_C= ECHO_N= ECHO_T=
|
|
||||||
case `echo -n x` in #(((((
|
|
||||||
-n*)
|
|
||||||
case `echo 'xy\c'` in
|
|
||||||
*c*) ECHO_T=' ';; # ECHO_T is single tab character.
|
|
||||||
xy) ECHO_C='\c';;
|
|
||||||
*) echo `echo ksh88 bug on AIX 6.1` > /dev/null
|
|
||||||
ECHO_T=' ';;
|
|
||||||
esac;;
|
|
||||||
*)
|
|
||||||
ECHO_N='-n';;
|
|
||||||
esac
|
|
||||||
|
|
||||||
rm -f conf$$ conf$$.exe conf$$.file
|
|
||||||
if test -d conf$$.dir; then
|
|
||||||
rm -f conf$$.dir/conf$$.file
|
|
||||||
else
|
|
||||||
rm -f conf$$.dir
|
|
||||||
mkdir conf$$.dir 2>/dev/null
|
|
||||||
fi
|
|
||||||
if (echo >conf$$.file) 2>/dev/null; then
|
|
||||||
if ln -s conf$$.file conf$$ 2>/dev/null; then
|
|
||||||
as_ln_s='ln -s'
|
|
||||||
# ... but there are two gotchas:
|
|
||||||
# 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.
|
|
||||||
# 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.
|
|
||||||
# In both cases, we have to default to `cp -pR'.
|
|
||||||
ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||
|
|
||||||
as_ln_s='cp -pR'
|
|
||||||
elif ln conf$$.file conf$$ 2>/dev/null; then
|
|
||||||
as_ln_s=ln
|
|
||||||
else
|
|
||||||
as_ln_s='cp -pR'
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
as_ln_s='cp -pR'
|
|
||||||
fi
|
|
||||||
rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file
|
|
||||||
rmdir conf$$.dir 2>/dev/null
|
|
||||||
|
|
||||||
|
|
||||||
# as_fn_mkdir_p
|
|
||||||
# -------------
|
|
||||||
# Create "$as_dir" as a directory, including parents if necessary.
|
|
||||||
as_fn_mkdir_p ()
|
|
||||||
{
|
|
||||||
|
|
||||||
case $as_dir in #(
|
|
||||||
-*) as_dir=./$as_dir;;
|
|
||||||
esac
|
|
||||||
test -d "$as_dir" || eval $as_mkdir_p || {
|
|
||||||
as_dirs=
|
|
||||||
while :; do
|
|
||||||
case $as_dir in #(
|
|
||||||
*\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'(
|
|
||||||
*) as_qdir=$as_dir;;
|
|
||||||
esac
|
|
||||||
as_dirs="'$as_qdir' $as_dirs"
|
|
||||||
as_dir=`$as_dirname -- "$as_dir" ||
|
|
||||||
$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
|
|
||||||
X"$as_dir" : 'X\(//\)[^/]' \| \
|
|
||||||
X"$as_dir" : 'X\(//\)$' \| \
|
|
||||||
X"$as_dir" : 'X\(/\)' \| . 2>/dev/null ||
|
|
||||||
$as_echo X"$as_dir" |
|
|
||||||
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\/\)[^/].*/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\/\)$/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\).*/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
s/.*/./; q'`
|
|
||||||
test -d "$as_dir" && break
|
|
||||||
done
|
|
||||||
test -z "$as_dirs" || eval "mkdir $as_dirs"
|
|
||||||
} || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir"
|
|
||||||
|
|
||||||
|
|
||||||
} # as_fn_mkdir_p
|
|
||||||
if mkdir -p . 2>/dev/null; then
|
|
||||||
as_mkdir_p='mkdir -p "$as_dir"'
|
|
||||||
else
|
|
||||||
test -d ./-p && rmdir ./-p
|
|
||||||
as_mkdir_p=false
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
# as_fn_executable_p FILE
|
|
||||||
# -----------------------
|
|
||||||
# Test if FILE is an executable regular file.
|
|
||||||
as_fn_executable_p ()
|
|
||||||
{
|
|
||||||
test -f "$1" && test -x "$1"
|
|
||||||
} # as_fn_executable_p
|
|
||||||
as_test_x='test -x'
|
|
||||||
as_executable_p=as_fn_executable_p
|
|
||||||
|
|
||||||
# Sed expression to map a string onto a valid CPP name.
|
|
||||||
as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'"
|
|
||||||
|
|
||||||
# Sed expression to map a string onto a valid variable name.
|
|
||||||
as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'"
|
|
||||||
|
|
||||||
|
|
||||||
exec 6>&1
|
|
||||||
## ----------------------------------- ##
|
|
||||||
## Main body of $CONFIG_STATUS script. ##
|
|
||||||
## ----------------------------------- ##
|
|
||||||
# Save the log message, to keep $0 and so on meaningful, and to
|
|
||||||
# report actual input values of CONFIG_FILES etc. instead of their
|
|
||||||
# values after options handling.
|
|
||||||
ac_log="
|
|
||||||
This file was extended by netgen $as_me 1.3, which was
|
|
||||||
generated by GNU Autoconf 2.69. Invocation command line was
|
|
||||||
|
|
||||||
CONFIG_FILES = $CONFIG_FILES
|
|
||||||
CONFIG_HEADERS = $CONFIG_HEADERS
|
|
||||||
CONFIG_LINKS = $CONFIG_LINKS
|
|
||||||
CONFIG_COMMANDS = $CONFIG_COMMANDS
|
|
||||||
$ $0 $@
|
|
||||||
|
|
||||||
on `(hostname || uname -n) 2>/dev/null | sed 1q`
|
|
||||||
"
|
|
||||||
|
|
||||||
# Files that config.status was made for.
|
|
||||||
config_files=" defs.mak"
|
|
||||||
|
|
||||||
ac_cs_usage="\
|
|
||||||
\`$as_me' instantiates files and other configuration actions
|
|
||||||
from templates according to the current configuration. Unless the files
|
|
||||||
and actions are specified as TAGs, all are instantiated by default.
|
|
||||||
|
|
||||||
Usage: $0 [OPTION]... [TAG]...
|
|
||||||
|
|
||||||
-h, --help print this help, then exit
|
|
||||||
-V, --version print version number and configuration settings, then exit
|
|
||||||
--config print configuration, then exit
|
|
||||||
-q, --quiet, --silent
|
|
||||||
do not print progress messages
|
|
||||||
-d, --debug don't remove temporary files
|
|
||||||
--recheck update $as_me by reconfiguring in the same conditions
|
|
||||||
--file=FILE[:TEMPLATE]
|
|
||||||
instantiate the configuration file FILE
|
|
||||||
|
|
||||||
Configuration files:
|
|
||||||
$config_files
|
|
||||||
|
|
||||||
Report bugs to <eda-dev@opencircuitdesign.com>."
|
|
||||||
|
|
||||||
ac_cs_config="'CFLAGS=-g'"
|
|
||||||
ac_cs_version="\
|
|
||||||
netgen config.status 1.3
|
|
||||||
configured by ./configure, generated by GNU Autoconf 2.69,
|
|
||||||
with options \"$ac_cs_config\"
|
|
||||||
|
|
||||||
Copyright (C) 2012 Free Software Foundation, Inc.
|
|
||||||
This config.status script is free software; the Free Software Foundation
|
|
||||||
gives unlimited permission to copy, distribute and modify it."
|
|
||||||
|
|
||||||
ac_pwd='/home/tim/gitsrc/netgen-1.5/scripts'
|
|
||||||
srcdir='..'
|
|
||||||
INSTALL='/bin/install -c'
|
|
||||||
test -n "$AWK" || AWK=awk
|
|
||||||
# The default lists apply if the user does not specify any file.
|
|
||||||
ac_need_defaults=:
|
|
||||||
while test $# != 0
|
|
||||||
do
|
|
||||||
case $1 in
|
|
||||||
--*=?*)
|
|
||||||
ac_option=`expr "X$1" : 'X\([^=]*\)='`
|
|
||||||
ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'`
|
|
||||||
ac_shift=:
|
|
||||||
;;
|
|
||||||
--*=)
|
|
||||||
ac_option=`expr "X$1" : 'X\([^=]*\)='`
|
|
||||||
ac_optarg=
|
|
||||||
ac_shift=:
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
ac_option=$1
|
|
||||||
ac_optarg=$2
|
|
||||||
ac_shift=shift
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
case $ac_option in
|
|
||||||
# Handling of the options.
|
|
||||||
-recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
|
|
||||||
ac_cs_recheck=: ;;
|
|
||||||
--version | --versio | --versi | --vers | --ver | --ve | --v | -V )
|
|
||||||
$as_echo "$ac_cs_version"; exit ;;
|
|
||||||
--config | --confi | --conf | --con | --co | --c )
|
|
||||||
$as_echo "$ac_cs_config"; exit ;;
|
|
||||||
--debug | --debu | --deb | --de | --d | -d )
|
|
||||||
debug=: ;;
|
|
||||||
--file | --fil | --fi | --f )
|
|
||||||
$ac_shift
|
|
||||||
case $ac_optarg in
|
|
||||||
*\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;;
|
|
||||||
'') as_fn_error $? "missing file argument" ;;
|
|
||||||
esac
|
|
||||||
as_fn_append CONFIG_FILES " '$ac_optarg'"
|
|
||||||
ac_need_defaults=false;;
|
|
||||||
--he | --h | --help | --hel | -h )
|
|
||||||
$as_echo "$ac_cs_usage"; exit ;;
|
|
||||||
-q | -quiet | --quiet | --quie | --qui | --qu | --q \
|
|
||||||
| -silent | --silent | --silen | --sile | --sil | --si | --s)
|
|
||||||
ac_cs_silent=: ;;
|
|
||||||
|
|
||||||
# This is an error.
|
|
||||||
-*) as_fn_error $? "unrecognized option: \`$1'
|
|
||||||
Try \`$0 --help' for more information." ;;
|
|
||||||
|
|
||||||
*) as_fn_append ac_config_targets " $1"
|
|
||||||
ac_need_defaults=false ;;
|
|
||||||
|
|
||||||
esac
|
|
||||||
shift
|
|
||||||
done
|
|
||||||
|
|
||||||
ac_configure_extra_args=
|
|
||||||
|
|
||||||
if $ac_cs_silent; then
|
|
||||||
exec 6>/dev/null
|
|
||||||
ac_configure_extra_args="$ac_configure_extra_args --silent"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if $ac_cs_recheck; then
|
|
||||||
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'
|
|
||||||
export CONFIG_SHELL
|
|
||||||
exec "$@"
|
|
||||||
fi
|
|
||||||
|
|
||||||
exec 5>>config.log
|
|
||||||
{
|
|
||||||
echo
|
|
||||||
sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
|
|
||||||
## Running $as_me. ##
|
|
||||||
_ASBOX
|
|
||||||
$as_echo "$ac_log"
|
|
||||||
} >&5
|
|
||||||
|
|
||||||
|
|
||||||
# Handling of arguments.
|
|
||||||
for ac_config_target in $ac_config_targets
|
|
||||||
do
|
|
||||||
case $ac_config_target in
|
|
||||||
"defs.mak") CONFIG_FILES="$CONFIG_FILES defs.mak" ;;
|
|
||||||
|
|
||||||
*) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;;
|
|
||||||
esac
|
|
||||||
done
|
|
||||||
|
|
||||||
|
|
||||||
# If the user did not use the arguments to specify the items to instantiate,
|
|
||||||
# then the envvar interface is used. Set only those that are not.
|
|
||||||
# We use the long form for the default assignment because of an extremely
|
|
||||||
# bizarre bug on SunOS 4.1.3.
|
|
||||||
if $ac_need_defaults; then
|
|
||||||
test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Have a temporary directory for convenience. Make it in the build tree
|
|
||||||
# simply because there is no reason against having it here, and in addition,
|
|
||||||
# creating and moving files from /tmp can sometimes cause problems.
|
|
||||||
# Hook for its removal unless debugging.
|
|
||||||
# Note that there is a small window in which the directory will not be cleaned:
|
|
||||||
# after its creation but before its name has been assigned to `$tmp'.
|
|
||||||
$debug ||
|
|
||||||
{
|
|
||||||
tmp= ac_tmp=
|
|
||||||
trap 'exit_status=$?
|
|
||||||
: "${ac_tmp:=$tmp}"
|
|
||||||
{ test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status
|
|
||||||
' 0
|
|
||||||
trap 'as_fn_exit 1' 1 2 13 15
|
|
||||||
}
|
|
||||||
# Create a (secure) tmp directory for tmp files.
|
|
||||||
|
|
||||||
{
|
|
||||||
tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` &&
|
|
||||||
test -d "$tmp"
|
|
||||||
} ||
|
|
||||||
{
|
|
||||||
tmp=./conf$$-$RANDOM
|
|
||||||
(umask 077 && mkdir "$tmp")
|
|
||||||
} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5
|
|
||||||
ac_tmp=$tmp
|
|
||||||
|
|
||||||
# Set up the scripts for CONFIG_FILES section.
|
|
||||||
# No need to generate them if there are no CONFIG_FILES.
|
|
||||||
# This happens for instance with `./config.status config.h'.
|
|
||||||
if test -n "$CONFIG_FILES"; then
|
|
||||||
|
|
||||||
|
|
||||||
ac_cr=`echo X | tr X '\015'`
|
|
||||||
# On cygwin, bash can eat \r inside `` if the user requested igncr.
|
|
||||||
# But we know of no other shell where ac_cr would be empty at this
|
|
||||||
# point, so we can use a bashism as a fallback.
|
|
||||||
if test "x$ac_cr" = x; then
|
|
||||||
eval ac_cr=\$\'\\r\'
|
|
||||||
fi
|
|
||||||
ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' </dev/null 2>/dev/null`
|
|
||||||
if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then
|
|
||||||
ac_cs_awk_cr='\\r'
|
|
||||||
else
|
|
||||||
ac_cs_awk_cr=$ac_cr
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo 'BEGIN {' >"$ac_tmp/subs1.awk" &&
|
|
||||||
cat >>"$ac_tmp/subs1.awk" <<\_ACAWK &&
|
|
||||||
S["LTLIBOBJS"]=""
|
|
||||||
S["LIBOBJS"]=""
|
|
||||||
S["INSTALL_TARGET"]="install-tcl"
|
|
||||||
S["ALL_TARGET"]="tcl"
|
|
||||||
S["LD_RUN_PATH"]=""
|
|
||||||
S["SHLIB_CFLAGS"]="-fPIC"
|
|
||||||
S["DEPEND_FLAG"]="-MM"
|
|
||||||
S["gr_srcs"]=" ${TK_SRCS}"
|
|
||||||
S["gr_libs"]=" -lX11"
|
|
||||||
S["gr_dflags"]=" -DX11 -DXLIB"
|
|
||||||
S["gr_cflags"]=""
|
|
||||||
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["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"]="/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"]="-ldl"
|
|
||||||
S["SHLIB_LIB_SPECS"]=""
|
|
||||||
S["LDDL_FLAGS"]=" -shared -Wl,-soname,$@ -Wl,--version-script=${NETGENDIR}/netgen/symbol.map"
|
|
||||||
S["LD"]="/bin/ld"
|
|
||||||
S["SHLIB_LD"]=""
|
|
||||||
S["SHDLIB_EXT"]=".so"
|
|
||||||
S["X_EXTRA_LIBS"]=""
|
|
||||||
S["X_LIBS"]=""
|
|
||||||
S["X_PRE_LIBS"]=" -lSM -lICE"
|
|
||||||
S["X_CFLAGS"]=""
|
|
||||||
S["XMKMF"]=""
|
|
||||||
S["EGREP"]="/bin/grep -E"
|
|
||||||
S["GREP"]="/bin/grep"
|
|
||||||
S["M4"]="/bin/m4"
|
|
||||||
S["RANLIB"]="ranlib"
|
|
||||||
S["INSTALL_DATA"]="${INSTALL} -m 644"
|
|
||||||
S["INSTALL_SCRIPT"]="${INSTALL}"
|
|
||||||
S["INSTALL_PROGRAM"]="${INSTALL}"
|
|
||||||
S["CPP"]="gcc -E -x c"
|
|
||||||
S["OBJEXT"]="o"
|
|
||||||
S["EXEEXT"]=""
|
|
||||||
S["ac_ct_CC"]="gcc"
|
|
||||||
S["CPPFLAGS"]=""
|
|
||||||
S["LDFLAGS"]=""
|
|
||||||
S["CFLAGS"]="-g -m64 -fPIC"
|
|
||||||
S["CC"]="gcc"
|
|
||||||
S["target_os"]="linux-gnu"
|
|
||||||
S["target_vendor"]="unknown"
|
|
||||||
S["target_cpu"]="x86_64"
|
|
||||||
S["target"]="x86_64-unknown-linux-gnu"
|
|
||||||
S["host_os"]="linux-gnu"
|
|
||||||
S["host_vendor"]="unknown"
|
|
||||||
S["host_cpu"]="x86_64"
|
|
||||||
S["host"]="x86_64-unknown-linux-gnu"
|
|
||||||
S["build_os"]="linux-gnu"
|
|
||||||
S["build_vendor"]="unknown"
|
|
||||||
S["build_cpu"]="x86_64"
|
|
||||||
S["build"]="x86_64-unknown-linux-gnu"
|
|
||||||
S["target_alias"]=""
|
|
||||||
S["host_alias"]=""
|
|
||||||
S["build_alias"]=""
|
|
||||||
S["LIBS"]=""
|
|
||||||
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=\\\"60\\\" -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 -DTCL_NETGEN=1 -Dlinux=1 -DSYSV=1 -DISC=1"
|
|
||||||
S["mandir"]="${datarootdir}/man"
|
|
||||||
S["localedir"]="${datarootdir}/locale"
|
|
||||||
S["libdir"]="${exec_prefix}/lib"
|
|
||||||
S["psdir"]="${docdir}"
|
|
||||||
S["pdfdir"]="${docdir}"
|
|
||||||
S["dvidir"]="${docdir}"
|
|
||||||
S["htmldir"]="${docdir}"
|
|
||||||
S["infodir"]="${datarootdir}/info"
|
|
||||||
S["docdir"]="${datarootdir}/doc/${PACKAGE_TARNAME}"
|
|
||||||
S["oldincludedir"]="/usr/include"
|
|
||||||
S["includedir"]="${prefix}/include"
|
|
||||||
S["localstatedir"]="${prefix}/var"
|
|
||||||
S["sharedstatedir"]="${prefix}/com"
|
|
||||||
S["sysconfdir"]="${prefix}/etc"
|
|
||||||
S["datadir"]="${datarootdir}"
|
|
||||||
S["datarootdir"]="${prefix}/share"
|
|
||||||
S["libexecdir"]="${exec_prefix}/libexec"
|
|
||||||
S["sbindir"]="${exec_prefix}/sbin"
|
|
||||||
S["bindir"]="${exec_prefix}/bin"
|
|
||||||
S["program_transform_name"]="s,x,x,"
|
|
||||||
S["prefix"]="/usr/local"
|
|
||||||
S["exec_prefix"]="${prefix}"
|
|
||||||
S["PACKAGE_URL"]=""
|
|
||||||
S["PACKAGE_BUGREPORT"]="eda-dev@opencircuitdesign.com"
|
|
||||||
S["PACKAGE_STRING"]="netgen 1.3"
|
|
||||||
S["PACKAGE_VERSION"]="1.3"
|
|
||||||
S["PACKAGE_TARNAME"]="netgen"
|
|
||||||
S["PACKAGE_NAME"]="netgen"
|
|
||||||
S["PATH_SEPARATOR"]=":"
|
|
||||||
S["SHELL"]="/bin/sh"
|
|
||||||
_ACAWK
|
|
||||||
cat >>"$ac_tmp/subs1.awk" <<_ACAWK &&
|
|
||||||
for (key in S) S_is_set[key] = 1
|
|
||||||
FS = ""
|
|
||||||
|
|
||||||
}
|
|
||||||
{
|
|
||||||
line = $ 0
|
|
||||||
nfields = split(line, field, "@")
|
|
||||||
substed = 0
|
|
||||||
len = length(field[1])
|
|
||||||
for (i = 2; i < nfields; i++) {
|
|
||||||
key = field[i]
|
|
||||||
keylen = length(key)
|
|
||||||
if (S_is_set[key]) {
|
|
||||||
value = S[key]
|
|
||||||
line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3)
|
|
||||||
len += length(value) + length(field[++i])
|
|
||||||
substed = 1
|
|
||||||
} else
|
|
||||||
len += 1 + keylen
|
|
||||||
}
|
|
||||||
|
|
||||||
print line
|
|
||||||
}
|
|
||||||
|
|
||||||
_ACAWK
|
|
||||||
if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then
|
|
||||||
sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g"
|
|
||||||
else
|
|
||||||
cat
|
|
||||||
fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \
|
|
||||||
|| as_fn_error $? "could not setup config files machinery" "$LINENO" 5
|
|
||||||
fi # test -n "$CONFIG_FILES"
|
|
||||||
|
|
||||||
|
|
||||||
eval set X " :F $CONFIG_FILES "
|
|
||||||
shift
|
|
||||||
for ac_tag
|
|
||||||
do
|
|
||||||
case $ac_tag in
|
|
||||||
:[FHLC]) ac_mode=$ac_tag; continue;;
|
|
||||||
esac
|
|
||||||
case $ac_mode$ac_tag in
|
|
||||||
:[FHL]*:*);;
|
|
||||||
:L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;;
|
|
||||||
:[FH]-) ac_tag=-:-;;
|
|
||||||
:[FH]*) ac_tag=$ac_tag:$ac_tag.in;;
|
|
||||||
esac
|
|
||||||
ac_save_IFS=$IFS
|
|
||||||
IFS=:
|
|
||||||
set x $ac_tag
|
|
||||||
IFS=$ac_save_IFS
|
|
||||||
shift
|
|
||||||
ac_file=$1
|
|
||||||
shift
|
|
||||||
|
|
||||||
case $ac_mode in
|
|
||||||
:L) ac_source=$1;;
|
|
||||||
:[FH])
|
|
||||||
ac_file_inputs=
|
|
||||||
for ac_f
|
|
||||||
do
|
|
||||||
case $ac_f in
|
|
||||||
-) ac_f="$ac_tmp/stdin";;
|
|
||||||
*) # Look for the file first in the build tree, then in the source tree
|
|
||||||
# (if the path is not absolute). The absolute path cannot be DOS-style,
|
|
||||||
# because $ac_f cannot contain `:'.
|
|
||||||
test -f "$ac_f" ||
|
|
||||||
case $ac_f in
|
|
||||||
[\\/$]*) false;;
|
|
||||||
*) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";;
|
|
||||||
esac ||
|
|
||||||
as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;;
|
|
||||||
esac
|
|
||||||
case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac
|
|
||||||
as_fn_append ac_file_inputs " '$ac_f'"
|
|
||||||
done
|
|
||||||
|
|
||||||
# Let's still pretend it is `configure' which instantiates (i.e., don't
|
|
||||||
# use $as_me), people would be surprised to read:
|
|
||||||
# /* config.h. Generated by config.status. */
|
|
||||||
configure_input='Generated from '`
|
|
||||||
$as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'
|
|
||||||
`' by configure.'
|
|
||||||
if test x"$ac_file" != x-; then
|
|
||||||
configure_input="$ac_file. $configure_input"
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5
|
|
||||||
$as_echo "$as_me: creating $ac_file" >&6;}
|
|
||||||
fi
|
|
||||||
# Neutralize special characters interpreted by sed in replacement strings.
|
|
||||||
case $configure_input in #(
|
|
||||||
*\&* | *\|* | *\\* )
|
|
||||||
ac_sed_conf_input=`$as_echo "$configure_input" |
|
|
||||||
sed 's/[\\\\&|]/\\\\&/g'`;; #(
|
|
||||||
*) ac_sed_conf_input=$configure_input;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
case $ac_tag in
|
|
||||||
*:-:* | *:-) cat >"$ac_tmp/stdin" \
|
|
||||||
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;;
|
|
||||||
esac
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
ac_dir=`$as_dirname -- "$ac_file" ||
|
|
||||||
$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
|
|
||||||
X"$ac_file" : 'X\(//\)[^/]' \| \
|
|
||||||
X"$ac_file" : 'X\(//\)$' \| \
|
|
||||||
X"$ac_file" : 'X\(/\)' \| . 2>/dev/null ||
|
|
||||||
$as_echo X"$ac_file" |
|
|
||||||
sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\/\)[^/].*/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\/\)$/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/^X\(\/\).*/{
|
|
||||||
s//\1/
|
|
||||||
q
|
|
||||||
}
|
|
||||||
s/.*/./; q'`
|
|
||||||
as_dir="$ac_dir"; as_fn_mkdir_p
|
|
||||||
ac_builddir=.
|
|
||||||
|
|
||||||
case "$ac_dir" in
|
|
||||||
.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;
|
|
||||||
*)
|
|
||||||
ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'`
|
|
||||||
# A ".." for each directory in $ac_dir_suffix.
|
|
||||||
ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'`
|
|
||||||
case $ac_top_builddir_sub in
|
|
||||||
"") ac_top_builddir_sub=. ac_top_build_prefix= ;;
|
|
||||||
*) ac_top_build_prefix=$ac_top_builddir_sub/ ;;
|
|
||||||
esac ;;
|
|
||||||
esac
|
|
||||||
ac_abs_top_builddir=$ac_pwd
|
|
||||||
ac_abs_builddir=$ac_pwd$ac_dir_suffix
|
|
||||||
# for backward compatibility:
|
|
||||||
ac_top_builddir=$ac_top_build_prefix
|
|
||||||
|
|
||||||
case $srcdir in
|
|
||||||
.) # We are building in place.
|
|
||||||
ac_srcdir=.
|
|
||||||
ac_top_srcdir=$ac_top_builddir_sub
|
|
||||||
ac_abs_top_srcdir=$ac_pwd ;;
|
|
||||||
[\\/]* | ?:[\\/]* ) # Absolute name.
|
|
||||||
ac_srcdir=$srcdir$ac_dir_suffix;
|
|
||||||
ac_top_srcdir=$srcdir
|
|
||||||
ac_abs_top_srcdir=$srcdir ;;
|
|
||||||
*) # Relative name.
|
|
||||||
ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix
|
|
||||||
ac_top_srcdir=$ac_top_build_prefix$srcdir
|
|
||||||
ac_abs_top_srcdir=$ac_pwd/$srcdir ;;
|
|
||||||
esac
|
|
||||||
ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix
|
|
||||||
|
|
||||||
|
|
||||||
case $ac_mode in
|
|
||||||
:F)
|
|
||||||
#
|
|
||||||
# CONFIG_FILE
|
|
||||||
#
|
|
||||||
|
|
||||||
case $INSTALL in
|
|
||||||
[\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
|
|
||||||
*) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;
|
|
||||||
esac
|
|
||||||
# If the template does not know about datarootdir, expand it.
|
|
||||||
# FIXME: This hack should be removed a few years after 2.60.
|
|
||||||
ac_datarootdir_hack=; ac_datarootdir_seen=
|
|
||||||
ac_sed_dataroot='
|
|
||||||
/datarootdir/ {
|
|
||||||
p
|
|
||||||
q
|
|
||||||
}
|
|
||||||
/@datadir@/p
|
|
||||||
/@docdir@/p
|
|
||||||
/@infodir@/p
|
|
||||||
/@localedir@/p
|
|
||||||
/@mandir@/p'
|
|
||||||
case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in
|
|
||||||
*datarootdir*) ac_datarootdir_seen=yes;;
|
|
||||||
*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5
|
|
||||||
$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;}
|
|
||||||
ac_datarootdir_hack='
|
|
||||||
s&@datadir@&${datarootdir}&g
|
|
||||||
s&@docdir@&${datarootdir}/doc/${PACKAGE_TARNAME}&g
|
|
||||||
s&@infodir@&${datarootdir}/info&g
|
|
||||||
s&@localedir@&${datarootdir}/locale&g
|
|
||||||
s&@mandir@&${datarootdir}/man&g
|
|
||||||
s&\${datarootdir}&${prefix}/share&g' ;;
|
|
||||||
esac
|
|
||||||
ac_sed_extra="
|
|
||||||
|
|
||||||
:t
|
|
||||||
/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
|
|
||||||
s|@configure_input@|$ac_sed_conf_input|;t t
|
|
||||||
s&@top_builddir@&$ac_top_builddir_sub&;t t
|
|
||||||
s&@top_build_prefix@&$ac_top_build_prefix&;t t
|
|
||||||
s&@srcdir@&$ac_srcdir&;t t
|
|
||||||
s&@abs_srcdir@&$ac_abs_srcdir&;t t
|
|
||||||
s&@top_srcdir@&$ac_top_srcdir&;t t
|
|
||||||
s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t
|
|
||||||
s&@builddir@&$ac_builddir&;t t
|
|
||||||
s&@abs_builddir@&$ac_abs_builddir&;t t
|
|
||||||
s&@abs_top_builddir@&$ac_abs_top_builddir&;t t
|
|
||||||
s&@INSTALL@&$ac_INSTALL&;t t
|
|
||||||
$ac_datarootdir_hack
|
|
||||||
"
|
|
||||||
eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \
|
|
||||||
>$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5
|
|
||||||
|
|
||||||
test -z "$ac_datarootdir_hack$ac_datarootdir_seen" &&
|
|
||||||
{ ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } &&
|
|
||||||
{ ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \
|
|
||||||
"$ac_tmp/out"`; test -z "$ac_out"; } &&
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir'
|
|
||||||
which seems to be undefined. Please make sure it is defined" >&5
|
|
||||||
$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir'
|
|
||||||
which seems to be undefined. Please make sure it is defined" >&2;}
|
|
||||||
|
|
||||||
rm -f "$ac_tmp/stdin"
|
|
||||||
case $ac_file in
|
|
||||||
-) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";;
|
|
||||||
*) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";;
|
|
||||||
esac \
|
|
||||||
|| as_fn_error $? "could not create $ac_file" "$LINENO" 5
|
|
||||||
;;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
esac
|
|
||||||
|
|
||||||
done # for ac_tag
|
|
||||||
|
|
||||||
|
|
||||||
as_fn_exit 0
|
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -633,6 +633,7 @@ gr_srcs
|
||||||
gr_libs
|
gr_libs
|
||||||
gr_dflags
|
gr_dflags
|
||||||
gr_cflags
|
gr_cflags
|
||||||
|
DIST_DIR
|
||||||
cadinstall
|
cadinstall
|
||||||
programs
|
programs
|
||||||
unused
|
unused
|
||||||
|
|
@ -664,9 +665,9 @@ X_LIBS
|
||||||
X_PRE_LIBS
|
X_PRE_LIBS
|
||||||
X_CFLAGS
|
X_CFLAGS
|
||||||
XMKMF
|
XMKMF
|
||||||
|
HAVE_PYTHON3
|
||||||
EGREP
|
EGREP
|
||||||
GREP
|
GREP
|
||||||
M4
|
|
||||||
RANLIB
|
RANLIB
|
||||||
INSTALL_DATA
|
INSTALL_DATA
|
||||||
INSTALL_SCRIPT
|
INSTALL_SCRIPT
|
||||||
|
|
@ -710,6 +711,7 @@ infodir
|
||||||
docdir
|
docdir
|
||||||
oldincludedir
|
oldincludedir
|
||||||
includedir
|
includedir
|
||||||
|
runstatedir
|
||||||
localstatedir
|
localstatedir
|
||||||
sharedstatedir
|
sharedstatedir
|
||||||
sysconfdir
|
sysconfdir
|
||||||
|
|
@ -733,6 +735,7 @@ ac_subst_files=''
|
||||||
ac_user_opts='
|
ac_user_opts='
|
||||||
enable_option_checking
|
enable_option_checking
|
||||||
with_gnu_ld
|
with_gnu_ld
|
||||||
|
with_distdir
|
||||||
with_interpreter
|
with_interpreter
|
||||||
with_tcl
|
with_tcl
|
||||||
with_tk
|
with_tk
|
||||||
|
|
@ -791,6 +794,7 @@ datadir='${datarootdir}'
|
||||||
sysconfdir='${prefix}/etc'
|
sysconfdir='${prefix}/etc'
|
||||||
sharedstatedir='${prefix}/com'
|
sharedstatedir='${prefix}/com'
|
||||||
localstatedir='${prefix}/var'
|
localstatedir='${prefix}/var'
|
||||||
|
runstatedir='${localstatedir}/run'
|
||||||
includedir='${prefix}/include'
|
includedir='${prefix}/include'
|
||||||
oldincludedir='/usr/include'
|
oldincludedir='/usr/include'
|
||||||
docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
|
docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'
|
||||||
|
|
@ -1043,6 +1047,15 @@ do
|
||||||
| -silent | --silent | --silen | --sile | --sil)
|
| -silent | --silent | --silen | --sile | --sil)
|
||||||
silent=yes ;;
|
silent=yes ;;
|
||||||
|
|
||||||
|
-runstatedir | --runstatedir | --runstatedi | --runstated \
|
||||||
|
| --runstate | --runstat | --runsta | --runst | --runs \
|
||||||
|
| --run | --ru | --r)
|
||||||
|
ac_prev=runstatedir ;;
|
||||||
|
-runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \
|
||||||
|
| --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \
|
||||||
|
| --run=* | --ru=* | --r=*)
|
||||||
|
runstatedir=$ac_optarg ;;
|
||||||
|
|
||||||
-sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
|
-sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
|
||||||
ac_prev=sbindir ;;
|
ac_prev=sbindir ;;
|
||||||
-sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
|
-sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
|
||||||
|
|
@ -1180,7 +1193,7 @@ fi
|
||||||
for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
|
for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \
|
||||||
datadir sysconfdir sharedstatedir localstatedir includedir \
|
datadir sysconfdir sharedstatedir localstatedir includedir \
|
||||||
oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
|
oldincludedir docdir infodir htmldir dvidir pdfdir psdir \
|
||||||
libdir localedir mandir
|
libdir localedir mandir runstatedir
|
||||||
do
|
do
|
||||||
eval ac_val=\$$ac_var
|
eval ac_val=\$$ac_var
|
||||||
# Remove trailing slashes.
|
# Remove trailing slashes.
|
||||||
|
|
@ -1333,6 +1346,7 @@ Fine tuning of the installation directories:
|
||||||
--sysconfdir=DIR read-only single-machine data [PREFIX/etc]
|
--sysconfdir=DIR read-only single-machine data [PREFIX/etc]
|
||||||
--sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
|
--sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
|
||||||
--localstatedir=DIR modifiable single-machine data [PREFIX/var]
|
--localstatedir=DIR modifiable single-machine data [PREFIX/var]
|
||||||
|
--runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run]
|
||||||
--libdir=DIR object code libraries [EPREFIX/lib]
|
--libdir=DIR object code libraries [EPREFIX/lib]
|
||||||
--includedir=DIR C header files [PREFIX/include]
|
--includedir=DIR C header files [PREFIX/include]
|
||||||
--oldincludedir=DIR C header files for non-gcc [/usr/include]
|
--oldincludedir=DIR C header files for non-gcc [/usr/include]
|
||||||
|
|
@ -1371,6 +1385,7 @@ Optional Packages:
|
||||||
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
|
--with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
|
||||||
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
|
--without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
|
||||||
--with-gnu-ld assume the C compiler uses GNU ld [default=no]
|
--with-gnu-ld assume the C compiler uses GNU ld [default=no]
|
||||||
|
--with-distdir=DIR install into location DIR for distribution
|
||||||
--with-interpreter=arg enable interpreter
|
--with-interpreter=arg enable interpreter
|
||||||
--with-tcl=DIR Find tclConfig.sh in DIR
|
--with-tcl=DIR Find tclConfig.sh in DIR
|
||||||
--with-tk=DIR Find tkConfig.sh in DIR
|
--with-tk=DIR Find tkConfig.sh in DIR
|
||||||
|
|
@ -3686,56 +3701,6 @@ else
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
for ac_prog in gm4 gnum4 m4
|
|
||||||
do
|
|
||||||
# Extract the first word of "$ac_prog", so it can be a program name with args.
|
|
||||||
set dummy $ac_prog; ac_word=$2
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
|
|
||||||
$as_echo_n "checking for $ac_word... " >&6; }
|
|
||||||
if ${ac_cv_path_M4+:} false; then :
|
|
||||||
$as_echo_n "(cached) " >&6
|
|
||||||
else
|
|
||||||
case $M4 in
|
|
||||||
[\\/]* | ?:[\\/]*)
|
|
||||||
ac_cv_path_M4="$M4" # Let the user override the test with a path.
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
|
||||||
for as_dir in $PATH
|
|
||||||
do
|
|
||||||
IFS=$as_save_IFS
|
|
||||||
test -z "$as_dir" && as_dir=.
|
|
||||||
for ac_exec_ext in '' $ac_executable_extensions; do
|
|
||||||
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
|
|
||||||
ac_cv_path_M4="$as_dir/$ac_word$ac_exec_ext"
|
|
||||||
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
|
|
||||||
break 2
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
done
|
|
||||||
IFS=$as_save_IFS
|
|
||||||
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
fi
|
|
||||||
M4=$ac_cv_path_M4
|
|
||||||
if test -n "$M4"; then
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $M4" >&5
|
|
||||||
$as_echo "$M4" >&6; }
|
|
||||||
else
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
|
||||||
$as_echo "no" >&6; }
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
test -n "$M4" && break
|
|
||||||
done
|
|
||||||
test -n "$M4" || M4="no"
|
|
||||||
|
|
||||||
if test x$M4 = xno; then
|
|
||||||
as_fn_error $? "M4 is required" "$LINENO" 5
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
if test "$CPP" = "$CC -E" ; then
|
if test "$CPP" = "$CC -E" ; then
|
||||||
CPP="$CPP -x c"
|
CPP="$CPP -x c"
|
||||||
|
|
@ -4638,6 +4603,45 @@ fi
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|
||||||
|
# Extract the first word of "python3", so it can be a program name with args.
|
||||||
|
set dummy python3; ac_word=$2
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
|
||||||
|
$as_echo_n "checking for $ac_word... " >&6; }
|
||||||
|
if ${ac_cv_prog_HAVE_PYTHON3+:} false; then :
|
||||||
|
$as_echo_n "(cached) " >&6
|
||||||
|
else
|
||||||
|
if test -n "$HAVE_PYTHON3"; then
|
||||||
|
ac_cv_prog_HAVE_PYTHON3="$HAVE_PYTHON3" # Let the user override the test.
|
||||||
|
else
|
||||||
|
as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
|
||||||
|
for as_dir in $PATH
|
||||||
|
do
|
||||||
|
IFS=$as_save_IFS
|
||||||
|
test -z "$as_dir" && as_dir=.
|
||||||
|
for ac_exec_ext in '' $ac_executable_extensions; do
|
||||||
|
if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
|
||||||
|
ac_cv_prog_HAVE_PYTHON3="yes"
|
||||||
|
$as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
|
||||||
|
break 2
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
done
|
||||||
|
IFS=$as_save_IFS
|
||||||
|
|
||||||
|
test -z "$ac_cv_prog_HAVE_PYTHON3" && ac_cv_prog_HAVE_PYTHON3="no"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
HAVE_PYTHON3=$ac_cv_prog_HAVE_PYTHON3
|
||||||
|
if test -n "$HAVE_PYTHON3"; then
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $HAVE_PYTHON3" >&5
|
||||||
|
$as_echo "$HAVE_PYTHON3" >&6; }
|
||||||
|
else
|
||||||
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
|
||||||
|
$as_echo "no" >&6; }
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for va_copy" >&5
|
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for va_copy" >&5
|
||||||
$as_echo_n "checking for va_copy... " >&6; }
|
$as_echo_n "checking for va_copy... " >&6; }
|
||||||
if ${ac_cv_c_va_copy+:} false; then :
|
if ${ac_cv_c_va_copy+:} false; then :
|
||||||
|
|
@ -4758,6 +4762,24 @@ usingTcl=1
|
||||||
usingX11=
|
usingX11=
|
||||||
|
|
||||||
|
|
||||||
|
# For distributed installs, where the run-time files are installed in a
|
||||||
|
# place that is a temporary staging area, like DESTDIR, but unlike DESTDIR,
|
||||||
|
# the prefix is replaced by the destination directory, rather than appended
|
||||||
|
# to it.
|
||||||
|
DIST_DIR="\${exec_prefix}"
|
||||||
|
|
||||||
|
# Check whether --with-distdir was given.
|
||||||
|
if test "${with_distdir+set}" = set; then :
|
||||||
|
withval=$with_distdir;
|
||||||
|
if test "$withval" = "no" -o "$withval" = "NO" ; then
|
||||||
|
DIST_DIR="\${exec_prefix}"
|
||||||
|
else
|
||||||
|
DIST_DIR=${withval}
|
||||||
|
fi
|
||||||
|
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Check whether --with-interpreter was given.
|
# Check whether --with-interpreter was given.
|
||||||
if test "${with_interpreter+set}" = set; then :
|
if test "${with_interpreter+set}" = set; then :
|
||||||
|
|
@ -6004,7 +6026,6 @@ fi
|
||||||
|
|
||||||
|
|
||||||
if test $usingTcl ; then
|
if test $usingTcl ; then
|
||||||
usingX11=1
|
|
||||||
cadinstall="$cadinstall tcltk"
|
cadinstall="$cadinstall tcltk"
|
||||||
modules="$modules tcltk"
|
modules="$modules tcltk"
|
||||||
programs="$programs tcltk"
|
programs="$programs tcltk"
|
||||||
|
|
@ -6014,7 +6035,11 @@ if test $usingTcl ; then
|
||||||
|
|
||||||
extra_libs="$extra_libs \${NETGENDIR}/tcltk/libtcltk.o"
|
extra_libs="$extra_libs \${NETGENDIR}/tcltk/libtcltk.o"
|
||||||
extra_defs="$extra_defs -DTCL_DIR=\\\"\${TCLDIR}\\\""
|
extra_defs="$extra_defs -DTCL_DIR=\\\"\${TCLDIR}\\\""
|
||||||
stub_defs="$stub_defs -DUSE_TCL_STUBS -DUSE_TK_STUBS"
|
if test $usingX11 ; then
|
||||||
|
stub_defs="$stub_defs -DUSE_TCL_STUBS"
|
||||||
|
else
|
||||||
|
stub_defs="$stub_defs -DUSE_TCL_STUBS -DUSE_TK_STUBS"
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
programs="$programs netgen"
|
programs="$programs netgen"
|
||||||
unused="$unused tcltk"
|
unused="$unused tcltk"
|
||||||
|
|
@ -6081,8 +6106,7 @@ case $target in
|
||||||
|
|
||||||
;;
|
;;
|
||||||
*darwin*)
|
*darwin*)
|
||||||
$as_echo "#define macosx 1" >>confdefs.h
|
$as_echo "#define macosx macos" >> confdefs.h
|
||||||
|
|
||||||
if test "$CPP" = "cc -E" ; then
|
if test "$CPP" = "cc -E" ; then
|
||||||
CPPFLAGS="$CPPFLAGS -no-cpp-precomp"
|
CPPFLAGS="$CPPFLAGS -no-cpp-precomp"
|
||||||
fi
|
fi
|
||||||
|
|
@ -6100,6 +6124,7 @@ if test $usingTcl ; then
|
||||||
# Tk libraries and header files
|
# Tk libraries and header files
|
||||||
#
|
#
|
||||||
# -----------------------------------------------------------------------
|
# -----------------------------------------------------------------------
|
||||||
|
if test $usingX11 ; then
|
||||||
if test "${TK_INC_DIR}" != "/usr/include" ; then
|
if test "${TK_INC_DIR}" != "/usr/include" ; then
|
||||||
INC_SPECS="${INC_SPECS} -I${TK_INC_DIR}"
|
INC_SPECS="${INC_SPECS} -I${TK_INC_DIR}"
|
||||||
fi
|
fi
|
||||||
|
|
@ -6116,6 +6141,7 @@ if test $usingTcl ; then
|
||||||
loader_run_path="${TK_LIB_DIR}:${loader_run_path}"
|
loader_run_path="${TK_LIB_DIR}:${loader_run_path}"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
# -----------------------------------------------------------------------
|
# -----------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
|
|
@ -6225,7 +6251,7 @@ if test $usingTcl ; then
|
||||||
|
|
||||||
*darwin*)
|
*darwin*)
|
||||||
SHDLIB_EXT=".dylib"
|
SHDLIB_EXT=".dylib"
|
||||||
LDDL_FLAGS="-dynamiclib -flat_namespace -undefined suppress -noprebind"
|
LDDL_FLAGS="-dynamiclib -undefined dynamic_lookup"
|
||||||
LDFLAGS="${LDFLAGS} ${LIB_SPECS}"
|
LDFLAGS="${LDFLAGS} ${LIB_SPECS}"
|
||||||
CFLAGS="${CFLAGS} ${X_CFLAGS} ${INC_SPECS} -I/sw/include -fno-common"
|
CFLAGS="${CFLAGS} ${X_CFLAGS} ${INC_SPECS} -I/sw/include -fno-common"
|
||||||
;;
|
;;
|
||||||
|
|
@ -6374,7 +6400,7 @@ fi
|
||||||
# Not available on all versions: check for include file.
|
# Not available on all versions: check for include file.
|
||||||
SHLIB_CFLAGS="-fpic"
|
SHLIB_CFLAGS="-fpic"
|
||||||
LDDL_FLAGS="-shared ${LIB_SPECS}"
|
LDDL_FLAGS="-shared ${LIB_SPECS}"
|
||||||
CFLAGS="${CFLAGS} -l/usr/X11R6/include"
|
CFLAGS="${CFLAGS} -L/usr/X11R6/include"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
*-netbsd*|*-openbsd*)
|
*-netbsd*|*-openbsd*)
|
||||||
|
|
@ -6546,6 +6572,8 @@ fi
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -7738,6 +7766,20 @@ else
|
||||||
echo
|
echo
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
${ECHO_N} "Python3: "
|
||||||
|
if test "${HAVE_PYTHON3}" == "yes"; then
|
||||||
|
echo "yes"
|
||||||
|
else
|
||||||
|
echo "no"
|
||||||
|
echo
|
||||||
|
echo " Without Python3, you cannot run the GUI interface to netgen."
|
||||||
|
echo " This is purely optional, as it contains no features not"
|
||||||
|
echo " available in the command-line (Tcl/Tk) version. If you want"
|
||||||
|
echo " python3 support, make sure that you have installed python3"
|
||||||
|
echo " on your system."
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
|
||||||
echo "-----------------------------------------------------------"
|
echo "-----------------------------------------------------------"
|
||||||
echo
|
echo
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -26,12 +26,6 @@ AC_ISC_POSIX
|
||||||
AC_PROG_INSTALL
|
AC_PROG_INSTALL
|
||||||
AC_PROG_RANLIB
|
AC_PROG_RANLIB
|
||||||
|
|
||||||
dnl GNU M4 is preferred due to some of the option switches.
|
|
||||||
AC_PATH_PROGS([M4], [gm4 gnum4 m4], [no])
|
|
||||||
if test x$M4 = xno; then
|
|
||||||
AC_MSG_ERROR([M4 is required])
|
|
||||||
fi
|
|
||||||
|
|
||||||
dnl check size of pointer for correct behavior on 64-bit systems
|
dnl check size of pointer for correct behavior on 64-bit systems
|
||||||
dnl If the C preprocessor is GCC, we need to force the flag to
|
dnl If the C preprocessor is GCC, we need to force the flag to
|
||||||
dnl assert that input files are of type C, or else the preprocessing
|
dnl assert that input files are of type C, or else the preprocessing
|
||||||
|
|
@ -163,6 +157,9 @@ AC_CHECK_HEADERS(limits.h)
|
||||||
dnl Check for <param.h>
|
dnl Check for <param.h>
|
||||||
AC_CHECK_HEADERS(param.h)
|
AC_CHECK_HEADERS(param.h)
|
||||||
|
|
||||||
|
dnl Check for Python3
|
||||||
|
AC_CHECK_PROG(HAVE_PYTHON3, python3, yes, no)
|
||||||
|
|
||||||
dnl Check for va_copy
|
dnl Check for va_copy
|
||||||
AC_CACHE_CHECK([for va_copy], ac_cv_c_va_copy,
|
AC_CACHE_CHECK([for va_copy], ac_cv_c_va_copy,
|
||||||
AC_TRY_LINK(
|
AC_TRY_LINK(
|
||||||
|
|
@ -246,6 +243,20 @@ usingX11=
|
||||||
|
|
||||||
dnl Compile-time options below. . .
|
dnl Compile-time options below. . .
|
||||||
|
|
||||||
|
# For distributed installs, where the run-time files are installed in a
|
||||||
|
# place that is a temporary staging area, like DESTDIR, but unlike DESTDIR,
|
||||||
|
# the prefix is replaced by the destination directory, rather than appended
|
||||||
|
# to it.
|
||||||
|
DIST_DIR="\${exec_prefix}"
|
||||||
|
AC_ARG_WITH(distdir,
|
||||||
|
[ --with-distdir=DIR install into location DIR for distribution], [
|
||||||
|
if test "$withval" = "no" -o "$withval" = "NO" ; then
|
||||||
|
DIST_DIR="\${exec_prefix}"
|
||||||
|
else
|
||||||
|
DIST_DIR=${withval}
|
||||||
|
fi
|
||||||
|
], )
|
||||||
|
|
||||||
AC_ARG_WITH(interpreter,
|
AC_ARG_WITH(interpreter,
|
||||||
[ --with-interpreter=[arg] enable interpreter], [
|
[ --with-interpreter=[arg] enable interpreter], [
|
||||||
if test "$withval" = "no" -o "$withval" = "NO"; then
|
if test "$withval" = "no" -o "$withval" = "NO"; then
|
||||||
|
|
@ -790,7 +801,6 @@ dnl "make" instead of requiring "make tcl"
|
||||||
dnl ----------------------------------------------------------------
|
dnl ----------------------------------------------------------------
|
||||||
|
|
||||||
if test $usingTcl ; then
|
if test $usingTcl ; then
|
||||||
usingX11=1
|
|
||||||
cadinstall="$cadinstall tcltk"
|
cadinstall="$cadinstall tcltk"
|
||||||
modules="$modules tcltk"
|
modules="$modules tcltk"
|
||||||
programs="$programs tcltk"
|
programs="$programs tcltk"
|
||||||
|
|
@ -799,7 +809,11 @@ if test $usingTcl ; then
|
||||||
AC_DEFINE(TCL_NETGEN)
|
AC_DEFINE(TCL_NETGEN)
|
||||||
extra_libs="$extra_libs \${NETGENDIR}/tcltk/libtcltk.o"
|
extra_libs="$extra_libs \${NETGENDIR}/tcltk/libtcltk.o"
|
||||||
extra_defs="$extra_defs -DTCL_DIR=\\\"\${TCLDIR}\\\""
|
extra_defs="$extra_defs -DTCL_DIR=\\\"\${TCLDIR}\\\""
|
||||||
stub_defs="$stub_defs -DUSE_TCL_STUBS -DUSE_TK_STUBS"
|
if test $usingX11 ; then
|
||||||
|
stub_defs="$stub_defs -DUSE_TCL_STUBS"
|
||||||
|
else
|
||||||
|
stub_defs="$stub_defs -DUSE_TCL_STUBS -DUSE_TK_STUBS"
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
programs="$programs netgen"
|
programs="$programs netgen"
|
||||||
unused="$unused tcltk"
|
unused="$unused tcltk"
|
||||||
|
|
@ -868,7 +882,7 @@ case $target in
|
||||||
AC_DEFINE(i386)
|
AC_DEFINE(i386)
|
||||||
;;
|
;;
|
||||||
*darwin*)
|
*darwin*)
|
||||||
AC_DEFINE(macosx)
|
$as_echo "#define macosx macos" >> confdefs.h
|
||||||
if test "$CPP" = "cc -E" ; then
|
if test "$CPP" = "cc -E" ; then
|
||||||
CPPFLAGS="$CPPFLAGS -no-cpp-precomp"
|
CPPFLAGS="$CPPFLAGS -no-cpp-precomp"
|
||||||
fi
|
fi
|
||||||
|
|
@ -886,6 +900,7 @@ if test $usingTcl ; then
|
||||||
# Tk libraries and header files
|
# Tk libraries and header files
|
||||||
#
|
#
|
||||||
# -----------------------------------------------------------------------
|
# -----------------------------------------------------------------------
|
||||||
|
if test $usingX11 ; then
|
||||||
if test "${TK_INC_DIR}" != "/usr/include" ; then
|
if test "${TK_INC_DIR}" != "/usr/include" ; then
|
||||||
INC_SPECS="${INC_SPECS} -I${TK_INC_DIR}"
|
INC_SPECS="${INC_SPECS} -I${TK_INC_DIR}"
|
||||||
fi
|
fi
|
||||||
|
|
@ -902,6 +917,7 @@ if test $usingTcl ; then
|
||||||
loader_run_path="${TK_LIB_DIR}:${loader_run_path}"
|
loader_run_path="${TK_LIB_DIR}:${loader_run_path}"
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
# -----------------------------------------------------------------------
|
# -----------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
|
|
@ -1011,7 +1027,7 @@ if test $usingTcl ; then
|
||||||
|
|
||||||
*darwin*)
|
*darwin*)
|
||||||
SHDLIB_EXT=".dylib"
|
SHDLIB_EXT=".dylib"
|
||||||
LDDL_FLAGS="-dynamiclib -flat_namespace -undefined suppress -noprebind"
|
LDDL_FLAGS="-dynamiclib -undefined dynamic_lookup"
|
||||||
LDFLAGS="${LDFLAGS} ${LIB_SPECS}"
|
LDFLAGS="${LDFLAGS} ${LIB_SPECS}"
|
||||||
CFLAGS="${CFLAGS} ${X_CFLAGS} ${INC_SPECS} -I/sw/include -fno-common"
|
CFLAGS="${CFLAGS} ${X_CFLAGS} ${INC_SPECS} -I/sw/include -fno-common"
|
||||||
;;
|
;;
|
||||||
|
|
@ -1117,7 +1133,7 @@ if test $usingTcl ; then
|
||||||
# Not available on all versions: check for include file.
|
# Not available on all versions: check for include file.
|
||||||
SHLIB_CFLAGS="-fpic"
|
SHLIB_CFLAGS="-fpic"
|
||||||
LDDL_FLAGS="-shared ${LIB_SPECS}"
|
LDDL_FLAGS="-shared ${LIB_SPECS}"
|
||||||
CFLAGS="${CFLAGS} -l/usr/X11R6/include"
|
CFLAGS="${CFLAGS} -L/usr/X11R6/include"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
*-netbsd*|*-openbsd*)
|
*-netbsd*|*-openbsd*)
|
||||||
|
|
@ -1269,11 +1285,13 @@ AC_SUBST(modules)
|
||||||
AC_SUBST(unused)
|
AC_SUBST(unused)
|
||||||
AC_SUBST(programs)
|
AC_SUBST(programs)
|
||||||
AC_SUBST(cadinstall)
|
AC_SUBST(cadinstall)
|
||||||
|
AC_SUBST(DIST_DIR)
|
||||||
|
|
||||||
AC_SUBST(gr_cflags)
|
AC_SUBST(gr_cflags)
|
||||||
AC_SUBST(gr_dflags)
|
AC_SUBST(gr_dflags)
|
||||||
AC_SUBST(gr_libs)
|
AC_SUBST(gr_libs)
|
||||||
AC_SUBST(gr_srcs)
|
AC_SUBST(gr_srcs)
|
||||||
|
AC_SUBST(HAVE_PYTHON3)
|
||||||
|
|
||||||
AC_SUBST(X_LIBS)
|
AC_SUBST(X_LIBS)
|
||||||
AC_SUBST(X_CFLAGS)
|
AC_SUBST(X_CFLAGS)
|
||||||
|
|
@ -1314,6 +1332,20 @@ else
|
||||||
echo
|
echo
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
${ECHO_N} "Python3: "
|
||||||
|
if test "${HAVE_PYTHON3}" == "yes"; then
|
||||||
|
echo "yes"
|
||||||
|
else
|
||||||
|
echo "no"
|
||||||
|
echo
|
||||||
|
echo " Without Python3, you cannot run the GUI interface to netgen."
|
||||||
|
echo " This is purely optional, as it contains no features not"
|
||||||
|
echo " available in the command-line (Tcl/Tk) version. If you want"
|
||||||
|
echo " python3 support, make sure that you have installed python3"
|
||||||
|
echo " on your system."
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
|
||||||
echo "-----------------------------------------------------------"
|
echo "-----------------------------------------------------------"
|
||||||
echo
|
echo
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
dnl Process this file with autoconf to produce a configure script.
|
dnl Process this file with autoconf to produce a configure script.
|
||||||
dnl Use autoconf 2.52 or newer.
|
dnl Use autoconf 2.52 or newer.
|
||||||
|
|
||||||
AC_INIT(netgen, 1.3, magic-hackers@csl.cornell.edu)
|
AC_INIT(netgen, 1.3, eda-dev@opencircuitdesign.com)
|
||||||
AC_PREREQ(2.52)
|
AC_PREREQ(2.52)
|
||||||
AC_CONFIG_SRCDIR(rules.mak)
|
AC_CONFIG_SRCDIR(rules.mak)
|
||||||
AC_CONFIG_AUX_DIR(.)
|
AC_CONFIG_AUX_DIR(.)
|
||||||
|
|
@ -38,7 +38,7 @@ dnl assert that input files are of type C, or else the preprocessing
|
||||||
dnl stage will not execute correctly on the ".in" files in the scmos
|
dnl stage will not execute correctly on the ".in" files in the scmos
|
||||||
dnl directory.
|
dnl directory.
|
||||||
|
|
||||||
if test "$CPP" = "gcc -E" ; then
|
if test "$CPP" = "$CC -E" ; then
|
||||||
CPP="$CPP -x c"
|
CPP="$CPP -x c"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
@ -163,6 +163,9 @@ AC_CHECK_HEADERS(limits.h)
|
||||||
dnl Check for <param.h>
|
dnl Check for <param.h>
|
||||||
AC_CHECK_HEADERS(param.h)
|
AC_CHECK_HEADERS(param.h)
|
||||||
|
|
||||||
|
dnl Check for Python3
|
||||||
|
AC_CHECK_PROG(HAVE_PYTHON3, python3, yes, no)
|
||||||
|
|
||||||
dnl Check for va_copy
|
dnl Check for va_copy
|
||||||
AC_CACHE_CHECK([for va_copy], ac_cv_c_va_copy,
|
AC_CACHE_CHECK([for va_copy], ac_cv_c_va_copy,
|
||||||
AC_TRY_LINK(
|
AC_TRY_LINK(
|
||||||
|
|
@ -195,6 +198,7 @@ fi
|
||||||
# not ANSI-compliant and won't compile without quite a bit of work.
|
# not ANSI-compliant and won't compile without quite a bit of work.
|
||||||
AC_DEFINE(DBUG_OFF)
|
AC_DEFINE(DBUG_OFF)
|
||||||
|
|
||||||
|
stub_defs=""
|
||||||
extra_defs="$extra_defs -DCAD_DIR=\\\"\${LIBDIR}\\\""
|
extra_defs="$extra_defs -DCAD_DIR=\\\"\${LIBDIR}\\\""
|
||||||
X_LIBS=
|
X_LIBS=
|
||||||
X_CFLAGS=
|
X_CFLAGS=
|
||||||
|
|
@ -245,6 +249,20 @@ usingX11=
|
||||||
|
|
||||||
dnl Compile-time options below. . .
|
dnl Compile-time options below. . .
|
||||||
|
|
||||||
|
# For distributed installs, where the run-time files are installed in a
|
||||||
|
# place that is a temporary staging area, like DESTDIR, but unlike DESTDIR,
|
||||||
|
# the prefix is replaced by the destination directory, rather than appended
|
||||||
|
# to it.
|
||||||
|
DIST_DIR="\${exec_prefix}"
|
||||||
|
AC_ARG_WITH(distdir,
|
||||||
|
[ --with-distdir=DIR install into location DIR for distribution], [
|
||||||
|
if test "$withval" = "no" -o "$withval" = "NO" ; then
|
||||||
|
DIST_DIR="\${exec_prefix}"
|
||||||
|
else
|
||||||
|
DIST_DIR=${withval}
|
||||||
|
fi
|
||||||
|
], )
|
||||||
|
|
||||||
AC_ARG_WITH(interpreter,
|
AC_ARG_WITH(interpreter,
|
||||||
[ --with-interpreter=[arg] enable interpreter], [
|
[ --with-interpreter=[arg] enable interpreter], [
|
||||||
if test "$withval" = "no" -o "$withval" = "NO"; then
|
if test "$withval" = "no" -o "$withval" = "NO"; then
|
||||||
|
|
@ -329,7 +347,7 @@ if test $usingTcl ; then
|
||||||
# 1. Search previously named locations.
|
# 1. Search previously named locations.
|
||||||
|
|
||||||
for dir in \
|
for dir in \
|
||||||
$prefix \
|
$ac_default_prefix \
|
||||||
$exec_prefix
|
$exec_prefix
|
||||||
do
|
do
|
||||||
if test -r "$dir/tclConfig.sh" ; then
|
if test -r "$dir/tclConfig.sh" ; then
|
||||||
|
|
@ -351,11 +369,10 @@ if test $usingTcl ; then
|
||||||
`ls -dr /usr/local/tcl/tcl[[7-9]].[[0-9]]* 2>/dev/null` \
|
`ls -dr /usr/local/tcl/tcl[[7-9]].[[0-9]]* 2>/dev/null` \
|
||||||
/usr/local/tcl \
|
/usr/local/tcl \
|
||||||
/usr/local/lib \
|
/usr/local/lib \
|
||||||
|
/usr/lib64 \
|
||||||
/usr/local \
|
/usr/local \
|
||||||
`ls -dr /usr/lib/tcl[[7-9]].[[0-9]]* 2>/dev/null` \
|
`ls -dr /usr/lib/tcl[[7-9]].[[0-9]]* 2>/dev/null` \
|
||||||
/sw/lib \
|
/sw/lib \
|
||||||
/usr/lib \
|
|
||||||
/usr/lib64 \
|
|
||||||
/usr
|
/usr
|
||||||
do
|
do
|
||||||
if test -r "$dir/tclConfig.sh" ; then
|
if test -r "$dir/tclConfig.sh" ; then
|
||||||
|
|
@ -415,7 +432,7 @@ if test $usingTcl ; then
|
||||||
# 1. Search previously named locations.
|
# 1. Search previously named locations.
|
||||||
#
|
#
|
||||||
for dir in \
|
for dir in \
|
||||||
$prefix \
|
$ac_default_prefix \
|
||||||
$exec_prefix
|
$exec_prefix
|
||||||
do
|
do
|
||||||
if test -r "$dir/tkConfig.sh" ; then
|
if test -r "$dir/tkConfig.sh" ; then
|
||||||
|
|
@ -434,21 +451,17 @@ if test $usingTcl ; then
|
||||||
#
|
#
|
||||||
if test "x$tk_config_sh" = "x" ; then
|
if test "x$tk_config_sh" = "x" ; then
|
||||||
for dir in \
|
for dir in \
|
||||||
/usr/local \
|
|
||||||
/usr \
|
|
||||||
`ls -dr /usr/local/lib/tk[[7-9]].[[0-9]]* 2>/dev/null` \
|
|
||||||
`ls -dr /usr/lib/tk[[7-9]].[[0-9]]* 2>/dev/null` \
|
|
||||||
`ls -dr /usr/local/tk/tk[[7-9]].[[0-9]]* 2>/dev/null` \
|
|
||||||
`ls -dr /usr/local/tk[[7-9]].[[0-9]]* 2>/dev/null` \
|
|
||||||
/usr/local/tk \
|
|
||||||
`ls -dr /usr/local/lib/tcl[[7-9]].[[0-9]]* 2>/dev/null` \
|
|
||||||
`ls -dr /usr/lib/tcl/tk[[7-9]].[[0-9]]* 2>/dev/null` \
|
|
||||||
`ls -dr /usr/local/tcl/tcl[[7-9]].[[0-9]]* 2>/dev/null` \
|
`ls -dr /usr/local/tcl/tcl[[7-9]].[[0-9]]* 2>/dev/null` \
|
||||||
`ls -dr /usr/share/tcltk/tk[[7-9]].[[0-9]]* 2>/dev/null` \
|
`ls -dr /usr/local/tk/tk[[7-9]].[[0-9]]* 2>/dev/null` \
|
||||||
/sw/lib \
|
/usr/local/tcl \
|
||||||
/usr/lib \
|
/usr/local/lib \
|
||||||
/usr/lib64 \
|
/usr/lib64 \
|
||||||
${x_libraries}
|
/usr/local \
|
||||||
|
`ls -dr /usr/lib/tcl[[7-9]].[[0-9]]* 2>/dev/null` \
|
||||||
|
`ls -dr /usr/lib/tk[[7-9]].[[0-9]]* 2>/dev/null` \
|
||||||
|
/sw/lib \
|
||||||
|
${x_libraries} \
|
||||||
|
/usr
|
||||||
do
|
do
|
||||||
if test -r "$dir/tkConfig.sh" ; then
|
if test -r "$dir/tkConfig.sh" ; then
|
||||||
tk_config_sh="$dir/tkConfig.sh"
|
tk_config_sh="$dir/tkConfig.sh"
|
||||||
|
|
@ -477,6 +490,25 @@ if test $usingTcl ; then
|
||||||
. $tcl_config_sh
|
. $tcl_config_sh
|
||||||
. $tk_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
|
if test "$TCL_VERSION" = "7.6" -a "$TK_VERSION" = "4.2" ; then
|
||||||
:
|
:
|
||||||
elif test "$TCL_VERSION" = "7.5" -a "$TK_VERSION" = "4.1" ; then
|
elif test "$TCL_VERSION" = "7.5" -a "$TK_VERSION" = "4.1" ; then
|
||||||
|
|
@ -620,7 +652,7 @@ if test $usingTcl ; then
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
if test "x${TCLSH_EXE}" != "x" ; then
|
if test "x${TCLSH_EXE}" != "x" ; then
|
||||||
break;
|
break
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
if test "x${TCLSH_EXE}" = "x" ; then
|
if test "x${TCLSH_EXE}" = "x" ; then
|
||||||
|
|
@ -670,8 +702,8 @@ if test $usingTcl ; then
|
||||||
else
|
else
|
||||||
for libname in \
|
for libname in \
|
||||||
"${loclib:=${TCL_EXEC_PREFIX}/lib}/lib${TCL_LIB_NAME}${SHDLIB_EXT}" \
|
"${loclib:=${TCL_EXEC_PREFIX}/lib}/lib${TCL_LIB_NAME}${SHDLIB_EXT}" \
|
||||||
"${loclib:=${TCL_EXEC_PREFIX}/lib64}/lib${TCL_LIB_NAME}${SHDLIB_EXT}" \
|
"${loclib:=${TCL_EXEC_PREFIX}/lib}/lib${TCL_LIB_NAME}${SHDLIB_EXT_ALT}" \
|
||||||
"${loclib:=${TCL_EXEC_PREFIX}/lib}/lib${TCL_LIB_NAME}${SHDLIB_EXT_ALT}"
|
"${loclib:=${TCL_EXEC_PREFIX}/lib64}/lib${TCL_LIB_NAME}${SHDLIB_EXT}"
|
||||||
do
|
do
|
||||||
if test -r "$libname" ; then
|
if test -r "$libname" ; then
|
||||||
TCL_LIB_DIR="${TCL_EXEC_PREFIX}/lib"
|
TCL_LIB_DIR="${TCL_EXEC_PREFIX}/lib"
|
||||||
|
|
@ -784,6 +816,7 @@ if test $usingTcl ; then
|
||||||
AC_DEFINE(TCL_NETGEN)
|
AC_DEFINE(TCL_NETGEN)
|
||||||
extra_libs="$extra_libs \${NETGENDIR}/tcltk/libtcltk.o"
|
extra_libs="$extra_libs \${NETGENDIR}/tcltk/libtcltk.o"
|
||||||
extra_defs="$extra_defs -DTCL_DIR=\\\"\${TCLDIR}\\\""
|
extra_defs="$extra_defs -DTCL_DIR=\\\"\${TCLDIR}\\\""
|
||||||
|
stub_defs="$stub_defs -DUSE_TCL_STUBS -DUSE_TK_STUBS"
|
||||||
else
|
else
|
||||||
programs="$programs netgen"
|
programs="$programs netgen"
|
||||||
unused="$unused tcltk"
|
unused="$unused tcltk"
|
||||||
|
|
@ -850,10 +883,9 @@ case $target in
|
||||||
*cygwin*)
|
*cygwin*)
|
||||||
AC_DEFINE(CYGWIN)
|
AC_DEFINE(CYGWIN)
|
||||||
AC_DEFINE(i386)
|
AC_DEFINE(i386)
|
||||||
AC_DEFINE(WIN32)
|
|
||||||
;;
|
;;
|
||||||
*darwin*)
|
*darwin*)
|
||||||
AC_DEFINE(macosx)
|
$as_echo "#define macosx macos" >> confdefs.h
|
||||||
if test "$CPP" = "cc -E" ; then
|
if test "$CPP" = "cc -E" ; then
|
||||||
CPPFLAGS="$CPPFLAGS -no-cpp-precomp"
|
CPPFLAGS="$CPPFLAGS -no-cpp-precomp"
|
||||||
fi
|
fi
|
||||||
|
|
@ -864,6 +896,7 @@ esac
|
||||||
# -----------------------------------------------------------------------
|
# -----------------------------------------------------------------------
|
||||||
|
|
||||||
if test $usingTcl ; then
|
if test $usingTcl ; then
|
||||||
|
LIB_SPECS_NOSTUB="${LIB_SPECS}"
|
||||||
|
|
||||||
# -----------------------------------------------------------------------
|
# -----------------------------------------------------------------------
|
||||||
#
|
#
|
||||||
|
|
@ -875,9 +908,11 @@ if test $usingTcl ; then
|
||||||
fi
|
fi
|
||||||
if test "${TK_LIB_DIR}" = "/usr/lib" -o \
|
if test "${TK_LIB_DIR}" = "/usr/lib" -o \
|
||||||
"${TK_LIB_DIR}" = "/usr/lib64" ; then
|
"${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
|
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
|
if test "x${loader_run_path}" = "x" ; then
|
||||||
loader_run_path="${TK_LIB_DIR}"
|
loader_run_path="${TK_LIB_DIR}"
|
||||||
else
|
else
|
||||||
|
|
@ -901,9 +936,11 @@ if test $usingTcl ; then
|
||||||
if test "${TCL_LIB_DIR}" = "/usr/lib" -o \
|
if test "${TCL_LIB_DIR}" = "/usr/lib" -o \
|
||||||
"${TCL_LIB_DIR}" = "/usr/lib64" -o \
|
"${TCL_LIB_DIR}" = "/usr/lib64" -o \
|
||||||
"${TCL_LIB_DIR}" = "${TK_LIB_DIR}" ; then
|
"${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
|
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
|
if test "x${loader_run_path}" = "x" ; then
|
||||||
loader_run_path="${TCL_LIB_DIR}"
|
loader_run_path="${TCL_LIB_DIR}"
|
||||||
else
|
else
|
||||||
|
|
@ -1097,7 +1134,7 @@ if test $usingTcl ; then
|
||||||
# Not available on all versions: check for include file.
|
# Not available on all versions: check for include file.
|
||||||
SHLIB_CFLAGS="-fpic"
|
SHLIB_CFLAGS="-fpic"
|
||||||
LDDL_FLAGS="-shared ${LIB_SPECS}"
|
LDDL_FLAGS="-shared ${LIB_SPECS}"
|
||||||
CFLAGS="${CFLAGS} -l/usr/X11R6/include"
|
CFLAGS="${CFLAGS} -L/usr/X11R6/include"
|
||||||
;;
|
;;
|
||||||
|
|
||||||
*-netbsd*|*-openbsd*)
|
*-netbsd*|*-openbsd*)
|
||||||
|
|
@ -1222,6 +1259,7 @@ if test $usingTcl ; then
|
||||||
AC_SUBST(LDFLAGS)
|
AC_SUBST(LDFLAGS)
|
||||||
AC_SUBST(INC_SPECS)
|
AC_SUBST(INC_SPECS)
|
||||||
AC_SUBST(LIB_SPECS)
|
AC_SUBST(LIB_SPECS)
|
||||||
|
AC_SUBST(LIB_SPECS_NOSTUB)
|
||||||
AC_SUBST(WISH_EXE)
|
AC_SUBST(WISH_EXE)
|
||||||
AC_SUBST(TCLSH_EXE)
|
AC_SUBST(TCLSH_EXE)
|
||||||
AC_SUBST(TCL_LIB_DIR)
|
AC_SUBST(TCL_LIB_DIR)
|
||||||
|
|
@ -1239,6 +1277,7 @@ AC_SUBST(PACKAGE)
|
||||||
AC_SUBST(SCRIPTS)
|
AC_SUBST(SCRIPTS)
|
||||||
AC_SUBST(extra_libs)
|
AC_SUBST(extra_libs)
|
||||||
AC_SUBST(extra_defs)
|
AC_SUBST(extra_defs)
|
||||||
|
AC_SUBST(stub_defs)
|
||||||
AC_SUBST(ld_extra_libs)
|
AC_SUBST(ld_extra_libs)
|
||||||
AC_SUBST(ld_extra_objs)
|
AC_SUBST(ld_extra_objs)
|
||||||
AC_SUBST(top_extra_libs)
|
AC_SUBST(top_extra_libs)
|
||||||
|
|
@ -1247,11 +1286,13 @@ AC_SUBST(modules)
|
||||||
AC_SUBST(unused)
|
AC_SUBST(unused)
|
||||||
AC_SUBST(programs)
|
AC_SUBST(programs)
|
||||||
AC_SUBST(cadinstall)
|
AC_SUBST(cadinstall)
|
||||||
|
AC_SUBST(DIST_DIR)
|
||||||
|
|
||||||
AC_SUBST(gr_cflags)
|
AC_SUBST(gr_cflags)
|
||||||
AC_SUBST(gr_dflags)
|
AC_SUBST(gr_dflags)
|
||||||
AC_SUBST(gr_libs)
|
AC_SUBST(gr_libs)
|
||||||
AC_SUBST(gr_srcs)
|
AC_SUBST(gr_srcs)
|
||||||
|
AC_SUBST(HAVE_PYTHON3)
|
||||||
|
|
||||||
AC_SUBST(X_LIBS)
|
AC_SUBST(X_LIBS)
|
||||||
AC_SUBST(X_CFLAGS)
|
AC_SUBST(X_CFLAGS)
|
||||||
|
|
@ -1292,6 +1333,20 @@ else
|
||||||
echo
|
echo
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
${ECHO_N} "Python3: "
|
||||||
|
if test "${HAVE_PYTHON3}" == "yes"; then
|
||||||
|
echo "yes"
|
||||||
|
else
|
||||||
|
echo "no"
|
||||||
|
echo
|
||||||
|
echo " Without Python3, you cannot run the GUI interface to netgen."
|
||||||
|
echo " This is purely optional, as it contains no features not"
|
||||||
|
echo " available in the command-line (Tcl/Tk) version. If you want"
|
||||||
|
echo " python3 support, make sure that you have installed python3"
|
||||||
|
echo " on your system."
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
|
||||||
echo "-----------------------------------------------------------"
|
echo "-----------------------------------------------------------"
|
||||||
echo
|
echo
|
||||||
|
|
||||||
|
|
@ -1,84 +0,0 @@
|
||||||
# defs.mak.in --
|
|
||||||
# source file for autoconf-generated "defs.mak" for netgen
|
|
||||||
|
|
||||||
# defs.mak. Generated from defs.mak.in by configure.
|
|
||||||
# Feel free to change the values in here to suit your needs.
|
|
||||||
# Be aware that running scripts/configure again will overwrite
|
|
||||||
# any changes!
|
|
||||||
|
|
||||||
SHELL = /bin/sh
|
|
||||||
|
|
||||||
prefix = ${BUILDROOT}/usr/local
|
|
||||||
exec_prefix = ${prefix}
|
|
||||||
bindir = ${exec_prefix}/bin
|
|
||||||
libdir = ${exec_prefix}/lib
|
|
||||||
mandir = ${prefix}/share/man
|
|
||||||
|
|
||||||
VERSION =
|
|
||||||
|
|
||||||
SCRIPTS = ${NETGENDIR}/scripts
|
|
||||||
|
|
||||||
INSTALL = /bin/install -c
|
|
||||||
INSTALL_PROGRAM = ${INSTALL}
|
|
||||||
INSTALL_DATA = ${INSTALL} -m 644
|
|
||||||
INSTALL_SCRIPT = ${INSTALL}
|
|
||||||
|
|
||||||
# Override standard "make" target when compiling under TCL
|
|
||||||
ALL_TARGET = tcl
|
|
||||||
INSTALL_TARGET = install-tcl
|
|
||||||
|
|
||||||
# Change CADDIR to install in a different place
|
|
||||||
BINDIR = ${bindir}
|
|
||||||
MANDIR = ${mandir}
|
|
||||||
LIBDIR = ${libdir}
|
|
||||||
DOCDIR = ${libdir}/netgen/doc
|
|
||||||
TCLDIR = ${libdir}/netgen/tcl
|
|
||||||
|
|
||||||
MAIN_EXTRA_LIBS = ${NETGENDIR}/tcltk/libtcltk.o
|
|
||||||
LD_EXTRA_LIBS =
|
|
||||||
LD_SHARED =
|
|
||||||
TOP_EXTRA_LIBS =
|
|
||||||
SUB_EXTRA_LIBS =
|
|
||||||
|
|
||||||
MODULES += tcltk
|
|
||||||
UNUSED_MODULES +=
|
|
||||||
PROGRAMS += tcltk
|
|
||||||
INSTALL_CAD_DIRS += tcltk
|
|
||||||
|
|
||||||
RM = rm -f
|
|
||||||
CP = cp
|
|
||||||
AR = @AR@
|
|
||||||
ARFLAGS = crv
|
|
||||||
LINK = /bin/ld -r
|
|
||||||
LD = /bin/ld
|
|
||||||
M4 = /bin/m4
|
|
||||||
RANLIB = ranlib
|
|
||||||
SHDLIB_EXT = .so
|
|
||||||
LDDL_FLAGS = -shared -Wl,-soname,$@ -Wl,--version-script=${NETGENDIR}/netgen/symbol.map
|
|
||||||
LD_RUN_PATH =
|
|
||||||
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}\" -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=\"eda-dev@opencircuitdesign.com\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"60\" -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=\"eda-dev@opencircuitdesign.com\" -DPACKAGE_URL=\"\" -DNETGEN_VERSION=\"1.5\" -DNETGEN_REVISION=\"60\" -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 = -DX11 -DXLIB -DNDEBUG
|
|
||||||
GR_LIBS = -lX11
|
|
||||||
GR_SRCS = ${TK_SRCS}
|
|
||||||
|
|
||||||
OBJS = ${SRCS:.c=.o}
|
|
||||||
LIB_OBJS = ${LIB_SRCS:.c=.o}
|
|
||||||
CLEANS = ${OBJS} ${LIB_OBJS} lib${MODULE}.a lib${MODULE}.o ${MODULE}
|
|
||||||
|
|
@ -33,6 +33,14 @@ MANDIR = ${mandir}
|
||||||
LIBDIR = ${libdir}
|
LIBDIR = ${libdir}
|
||||||
DOCDIR = ${libdir}/netgen/doc
|
DOCDIR = ${libdir}/netgen/doc
|
||||||
TCLDIR = ${libdir}/netgen/tcl
|
TCLDIR = ${libdir}/netgen/tcl
|
||||||
|
PYDIR = ${libdir}/netgen/python
|
||||||
|
|
||||||
|
INSTALL_BINDIR = @DIST_DIR@/bin
|
||||||
|
INSTALL_MANDIR = @DIST_DIR@/share/man
|
||||||
|
INSTALL_LIBDIR = @DIST_DIR@/lib
|
||||||
|
INSTALL_DOCDIR = ${INSTALL_LIBDIR}/netgen/doc
|
||||||
|
INSTALL_TCLDIR = ${INSTALL_LIBDIR}/netgen/tcl
|
||||||
|
INSTALL_PYDIR = ${INSTALL_LIBDIR}/netgen/python
|
||||||
|
|
||||||
MAIN_EXTRA_LIBS = @extra_libs@
|
MAIN_EXTRA_LIBS = @extra_libs@
|
||||||
LD_EXTRA_LIBS = @ld_extra_libs@
|
LD_EXTRA_LIBS = @ld_extra_libs@
|
||||||
|
|
@ -60,6 +68,7 @@ LIB_SPECS = @LIB_SPECS@
|
||||||
LIB_SPECS_NOSTUB = @LIB_SPECS_NOSTUB@
|
LIB_SPECS_NOSTUB = @LIB_SPECS_NOSTUB@
|
||||||
WISH_EXE = @WISH_EXE@
|
WISH_EXE = @WISH_EXE@
|
||||||
TCL_LIB_DIR = @TCL_LIB_DIR@
|
TCL_LIB_DIR = @TCL_LIB_DIR@
|
||||||
|
EXTRA_CFLAGS =
|
||||||
|
|
||||||
CC = @CC@
|
CC = @CC@
|
||||||
CPP = @CPP@
|
CPP = @CPP@
|
||||||
|
|
@ -68,7 +77,7 @@ CXX = @CXX@
|
||||||
CPPFLAGS = -I. -I${NETGENDIR} @CPPFLAGS@
|
CPPFLAGS = -I. -I${NETGENDIR} @CPPFLAGS@
|
||||||
DFLAGS = @extra_defs@ @stub_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
|
DFLAGS_NOSTUB = @extra_defs@ @DEFS@ -DSHDLIB_EXT=\"@SHDLIB_EXT@\" -DNDEBUG
|
||||||
CFLAGS = @CFLAGS@ @SHLIB_CFLAGS@ @INC_SPECS@
|
CFLAGS = @CFLAGS@ @SHLIB_CFLAGS@ @INC_SPECS@ ${EXTRA_CFLAGS}
|
||||||
|
|
||||||
DEPEND_FILE = Depend
|
DEPEND_FILE = Depend
|
||||||
DEPEND_FLAG = @DEPEND_FLAG@
|
DEPEND_FLAG = @DEPEND_FLAG@
|
||||||
|
|
|
||||||
187
scripts/makedbh
187
scripts/makedbh
|
|
@ -1,187 +0,0 @@
|
||||||
#!/bin/csh -f
|
|
||||||
#
|
|
||||||
# makes the "database.h" (1st argument, $1) file from "database.h.in"
|
|
||||||
# (2nd argument, $2), setting various mask operation definitions
|
|
||||||
# according to the number of words implied by the value of TT_MAXTYPES
|
|
||||||
|
|
||||||
# The following mess grabs the value of TT_MAXTYPES from database.h.in
|
|
||||||
#
|
|
||||||
set maxtypes=`sed -n -e '/^#define[[:space:]]*TT_MAXTYPES/s/#define[[:space:]]*TT_MAXTYPES[[:space:]]*//p' < $1 | sed -e 's/\/\*[[:print:]]*\*\/[[:space:]]*//g' `
|
|
||||||
#
|
|
||||||
# Alternative method works with outdated versions of sed/ed.
|
|
||||||
#
|
|
||||||
if ($maxtypes == "") then
|
|
||||||
set maxtypes=`sed -n -e '/^#define[ ]*TT_MAXTYPES/s/#define[ ]*TT_MAXTYPES[ ]*//p' < $1 | sed -e 's/\/\*.*\*\/[ ]*//g' `
|
|
||||||
endif
|
|
||||||
#
|
|
||||||
# If we can't generate database.h correctly, nothing is going to compile.
|
|
||||||
#
|
|
||||||
if ($maxtypes == "") then
|
|
||||||
echo "Bad sed script in scripts/makedbh: Cannot generate database/database.h!"
|
|
||||||
exit
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Find derived values from bits per word
|
|
||||||
# Note that bits-per-word should be determined from the compiler, but
|
|
||||||
# 32 bits per word has always been hardwired into magic.
|
|
||||||
#
|
|
||||||
set bpw = 32
|
|
||||||
|
|
||||||
# @ wordmask=$bpw - 1
|
|
||||||
# set wordshift=`echo "c=l($bpw); d=l(2); scale=0; c/d" | bc -l`
|
|
||||||
# @ maskwords=$maxtypes + $bpw - 1
|
|
||||||
# @ maskwords/=$bpw
|
|
||||||
|
|
||||||
@ maskwords=$maxtypes + $bpw - 1
|
|
||||||
@ maskwords/=$bpw
|
|
||||||
|
|
||||||
|
|
||||||
# Generate the main part of the database.h file from database.h.in
|
|
||||||
cat $1 > $2
|
|
||||||
|
|
||||||
# Generate a list of integers from 0 to the value of "maskwords" - 1
|
|
||||||
set count=""
|
|
||||||
@ maskwords--
|
|
||||||
while (${maskwords} >= 0)
|
|
||||||
set count=`echo ${count} ${maskwords}`
|
|
||||||
@ maskwords--
|
|
||||||
end
|
|
||||||
|
|
||||||
# Definitions
|
|
||||||
|
|
||||||
echo "#define TTMaskZero(m) ( \" >> $2
|
|
||||||
foreach i (${count})
|
|
||||||
echo -n " (m)->tt_words[$i] = 0" >> $2
|
|
||||||
if ($i == 0) then
|
|
||||||
echo ")" >> $2
|
|
||||||
echo "" >> $2
|
|
||||||
else
|
|
||||||
echo ", \" >> $2
|
|
||||||
endif
|
|
||||||
end
|
|
||||||
|
|
||||||
echo "#define TTMaskIsZero(m) ( \" >> $2
|
|
||||||
foreach i (${count})
|
|
||||||
echo -n " (m)->tt_words[$i] == 0" >> $2
|
|
||||||
if ($i == 0) then
|
|
||||||
echo ")" >> $2
|
|
||||||
echo "" >> $2
|
|
||||||
else
|
|
||||||
echo " && \" >> $2
|
|
||||||
endif
|
|
||||||
end
|
|
||||||
|
|
||||||
echo "#define TTMaskEqual(m, n) ( \" >> $2
|
|
||||||
foreach i (${count})
|
|
||||||
echo -n " (m)->tt_words[$i] == (n)->tt_words[$i]" >> $2
|
|
||||||
if ($i == 0) then
|
|
||||||
echo ")" >> $2
|
|
||||||
echo "" >> $2
|
|
||||||
else
|
|
||||||
echo " && \" >> $2
|
|
||||||
endif
|
|
||||||
end
|
|
||||||
|
|
||||||
echo "#define TTMaskIntersect(m, n) ( \" >> $2
|
|
||||||
foreach i (${count})
|
|
||||||
echo -n " ((m)->tt_words[$i] & (n)->tt_words[$i])" >> $2
|
|
||||||
if ($i == 0) then
|
|
||||||
echo ")" >> $2
|
|
||||||
echo "" >> $2
|
|
||||||
else
|
|
||||||
echo " || \" >> $2
|
|
||||||
endif
|
|
||||||
end
|
|
||||||
|
|
||||||
echo "#define TTMaskCom(m) ( \" >> $2
|
|
||||||
foreach i (${count})
|
|
||||||
echo -n " ((m)->tt_words[$i] = ~(m)->tt_words[$i])" >> $2
|
|
||||||
if ($i == 0) then
|
|
||||||
echo ")" >> $2
|
|
||||||
echo "" >> $2
|
|
||||||
else
|
|
||||||
echo ", \" >> $2
|
|
||||||
endif
|
|
||||||
end
|
|
||||||
|
|
||||||
echo "#define TTMaskCom2(m, n) ( \" >> $2
|
|
||||||
foreach i (${count})
|
|
||||||
echo -n " ((m)->tt_words[$i] = ~(n)->tt_words[$i])" >> $2
|
|
||||||
if ($i == 0) then
|
|
||||||
echo ")" >> $2
|
|
||||||
echo "" >> $2
|
|
||||||
else
|
|
||||||
echo ", \" >> $2
|
|
||||||
endif
|
|
||||||
end
|
|
||||||
|
|
||||||
echo "#define TTMaskSetMask(m, n) ( \" >> $2
|
|
||||||
foreach i (${count})
|
|
||||||
echo -n " ((m)->tt_words[$i] |= (n)->tt_words[$i])" >> $2
|
|
||||||
if ($i == 0) then
|
|
||||||
echo ")" >> $2
|
|
||||||
echo "" >> $2
|
|
||||||
else
|
|
||||||
echo ", \" >> $2
|
|
||||||
endif
|
|
||||||
end
|
|
||||||
|
|
||||||
echo "#define TTMaskSetMask3(m, n, o) ( \" >> $2
|
|
||||||
foreach i (${count})
|
|
||||||
echo -n " ((m)->tt_words[$i] |= (n)->tt_words[$i] | (o)->tt_words[$i])" \
|
|
||||||
>> $2
|
|
||||||
if ($i == 0) then
|
|
||||||
echo ")" >> $2
|
|
||||||
echo "" >> $2
|
|
||||||
else
|
|
||||||
echo ", \" >> $2
|
|
||||||
endif
|
|
||||||
end
|
|
||||||
|
|
||||||
echo "#define TTMaskAndMask(m, n) ( \" >> $2
|
|
||||||
foreach i (${count})
|
|
||||||
echo -n " ((m)->tt_words[$i] &= (n)->tt_words[$i])" >> $2
|
|
||||||
if ($i == 0) then
|
|
||||||
echo ")" >> $2
|
|
||||||
echo "" >> $2
|
|
||||||
else
|
|
||||||
echo ", \" >> $2
|
|
||||||
endif
|
|
||||||
end
|
|
||||||
|
|
||||||
echo "#define TTMaskAndMask3(m, n, o) ( \" >> $2
|
|
||||||
foreach i (${count})
|
|
||||||
echo -n " ((m)->tt_words[$i] = (n)->tt_words[$i] & (o)->tt_words[$i])" \
|
|
||||||
>> $2
|
|
||||||
if ($i == 0) then
|
|
||||||
echo ")" >> $2
|
|
||||||
echo "" >> $2
|
|
||||||
else
|
|
||||||
echo ", \" >> $2
|
|
||||||
endif
|
|
||||||
end
|
|
||||||
|
|
||||||
echo "#define TTMaskClearMask(m, n) ( \" >> $2
|
|
||||||
foreach i (${count})
|
|
||||||
echo -n " ((m)->tt_words[$i] &= ~(n)->tt_words[$i])" >> $2
|
|
||||||
if ($i == 0) then
|
|
||||||
echo ")" >> $2
|
|
||||||
echo "" >> $2
|
|
||||||
else
|
|
||||||
echo ", \" >> $2
|
|
||||||
endif
|
|
||||||
end
|
|
||||||
|
|
||||||
echo "#define TTMaskClearMask3(m, n, o) ( \" >> $2
|
|
||||||
foreach i (${count})
|
|
||||||
echo -n " ((m)->tt_words[$i] = (n)->tt_words[$i] & ~(o)->tt_words[$i])" \
|
|
||||||
>> $2
|
|
||||||
if ($i == 0) then
|
|
||||||
echo ")" >> $2
|
|
||||||
else
|
|
||||||
echo ", \" >> $2
|
|
||||||
endif
|
|
||||||
end
|
|
||||||
|
|
||||||
echo "" >> $2
|
|
||||||
echo "#endif /* _DATABASE_H */" >> $2
|
|
||||||
|
|
@ -12,39 +12,40 @@ CLEANS += netgen.sh netgen.tcl netgenexec${EXEEXT}
|
||||||
CFLAGS += -I${NETGENDIR}/base
|
CFLAGS += -I${NETGENDIR}/base
|
||||||
|
|
||||||
TCL_FILES = \
|
TCL_FILES = \
|
||||||
$(DESTDIR)${TCLDIR}/tkcon.tcl \
|
$(DESTDIR)${INSTALL_TCLDIR}/tkcon.tcl \
|
||||||
$(DESTDIR)${TCLDIR}/console.tcl \
|
$(DESTDIR)${INSTALL_TCLDIR}/console.tcl \
|
||||||
$(DESTDIR)${TCLDIR}/netgen.tcl
|
$(DESTDIR)${INSTALL_TCLDIR}/netgen.tcl
|
||||||
|
|
||||||
tcl-main: netgenexec${EXEEXT} netgen.tcl netgen.sh
|
tcl-main: netgenexec${EXEEXT} netgen.tcl netgen.sh
|
||||||
|
|
||||||
install-tcl: netgenexec${EXEEXT} $(DESTDIR)${BINDIR}/netgen.sh ${TCL_FILES}
|
install-tcl: netgenexec${EXEEXT} $(DESTDIR)${INSTALL_BINDIR}/netgen.sh ${TCL_FILES}
|
||||||
${RM} $(DESTDIR)${TCLDIR}/netgenexec${EXEEXT}
|
${RM} $(DESTDIR)${INSTALL_TCLDIR}/netgenexec${EXEEXT}
|
||||||
${CP} netgenexec${EXEEXT} $(DESTDIR)${TCLDIR}/netgenexec${EXEEXT}
|
${CP} netgenexec${EXEEXT} $(DESTDIR)${INSTALL_TCLDIR}/netgenexec${EXEEXT}
|
||||||
|
|
||||||
netgenexec${EXEEXT}: netgenexec.c
|
netgenexec${EXEEXT}: netgenexec.c
|
||||||
${CC} ${CFLAGS} ${CPPFLAGS} ${DFLAGS_NOSTUB} netgenexec.c \
|
${CC} ${CFLAGS} ${CPPFLAGS} ${DFLAGS_NOSTUB} netgenexec.c \
|
||||||
-o netgenexec${EXEEXT} \
|
-o netgenexec${EXEEXT} \
|
||||||
${LDFLAGS} ${LIBS} ${LIB_SPECS_NOSTUB}
|
${LIB_SPECS_NOSTUB} ${LDFLAGS} ${LIBS} ${GR_LIBS}
|
||||||
|
|
||||||
netgen.tcl: netgen.tcl.in
|
netgen.tcl: netgen.tcl.in
|
||||||
sed -e /TCL_DIR/s%TCL_DIR%${TCLDIR}%g \
|
sed -e 's%TCL_DIR%${TCLDIR}%g' \
|
||||||
-e /SHDLIB_EXT/s%SHDLIB_EXT%${SHDLIB_EXT}%g \
|
-e 's%SHDLIB_EXT%${SHDLIB_EXT}%g' \
|
||||||
netgen.tcl.in > netgen.tcl
|
netgen.tcl.in > netgen.tcl
|
||||||
|
|
||||||
netgen.sh: netgen.sh.in
|
netgen.sh: netgen.sh.in
|
||||||
sed -e /TCL_DIR/s%TCL_DIR%${TCLDIR}%g \
|
sed -e 's%TCL_DIR%${TCLDIR}%g' \
|
||||||
-e /TCLLIB_DIR/s%TCLLIB_DIR%${TCL_LIB_DIR}%g \
|
-e 's%PY_DIR%${PYDIR}%g' \
|
||||||
-e /WISH_EXE/s%WISH_EXE%${WISH_EXE}%g \
|
-e 's%TCLLIB_DIR%${TCL_LIB_DIR}%g' \
|
||||||
|
-e 's%WISH_EXE%${WISH_EXE}%g' \
|
||||||
netgen.sh.in > netgen.sh
|
netgen.sh.in > netgen.sh
|
||||||
|
|
||||||
$(DESTDIR)${TCLDIR}/%: %
|
$(DESTDIR)${INSTALL_TCLDIR}/%: %
|
||||||
${RM} $(DESTDIR)${TCLDIR}/$*
|
${RM} $(DESTDIR)${INSTALL_TCLDIR}/$*
|
||||||
${CP} $* $(DESTDIR)${TCLDIR}/$*
|
${CP} $* $(DESTDIR)${INSTALL_TCLDIR}/$*
|
||||||
|
|
||||||
$(DESTDIR)${BINDIR}/netgen.sh: netgen.sh
|
$(DESTDIR)${INSTALL_BINDIR}/netgen.sh: netgen.sh
|
||||||
${RM} $(DESTDIR)${BINDIR}/netgen.sh $(DESTDIR)${BINDIR}/netgen
|
${RM} $(DESTDIR)${INSTALL_BINDIR}/netgen.sh $(DESTDIR)${INSTALL_BINDIR}/netgen
|
||||||
${CP} netgen.sh $(DESTDIR)${BINDIR}/netgen
|
${CP} netgen.sh $(DESTDIR)${INSTALL_BINDIR}/netgen
|
||||||
(cd $(DESTDIR)${BINDIR}; chmod 0755 netgen)
|
(cd $(DESTDIR)${INSTALL_BINDIR}; chmod 0755 netgen)
|
||||||
|
|
||||||
include ${NETGENDIR}/rules.mak
|
include ${NETGENDIR}/rules.mak
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#!/bin/sh
|
#!/bin/bash
|
||||||
#
|
#
|
||||||
# For installation, put this file (netgen.sh) in a standard executable path.
|
# For installation, put this file (netgen.sh) in a standard executable path.
|
||||||
# Put startup script "netgen.tcl" and shared library "tclnetgen.so"
|
# Put startup script "netgen.tcl" and shared library "tclnetgen.so"
|
||||||
|
|
@ -14,6 +14,7 @@
|
||||||
|
|
||||||
TKCON=true
|
TKCON=true
|
||||||
BATCH=
|
BATCH=
|
||||||
|
GUI=
|
||||||
NETGEN_WISH=WISH_EXE
|
NETGEN_WISH=WISH_EXE
|
||||||
export NETGEN_WISH
|
export NETGEN_WISH
|
||||||
|
|
||||||
|
|
@ -29,6 +30,7 @@ for i in "$@" ; do
|
||||||
case $i in
|
case $i in
|
||||||
-noc*) TKCON=;;
|
-noc*) TKCON=;;
|
||||||
-bat*) BATCH=true; TKCON=;;
|
-bat*) BATCH=true; TKCON=;;
|
||||||
|
-gui) GUI=true; TKCON=;;
|
||||||
*) arglist="$arglist${arglist:+ }\"${i//\"/\\\"}\"";;
|
*) arglist="$arglist${arglist:+ }\"${i//\"/\\\"}\"";;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
@ -40,7 +42,10 @@ if [ $TKCON ]; then
|
||||||
-slave "package require Tk; set argc $#; set argv [list $arglist]; \
|
-slave "package require Tk; set argc $#; set argv [list $arglist]; \
|
||||||
source TCL_DIR/netgen.tcl"
|
source TCL_DIR/netgen.tcl"
|
||||||
|
|
||||||
else
|
# Run the Python LVS manager GUI
|
||||||
|
|
||||||
|
elif [ $GUI ]; then
|
||||||
|
exec PY_DIR/lvs_manager.py $@
|
||||||
|
|
||||||
#
|
#
|
||||||
# Run the stand-in for wish (netgenexec), which acts exactly like "wish"
|
# Run the stand-in for wish (netgenexec), which acts exactly like "wish"
|
||||||
|
|
@ -49,6 +54,7 @@ else
|
||||||
# capable of sourcing the startup script.
|
# capable of sourcing the startup script.
|
||||||
#
|
#
|
||||||
|
|
||||||
|
else
|
||||||
exec TCL_DIR/netgenexec -- "$@"
|
exec TCL_DIR/netgenexec -- "$@"
|
||||||
|
|
||||||
fi
|
fi
|
||||||
|
|
|
||||||
|
|
@ -20,13 +20,341 @@ foreach i $nlist {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if {${tcl_version} >= 8.6} {
|
# -lazy option not needed if stubs libraries are handled correctly
|
||||||
load -lazy TCL_DIR/tclnetgenSHDLIB_EXT
|
# load -lazy TCL_DIR/tclnetgenSHDLIB_EXT
|
||||||
} else {
|
|
||||||
load 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] {
|
||||||
|
set pinstr [string map {"\\" "\\\\"} $pin]
|
||||||
|
puts $fjson " \"$pinstr\","
|
||||||
|
}
|
||||||
|
set pin [string map {"\\" "\\\\"} [lindex $cktval end]]
|
||||||
|
puts $fjson " \"$pin\""
|
||||||
|
puts $fjson " \], \["
|
||||||
|
set cktval [lindex $value 1]
|
||||||
|
foreach pin [lrange $cktval 0 end-1] {
|
||||||
|
set pinstr [string map {"\\" "\\\\"} $pin]
|
||||||
|
puts $fjson " \"$pinstr\","
|
||||||
|
}
|
||||||
|
set pin [string map {"\\" "\\\\"} [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 [string map {"\\" "\\\\"} [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 [string map {"\\" "\\\\"} [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 [string map {"\\" "\\\\"} [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 [string map {"\\" "\\\\"} [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 [string map {"\\" "\\\\"} [lindex $instance 0]]
|
||||||
|
set instname0 [string map {"\\" "\\\\"} [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 [string map {"\\" "\\\\"} [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
|
# Define the "lvs" command as a way of calling the netgen options
|
||||||
# for standard compare, essentially the same as the old "netcomp"
|
# for standard compare, essentially the same as the old "netcomp"
|
||||||
# standalone program.
|
# standalone program.
|
||||||
|
|
@ -34,9 +362,60 @@ if {${tcl_version} >= 8.6} {
|
||||||
# Use the "canonical" command to parse the file and cell names,
|
# Use the "canonical" command to parse the file and cell names,
|
||||||
# although if the cells have not been read in yet, then the
|
# although if the cells have not been read in yet, then the
|
||||||
# original syntax of filename or {filename cellname} is required.
|
# original syntax of filename or {filename cellname} is required.
|
||||||
#----------------------------------------------------------------
|
#
|
||||||
|
# "args" may be "-list", "-json", or "-blackbox".
|
||||||
|
# "-list" returns output as a nested list.
|
||||||
|
# "-json" creates a .json-format output file in addition to stdout.
|
||||||
|
# "-blackbox" treats empty cells as black-box entries.
|
||||||
|
# "-noflatten={list}" is a list of cells not to flatten if mismatched.
|
||||||
|
# i.e., the cells are expected to match and any mismatch cannot be
|
||||||
|
# expected to be resolved by flattening the contents of the mismatched
|
||||||
|
# cells.
|
||||||
|
#-----------------------------------------------------------------------
|
||||||
|
|
||||||
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
|
||||||
|
set noflat {}
|
||||||
|
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
|
||||||
|
} elseif {[string first "-noflatten=" $arg] == 0} {
|
||||||
|
set value [string range $arg 11 end]
|
||||||
|
# If argument is a filename then read the list of cells from it;
|
||||||
|
# otherwise, argument is the list of files itself in quotes or
|
||||||
|
# braces.
|
||||||
|
if {[file exists $value]} {
|
||||||
|
if {![catch {open $value r} fnf]} {
|
||||||
|
while {[gets $fnf line] >= 0} {
|
||||||
|
if {[lindex $line 0] != "#"} {
|
||||||
|
foreach cell $line {
|
||||||
|
lappend noflat $cell
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close $fnf
|
||||||
|
} else {
|
||||||
|
puts stderr "Cannot open file $value for reading cell list."
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
set noflat [string trim $value \"\{\}]
|
||||||
|
}
|
||||||
|
if {[llength $noflat] > 0} {
|
||||||
|
puts stdout "Will not flatten these subcells: $noflat"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# Allow name1 or name2 to be a list of {filename cellname},
|
# Allow name1 or name2 to be a list of {filename cellname},
|
||||||
# A single <filename>, or any valid_cellname form if the
|
# A single <filename>, or any valid_cellname form if the
|
||||||
|
|
@ -50,7 +429,7 @@ proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out}} {
|
||||||
set file1 $name1
|
set file1 $name1
|
||||||
set cell1 $name1
|
set cell1 $name1
|
||||||
}
|
}
|
||||||
puts stdout "Reading netlist file $file1"
|
puts stdout "Reading netlist file $file1 for $name1"
|
||||||
set fnum1 [netgen::readnet $file1]
|
set fnum1 [netgen::readnet $file1]
|
||||||
} else {
|
} else {
|
||||||
set cell1 [lindex $flist1 0]
|
set cell1 [lindex $flist1 0]
|
||||||
|
|
@ -67,7 +446,7 @@ proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out}} {
|
||||||
set file2 $name2
|
set file2 $name2
|
||||||
set cell2 $name2
|
set cell2 $name2
|
||||||
}
|
}
|
||||||
puts stdout "Reading netlist file $file2"
|
puts stdout "Reading netlist file $file2 for $name2"
|
||||||
set fnum2 [netgen::readnet $file2]
|
set fnum2 [netgen::readnet $file2]
|
||||||
} else {
|
} else {
|
||||||
set cell2 [lindex $flist2 0]
|
set cell2 [lindex $flist2 0]
|
||||||
|
|
@ -82,7 +461,7 @@ proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out}} {
|
||||||
}
|
}
|
||||||
|
|
||||||
set clist1 [cells list $fnum1]
|
set clist1 [cells list $fnum1]
|
||||||
set cidx [lsearch -regexp $clist1 ^$cell1$]
|
set cidx [lsearch -exact $clist1 $cell1]
|
||||||
if {$cidx < 0} {
|
if {$cidx < 0} {
|
||||||
puts stderr "Cannot find cell $cell1 in file $file1"
|
puts stderr "Cannot find cell $cell1 in file $file1"
|
||||||
return
|
return
|
||||||
|
|
@ -90,7 +469,7 @@ proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out}} {
|
||||||
set cell1 [lindex $clist1 $cidx]
|
set cell1 [lindex $clist1 $cidx]
|
||||||
}
|
}
|
||||||
set clist2 [cells list $fnum2]
|
set clist2 [cells list $fnum2]
|
||||||
set cidx [lsearch -regexp $clist2 ^$cell2$]
|
set cidx [lsearch -exact $clist2 $cell2]
|
||||||
if {$cidx < 0} {
|
if {$cidx < 0} {
|
||||||
puts stderr "Cannot find cell $cell2 in file $file2"
|
puts stderr "Cannot find cell $cell2 in file $file2"
|
||||||
return
|
return
|
||||||
|
|
@ -98,10 +477,26 @@ proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out}} {
|
||||||
set cell2 [lindex $clist2 $cidx]
|
set cell2 [lindex $clist2 $cidx]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# The "noflat" list is non-file-specific, so run on each file.
|
||||||
|
foreach cell $noflat {
|
||||||
|
set cidx [lsearch -regexp $clist1 ^$cell$]
|
||||||
|
if {$cidx >= 0} {
|
||||||
|
netgen::flatten prohibit "$fnum1 $cell"
|
||||||
|
}
|
||||||
|
set cidx [lsearch -regexp $clist2 ^$cell$]
|
||||||
|
if {$cidx >= 0} {
|
||||||
|
netgen::flatten prohibit "$fnum2 $cell"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
netgen::compare assign "$fnum1 $cell1" "$fnum2 $cell2"
|
netgen::compare assign "$fnum1 $cell1" "$fnum2 $cell2"
|
||||||
|
|
||||||
if {[file exists $setupfile]} {
|
if {$setupfile == ""} {
|
||||||
puts stdout "Reading setup file $setupfile"
|
puts stdout "\nNo setup file specified. Using trivial default setup.\n"
|
||||||
|
netgen::permute default ;# transistors and resistors
|
||||||
|
netgen::property default
|
||||||
|
} elseif {[file exists $setupfile]} {
|
||||||
|
puts stdout "\nReading setup file $setupfile\n"
|
||||||
# Instead of sourcing the setup file, run each line so we can
|
# Instead of sourcing the setup file, run each line so we can
|
||||||
# catch individual errors and not let them halt the LVS process
|
# catch individual errors and not let them halt the LVS process
|
||||||
set perrors 0
|
set perrors 0
|
||||||
|
|
@ -121,6 +516,14 @@ proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out}} {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
close $fsetup
|
close $fsetup
|
||||||
|
if {$command != {}} {
|
||||||
|
# Incomplete command. Evaluate it to get a meaningful error message
|
||||||
|
if {[catch {uplevel 1 [list namespace eval netgen $command]} msg]} {
|
||||||
|
set msg [string trimright $msg "\n"]
|
||||||
|
puts stderr "Error $setupfile:$sline (ignoring), $msg"
|
||||||
|
incr perrors
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
puts stdout "Error: Cannot read the setup file $setupfile"
|
puts stdout "Error: Cannot read the setup file $setupfile"
|
||||||
}
|
}
|
||||||
|
|
@ -128,72 +531,203 @@ proc netgen::lvs { name1 name2 {setupfile setup.tcl} {logfile comp.out}} {
|
||||||
if {$perrors > 0} {
|
if {$perrors > 0} {
|
||||||
puts stdout "Warning: There were errors reading the setup file"
|
puts stdout "Warning: There were errors reading the setup file"
|
||||||
}
|
}
|
||||||
|
} elseif {[string first nosetup $setupfile] < 0} {
|
||||||
|
puts stderr "\nError: Setup file $setupfile does not exist.\n"
|
||||||
|
return
|
||||||
} else {
|
} else {
|
||||||
netgen::permute default ;# transistors and resistors
|
puts stderr "\nNo setup file specified. Continuing without a setup.\n"
|
||||||
netgen::property default
|
|
||||||
}
|
}
|
||||||
|
|
||||||
puts stdout "Comparison output logged to file $logfile"
|
if {[string first nolog $logfile] < 0} {
|
||||||
netgen::log file $logfile
|
puts stdout "Comparison output logged to file $logfile"
|
||||||
netgen::log start
|
netgen::log file $logfile
|
||||||
netgen::log echo off
|
|
||||||
set endval [netgen::compare hierarchical "$fnum1 $cell1" "$fnum2 $cell2"]
|
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 == {}} {
|
if {$endval == {}} {
|
||||||
netgen::log put "No cells in queue!\n"
|
netgen::log put "No cells in queue!\n"
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
set properr {}
|
set properr {}
|
||||||
|
set matcherr {}
|
||||||
|
set childMismatch 0 ;# 1 indicates black-box child subcircuit mismatch
|
||||||
while {$endval != {}} {
|
while {$endval != {}} {
|
||||||
netgen::run converge
|
if {$dolist == 1} {
|
||||||
netgen::log echo on
|
netgen::run -list converge
|
||||||
|
} else {
|
||||||
|
netgen::run converge
|
||||||
|
}
|
||||||
|
set pinMismatch 0 ;# indicates pin mismatch in top cell
|
||||||
|
set doCheckFlatten 0
|
||||||
|
set doFlatten 0
|
||||||
|
if {[netgen::print queue] == {}} {
|
||||||
|
set doEquatePins 1 ;# run equate pins on top cell
|
||||||
|
} else {
|
||||||
|
set doEquatePins 0 ;# don't run equate pins unless unique match
|
||||||
|
}
|
||||||
|
set forceMatch 0 ;# for pin matching
|
||||||
|
netgen::log echo off
|
||||||
|
|
||||||
if {[verify equivalent]} {
|
if {[verify equivalent]} {
|
||||||
# Resolve automorphisms by pin and property
|
# Resolve automorphisms by pin and property
|
||||||
netgen::run resolve
|
if {$dolist == 1} {
|
||||||
|
netgen::run -list resolve
|
||||||
|
} else {
|
||||||
|
netgen::run resolve
|
||||||
|
}
|
||||||
set uresult [verify unique]
|
set uresult [verify unique]
|
||||||
|
# uresult: -3 : unique with property error
|
||||||
|
# -2 : equivalent with port errors
|
||||||
|
# -1 : black box
|
||||||
|
# 0 : equivalent but not unique
|
||||||
|
# 1 : unique
|
||||||
if {$uresult == 0} {
|
if {$uresult == 0} {
|
||||||
|
netgen::log echo on
|
||||||
netgen::log put " Networks match locally but not globally.\n"
|
netgen::log put " Networks match locally but not globally.\n"
|
||||||
netgen::log put " Probably connections are swapped.\n"
|
netgen::log put " Probably connections are swapped.\n"
|
||||||
netgen::log put " Check the end of logfile ${logfile} for implicated nodes.\n"
|
netgen::log put " Check the end of logfile ${logfile} for implicated nodes.\n"
|
||||||
netgen::verify nodes
|
netgen::log echo off
|
||||||
|
if {$dolist == 1} {
|
||||||
# Flatten the non-matching subcircuit (but not the top-level cells)
|
verify -list nodes
|
||||||
if {[netgen::print queue] != {}} {
|
} else {
|
||||||
netgen::log put " Flattening non-matched subcircuits $endval"
|
verify nodes
|
||||||
netgen::flatten class "[lindex $endval 0] $fnum1"
|
|
||||||
netgen::flatten class "[lindex $endval 1] $fnum2"
|
|
||||||
}
|
}
|
||||||
|
set doCheckFlatten 1
|
||||||
} else {
|
} else {
|
||||||
# Match pins
|
# Equate pins for black boxes, unique matches (possibly with property
|
||||||
netgen::log echo off
|
# errors), and unique with port errors
|
||||||
set result [equate pins "$fnum1 [lindex $endval 0]" \
|
set doEquatePins 1
|
||||||
"$fnum2 [lindex $endval 1]"]
|
}
|
||||||
if {$result != 0} {
|
if {$uresult == -1} { ;# black box
|
||||||
equate classes "$fnum1 [lindex $endval 0]" \
|
set forceMatch 1
|
||||||
"$fnum2 [lindex $endval 1]"
|
} elseif {$uresult == -3} { ;# property error
|
||||||
}
|
lappend properr [lindex $endval 0]
|
||||||
netgen::log echo on
|
} elseif {$uresult == -2} { ;# unmatched pins
|
||||||
|
set doCheckFlatten 1
|
||||||
|
} elseif {$uresult == -4} { ;# unmatched pins and properties
|
||||||
|
lappend properr [lindex $endval 0]
|
||||||
|
set doCheckFlatten 1
|
||||||
}
|
}
|
||||||
if {$uresult == 2} {lappend properr [lindex $endval 0]}
|
|
||||||
} else {
|
} else {
|
||||||
# Flatten the non-matching subcircuit (but not the top-level cells)
|
# not equivalent
|
||||||
if {[netgen::print queue] != {}} {
|
netgen::log echo on
|
||||||
netgen::log put " Flattening non-matched subcircuits $endval"
|
# netgen::log put " DEBUG: not equivalent $endval\n"
|
||||||
netgen::flatten class "[lindex $endval 0] $fnum1"
|
netgen::log echo off
|
||||||
netgen::flatten class "[lindex $endval 1] $fnum2"
|
set doCheckFlatten 1
|
||||||
|
}
|
||||||
|
if {$doCheckFlatten} {
|
||||||
|
# Flatten the non-matching subcircuit (but not the top-level cell,
|
||||||
|
# or cells explicitly prohibited from flattening)
|
||||||
|
if {[netgen::print queue] != {}} {
|
||||||
|
if {([lsearch $noflat [lindex $endval 0]] == -1) &&
|
||||||
|
([lsearch $noflat [lindex $endval 1]] == -1)} {
|
||||||
|
set doFlatten 1
|
||||||
|
} else {
|
||||||
|
netgen::log echo on
|
||||||
|
netgen::log put " Continuing with black-boxed subcircuits $endval\n"
|
||||||
|
netgen::log echo off
|
||||||
|
lappend matcherr [lindex $endval 0]"($fnum1)"
|
||||||
|
lappend matcherr [lindex $endval 1]"($fnum2)"
|
||||||
|
netgen::flatten prohibit "[lindex $endval 0] $fnum1"
|
||||||
|
netgen::flatten prohibit "[lindex $endval 1] $fnum2"
|
||||||
|
set doEquatePins 1
|
||||||
|
set childMismatch 1
|
||||||
|
set forceMatch 1
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
netgen::log echo off
|
if {$doEquatePins} {
|
||||||
set endval [netgen::compare hierarchical]
|
# Match pins
|
||||||
|
if {$dolist == 1} {
|
||||||
|
if {$forceMatch} {
|
||||||
|
set result [equate -list -force pins "$fnum1 [lindex $endval 0]" \
|
||||||
|
"$fnum2 [lindex $endval 1]"]
|
||||||
|
} else {
|
||||||
|
set result [equate -list pins "$fnum1 [lindex $endval 0]" \
|
||||||
|
"$fnum2 [lindex $endval 1]"]
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if {$forceMatch} {
|
||||||
|
set result [equate -force pins "$fnum1 [lindex $endval 0]" \
|
||||||
|
"$fnum2 [lindex $endval 1]"]
|
||||||
|
} else {
|
||||||
|
set result [equate pins "$fnum1 [lindex $endval 0]" \
|
||||||
|
"$fnum2 [lindex $endval 1]"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if {$result >= 0} {
|
||||||
|
equate classes "$fnum1 [lindex $endval 0]" \
|
||||||
|
"$fnum2 [lindex $endval 1]"
|
||||||
|
}
|
||||||
|
# Do not set pinMismatch for black boxes
|
||||||
|
if {$result < 0} {
|
||||||
|
if {$result == -1 && [netgen::print queue] != {} && $forceMatch != 1} {
|
||||||
|
# flatten pin mismatch, but not empty cells (-2) or top cell or
|
||||||
|
# cells prohibited from flattening.
|
||||||
|
set doFlatten 1
|
||||||
|
}
|
||||||
|
} elseif {[netgen::print queue] == {} && $result == 0} {
|
||||||
|
set pinMismatch 1
|
||||||
|
} else {
|
||||||
|
# This assumes that proxy pins are added correctly. Previously,
|
||||||
|
# that was not trusted, and so an initial pin mismatch would
|
||||||
|
# always force subcells to be flattened.
|
||||||
|
set doFlatten 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if {$doFlatten} {
|
||||||
|
netgen::log echo on
|
||||||
|
netgen::log put " Flattening non-matched subcircuits $endval\n"
|
||||||
|
netgen::log echo off
|
||||||
|
netgen::flatten class "[lindex $endval 0] $fnum1"
|
||||||
|
netgen::flatten class "[lindex $endval 1] $fnum2"
|
||||||
|
}
|
||||||
|
|
||||||
|
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::log echo on
|
||||||
netgen::verify only
|
netgen::log put "\nFinal result: "
|
||||||
if {$properr != {}} {
|
if {$pinMismatch || $childMismatch} {
|
||||||
netgen::log put "The following cells had property errors: $properr\n"
|
if {$childMismatch} {
|
||||||
|
netgen::log put "Subcell(s) failed matching.\n"
|
||||||
|
}
|
||||||
|
if {$pinMismatch} {
|
||||||
|
netgen::log put "Top level cell failed pin matching.\n"
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
verify only
|
||||||
|
}
|
||||||
|
if {$properr != {}} {
|
||||||
|
netgen::log put "\nThe following cells had property errors:\n " [regsub -all { } $properr "\n "] "\n"
|
||||||
|
}
|
||||||
|
if {$matcherr != {}} {
|
||||||
|
netgen::log put "\nThe following subcells failed to match:\n " [regsub -all { } $matcherr "\n "] "\n"
|
||||||
|
}
|
||||||
|
if {$dolog} {
|
||||||
|
netgen::log end
|
||||||
}
|
}
|
||||||
netgen::log end
|
|
||||||
puts stdout "LVS Done."
|
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
|
# It is important to make sure no netgen commands overlap with Tcl built-in
|
||||||
|
|
@ -235,6 +769,19 @@ set auto_noexec 1 ;# don't EVER call UNIX commands w/o "shell" in front
|
||||||
# Cross-Application section
|
# Cross-Application section
|
||||||
#----------------------------------------------------------------------
|
#----------------------------------------------------------------------
|
||||||
|
|
||||||
|
# For use with open_pdks, set PDK_ROOT from the environment. If no
|
||||||
|
# such environment variable exists, check some common locations.
|
||||||
|
|
||||||
|
if {[catch {set PDK_ROOT $::env(PDK_ROOT)}]} {
|
||||||
|
if {[file isdir /usr/local/share/pdk] == 1} {
|
||||||
|
set PDK_ROOT /usr/local/share/pdk
|
||||||
|
} elseif {[file isdir /usr/share/pdk] == 1} {
|
||||||
|
set PDK_ROOT /usr/share/pdk
|
||||||
|
} elseif {[file isdir /foss/pdk] == 1} {
|
||||||
|
set PDK_ROOT /foss/pdk
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
# Setup IRSIM assuming that the Tcl version is installed.
|
# Setup IRSIM assuming that the Tcl version is installed.
|
||||||
# We do not need to rename procedure irsim to NULL because it is
|
# We do not need to rename procedure irsim to NULL because it is
|
||||||
# redefined in a script, which simply overwrites the original.
|
# redefined in a script, which simply overwrites the original.
|
||||||
|
|
|
||||||
1296
tcltk/tclnetgen.c
1296
tcltk/tclnetgen.c
File diff suppressed because it is too large
Load Diff
135
tcltk/tkcon.tcl
135
tcltk/tkcon.tcl
|
|
@ -44,6 +44,8 @@ exec ${NETGEN_WISH:=wish} "$0" ${1+"$@"}
|
||||||
if {$tcl_version < 8.0} {
|
if {$tcl_version < 8.0} {
|
||||||
return -code error "tkcon requires at least Tcl/Tk8"
|
return -code error "tkcon requires at least Tcl/Tk8"
|
||||||
} else {
|
} else {
|
||||||
|
# Prevent breaking on version 8.5.2
|
||||||
|
# package require -exact Tk $tcl_version
|
||||||
package require Tk $tcl_version
|
package require Tk $tcl_version
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -59,18 +61,6 @@ foreach pkg [info loaded {}] {
|
||||||
}
|
}
|
||||||
catch {unset pkg file name version}
|
catch {unset pkg file name version}
|
||||||
|
|
||||||
# Tk 8.4 makes previously exposed stuff private.
|
|
||||||
# FIX: Update tkcon to not rely on the private Tk code.
|
|
||||||
#
|
|
||||||
if {![llength [info globals tkPriv]]} {
|
|
||||||
::tk::unsupported::ExposePrivateVariable tkPriv
|
|
||||||
}
|
|
||||||
foreach cmd {SetCursor UpDownLine Transpose ScrollPages} {
|
|
||||||
if {![llength [info commands tkText$cmd]]} {
|
|
||||||
::tk::unsupported::ExposePrivateCommand tkText$cmd
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
# Initialize the ::tkcon namespace
|
# Initialize the ::tkcon namespace
|
||||||
#
|
#
|
||||||
namespace eval ::tkcon {
|
namespace eval ::tkcon {
|
||||||
|
|
@ -196,7 +186,7 @@ proc ::tkcon::Init {} {
|
||||||
tkcon_puts tkcon_gets observe observe_var unalias which what
|
tkcon_puts tkcon_gets observe observe_var unalias which what
|
||||||
}
|
}
|
||||||
version 2.3
|
version 2.3
|
||||||
RCS {RCS: @(#) $Id: tkcon.tcl,v 1.2 2008/05/23 00:20:17 tim Exp $}
|
RCS {RCS: @(#) $Id: tkcon.tcl,v 1.2 2008/04/18 16:28:13 tim Exp $}
|
||||||
HEADURL {http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/tkcon/tkcon/tkcon.tcl?rev=HEAD}
|
HEADURL {http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/tkcon/tkcon/tkcon.tcl?rev=HEAD}
|
||||||
docs "http://tkcon.sourceforge.net/"
|
docs "http://tkcon.sourceforge.net/"
|
||||||
email {jeff@hobbs.org}
|
email {jeff@hobbs.org}
|
||||||
|
|
@ -741,11 +731,11 @@ proc ::tkcon::EvalCmd {w cmd} {
|
||||||
set tag [UniqueTag $w]
|
set tag [UniqueTag $w]
|
||||||
$w insert output $res [list stderr $tag] \n stderr
|
$w insert output $res [list stderr $tag] \n stderr
|
||||||
$w tag bind $tag <Enter> \
|
$w tag bind $tag <Enter> \
|
||||||
[list $w tag configure $tag -under 1]
|
[list $w tag configure $tag -underline 1]
|
||||||
$w tag bind $tag <Leave> \
|
$w tag bind $tag <Leave> \
|
||||||
[list $w tag configure $tag -under 0]
|
[list $w tag configure $tag -underline 0]
|
||||||
$w tag bind $tag <ButtonRelease-1> \
|
$w tag bind $tag <ButtonRelease-1> \
|
||||||
"if {!\[info exists tkPriv(mouseMoved)\] || !\$tkPriv(mouseMoved)} \
|
"if {!\[info exists ::tk::Priv(mouseMoved)\] || !\$::tk::Priv(mouseMoved)} \
|
||||||
{[list edit -attach [Attach] -type error -- $PRIV(errorInfo)]}"
|
{[list edit -attach [Attach] -type error -- $PRIV(errorInfo)]}"
|
||||||
} else {
|
} else {
|
||||||
$w insert output $res\n stderr
|
$w insert output $res\n stderr
|
||||||
|
|
@ -2472,9 +2462,9 @@ proc ::tkcon::ErrorHighlight w {
|
||||||
set tag [UniqueTag $w]
|
set tag [UniqueTag $w]
|
||||||
$w tag add $tag $start+${c0}c $start+1c+${c1}c
|
$w tag add $tag $start+${c0}c $start+1c+${c1}c
|
||||||
$w tag configure $tag -foreground $COLOR(stdout)
|
$w tag configure $tag -foreground $COLOR(stdout)
|
||||||
$w tag bind $tag <Enter> [list $w tag configure $tag -under 1]
|
$w tag bind $tag <Enter> [list $w tag configure $tag -underline 1]
|
||||||
$w tag bind $tag <Leave> [list $w tag configure $tag -under 0]
|
$w tag bind $tag <Leave> [list $w tag configure $tag -underline 0]
|
||||||
$w tag bind $tag <ButtonRelease-1> "if {!\$tkPriv(mouseMoved)} \
|
$w tag bind $tag <ButtonRelease-1> "if {!\$::tk::Priv(mouseMoved)} \
|
||||||
{[list edit -attach $app -type proc -find $what -- $cmd]}"
|
{[list edit -attach $app -type proc -find $what -- $cmd]}"
|
||||||
}
|
}
|
||||||
set info [string range $info $c1 end]
|
set info [string range $info $c1 end]
|
||||||
|
|
@ -2501,9 +2491,9 @@ proc ::tkcon::ErrorHighlight w {
|
||||||
set tag [UniqueTag $w]
|
set tag [UniqueTag $w]
|
||||||
$w tag add $tag $ix+1c $start
|
$w tag add $tag $ix+1c $start
|
||||||
$w tag configure $tag -foreground $COLOR(proc)
|
$w tag configure $tag -foreground $COLOR(proc)
|
||||||
$w tag bind $tag <Enter> [list $w tag configure $tag -under 1]
|
$w tag bind $tag <Enter> [list $w tag configure $tag -underline 1]
|
||||||
$w tag bind $tag <Leave> [list $w tag configure $tag -under 0]
|
$w tag bind $tag <Leave> [list $w tag configure $tag -underline 0]
|
||||||
$w tag bind $tag <ButtonRelease-1> "if {!\$tkPriv(mouseMoved)} \
|
$w tag bind $tag <ButtonRelease-1> "if {!\$::tk::Priv(mouseMoved)} \
|
||||||
{[list edit -attach $app -type proc -- $cmd]}"
|
{[list edit -attach $app -type proc -- $cmd]}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -2552,8 +2542,8 @@ proc tkcon {cmd args} {
|
||||||
## 'congets' a replacement for [gets stdin]
|
## 'congets' a replacement for [gets stdin]
|
||||||
# Use the 'gets' alias of 'tkcon_gets' command instead of
|
# Use the 'gets' alias of 'tkcon_gets' command instead of
|
||||||
# calling the *get* methods directly for best compatability
|
# calling the *get* methods directly for best compatability
|
||||||
if {[llength $args]} {
|
if {[llength $args] > 1} {
|
||||||
return -code error "wrong # args: must be \"tkcon congets\""
|
return -code error "wrong # args: must be \"tkcon congets [pfix]\""
|
||||||
}
|
}
|
||||||
tkcon show
|
tkcon show
|
||||||
set old [bind TkConsole <<TkCon_Eval>>]
|
set old [bind TkConsole <<TkCon_Eval>>]
|
||||||
|
|
@ -2561,7 +2551,12 @@ proc tkcon {cmd args} {
|
||||||
set w $::tkcon::PRIV(console)
|
set w $::tkcon::PRIV(console)
|
||||||
# Make sure to move the limit to get the right data
|
# Make sure to move the limit to get the right data
|
||||||
$w mark set insert end
|
$w mark set insert end
|
||||||
$w mark set limit insert
|
if {[llength $args]} {
|
||||||
|
$w mark set limit insert
|
||||||
|
$w insert end $args
|
||||||
|
} else {
|
||||||
|
$w mark set limit insert
|
||||||
|
}
|
||||||
$w see end
|
$w see end
|
||||||
vwait ::tkcon::PRIV(wait)
|
vwait ::tkcon::PRIV(wait)
|
||||||
set line [::tkcon::CmdGet $w]
|
set line [::tkcon::CmdGet $w]
|
||||||
|
|
@ -2798,13 +2793,19 @@ proc tkcon_puts args {
|
||||||
foreach {arg1 arg2 arg3} $args { break }
|
foreach {arg1 arg2 arg3} $args { break }
|
||||||
|
|
||||||
if {$len == 1} {
|
if {$len == 1} {
|
||||||
tkcon console insert output "$arg1\n" stdout
|
set sarg $arg1
|
||||||
|
set nl 1
|
||||||
|
set farg stdout
|
||||||
} elseif {$len == 2} {
|
} elseif {$len == 2} {
|
||||||
if {![string compare $arg1 -nonewline]} {
|
if {![string compare $arg1 -nonewline]} {
|
||||||
tkcon console insert output $arg2 stdout
|
set sarg $arg2
|
||||||
|
set farg stdout
|
||||||
|
set nl 0
|
||||||
} elseif {![string compare $arg1 stdout] \
|
} elseif {![string compare $arg1 stdout] \
|
||||||
|| ![string compare $arg1 stderr]} {
|
|| ![string compare $arg1 stderr]} {
|
||||||
tkcon console insert output "$arg2\n" $arg1
|
set sarg $arg2
|
||||||
|
set farg $arg1
|
||||||
|
set nl 1
|
||||||
} else {
|
} else {
|
||||||
set len 0
|
set len 0
|
||||||
}
|
}
|
||||||
|
|
@ -2812,11 +2813,15 @@ proc tkcon_puts args {
|
||||||
if {![string compare $arg1 -nonewline] \
|
if {![string compare $arg1 -nonewline] \
|
||||||
&& (![string compare $arg2 stdout] \
|
&& (![string compare $arg2 stdout] \
|
||||||
|| ![string compare $arg2 stderr])} {
|
|| ![string compare $arg2 stderr])} {
|
||||||
tkcon console insert output $arg3 $arg2
|
set sarg $arg3
|
||||||
|
set farg $arg2
|
||||||
|
set nl 0
|
||||||
} elseif {(![string compare $arg1 stdout] \
|
} elseif {(![string compare $arg1 stdout] \
|
||||||
|| ![string compare $arg1 stderr]) \
|
|| ![string compare $arg1 stderr]) \
|
||||||
&& ![string compare $arg3 nonewline]} {
|
&& ![string compare $arg3 nonewline]} {
|
||||||
tkcon console insert output $arg2 $arg1
|
set sarg $arg2
|
||||||
|
set farg $arg1
|
||||||
|
set nl 0
|
||||||
} else {
|
} else {
|
||||||
set len 0
|
set len 0
|
||||||
}
|
}
|
||||||
|
|
@ -2826,7 +2831,42 @@ proc tkcon_puts args {
|
||||||
|
|
||||||
## $len == 0 means it wasn't handled by tkcon above.
|
## $len == 0 means it wasn't handled by tkcon above.
|
||||||
##
|
##
|
||||||
if {$len == 0} {
|
|
||||||
|
if {$len != 0} {
|
||||||
|
|
||||||
|
## "poor man's" \r substitution---erase everything on the output
|
||||||
|
## line and print from character after the \r
|
||||||
|
|
||||||
|
set rpt [string last \r $sarg]
|
||||||
|
if {$rpt >= 0} {
|
||||||
|
tkcon console delete "insert linestart" "insert lineend"
|
||||||
|
set sarg [string range $sarg [expr {$rpt + 1}] end]
|
||||||
|
}
|
||||||
|
|
||||||
|
set bpt [string first \b $sarg]
|
||||||
|
if {$bpt >= 0} {
|
||||||
|
set narg [string range $sarg [expr {$bpt + 1}] end]
|
||||||
|
set sarg [string range $sarg 0 [expr {$bpt - 1}]]
|
||||||
|
set nl 0
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if {$nl == 0} {
|
||||||
|
tkcon console insert output $sarg $farg
|
||||||
|
} else {
|
||||||
|
tkcon console insert output "$sarg\n" $farg
|
||||||
|
}
|
||||||
|
|
||||||
|
if {$bpt >= 0} {
|
||||||
|
tkcon console delete "insert -1 char" insert
|
||||||
|
if {$nl == 0} {
|
||||||
|
tkcon_puts $farg $narg nonewline
|
||||||
|
} else {
|
||||||
|
tkcon_puts $farg $narg
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
global errorCode errorInfo
|
global errorCode errorInfo
|
||||||
if {[catch "tkcon_tcl_puts $args" msg]} {
|
if {[catch "tkcon_tcl_puts $args" msg]} {
|
||||||
regsub tkcon_tcl_puts $msg puts msg
|
regsub tkcon_tcl_puts $msg puts msg
|
||||||
|
|
@ -2954,14 +2994,14 @@ proc edit {args} {
|
||||||
##
|
##
|
||||||
set text $w.text
|
set text $w.text
|
||||||
set m [menu [::tkcon::MenuButton $menu Edit edit]]
|
set m [menu [::tkcon::MenuButton $menu Edit edit]]
|
||||||
$m add command -label "Cut" -under 2 \
|
$m add command -label "Cut" -underline 2 \
|
||||||
-command [list tk_textCut $text]
|
-command [list tk_textCut $text]
|
||||||
$m add command -label "Copy" -under 0 \
|
$m add command -label "Copy" -underline 0 \
|
||||||
-command [list tk_textCopy $text]
|
-command [list tk_textCopy $text]
|
||||||
$m add command -label "Paste" -under 0 \
|
$m add command -label "Paste" -underline 0 \
|
||||||
-command [list tk_textPaste $text]
|
-command [list tk_textPaste $text]
|
||||||
$m add separator
|
$m add separator
|
||||||
$m add command -label "Find" -under 0 \
|
$m add command -label "Find" -underline 0 \
|
||||||
-command [list ::tkcon::FindBox $text]
|
-command [list ::tkcon::FindBox $text]
|
||||||
|
|
||||||
## Send To Menu
|
## Send To Menu
|
||||||
|
|
@ -4106,7 +4146,7 @@ proc ::tkcon::Bindings {} {
|
||||||
global tcl_platform tk_version
|
global tcl_platform tk_version
|
||||||
|
|
||||||
#-----------------------------------------------------------------------
|
#-----------------------------------------------------------------------
|
||||||
# Elements of tkPriv that are used in this file:
|
# Elements of ::tk::Priv that are used in this file:
|
||||||
#
|
#
|
||||||
# char - Character position on the line; kept in order
|
# char - Character position on the line; kept in order
|
||||||
# to allow moving up or down past short lines while
|
# to allow moving up or down past short lines while
|
||||||
|
|
@ -4134,6 +4174,9 @@ proc ::tkcon::Bindings {} {
|
||||||
foreach ev [bind Text] { bind TkConsole $ev [bind Text $ev] }
|
foreach ev [bind Text] { bind TkConsole $ev [bind Text $ev] }
|
||||||
## We really didn't want the newline insertion
|
## We really didn't want the newline insertion
|
||||||
bind TkConsole <Control-Key-o> {}
|
bind TkConsole <Control-Key-o> {}
|
||||||
|
|
||||||
|
## in 8.6b3, the virtual events <<NextLine>> and <<PrevLine>>
|
||||||
|
# mess up our history feature
|
||||||
bind TkConsole <<NextLine>> {}
|
bind TkConsole <<NextLine>> {}
|
||||||
bind TkConsole <<PrevLine>> {}
|
bind TkConsole <<PrevLine>> {}
|
||||||
|
|
||||||
|
|
@ -4342,9 +4385,9 @@ proc ::tkcon::Bindings {} {
|
||||||
|
|
||||||
bind TkConsole <Control-a> {
|
bind TkConsole <Control-a> {
|
||||||
if {[%W compare {limit linestart} == {insert linestart}]} {
|
if {[%W compare {limit linestart} == {insert linestart}]} {
|
||||||
tkTextSetCursor %W limit
|
::tk::TextSetCursor %W limit
|
||||||
} else {
|
} else {
|
||||||
tkTextSetCursor %W {insert linestart}
|
::tk::TextSetCursor %W {insert linestart}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bind TkConsole <Key-Home> [bind TkConsole <Control-a>]
|
bind TkConsole <Key-Home> [bind TkConsole <Control-a>]
|
||||||
|
|
@ -4368,14 +4411,14 @@ proc ::tkcon::Bindings {} {
|
||||||
}
|
}
|
||||||
bind TkConsole <<TkCon_Previous>> {
|
bind TkConsole <<TkCon_Previous>> {
|
||||||
if {[%W compare {insert linestart} != {limit linestart}]} {
|
if {[%W compare {insert linestart} != {limit linestart}]} {
|
||||||
tkTextSetCursor %W [tkTextUpDownLine %W -1]
|
::tk::TextSetCursor %W [::tk::TextUpDownLine %W -1]
|
||||||
} else {
|
} else {
|
||||||
::tkcon::Event -1
|
::tkcon::Event -1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
bind TkConsole <<TkCon_Next>> {
|
bind TkConsole <<TkCon_Next>> {
|
||||||
if {[%W compare {insert linestart} != {end-1c linestart}]} {
|
if {[%W compare {insert linestart} != {end-1c linestart}]} {
|
||||||
tkTextSetCursor %W [tkTextUpDownLine %W 1]
|
::tk::TextSetCursor %W [::tk::TextUpDownLine %W 1]
|
||||||
} else {
|
} else {
|
||||||
::tkcon::Event 1
|
::tkcon::Event 1
|
||||||
}
|
}
|
||||||
|
|
@ -4390,7 +4433,7 @@ proc ::tkcon::Bindings {} {
|
||||||
}
|
}
|
||||||
bind TkConsole <<TkCon_Transpose>> {
|
bind TkConsole <<TkCon_Transpose>> {
|
||||||
## Transpose current and previous chars
|
## Transpose current and previous chars
|
||||||
if {[%W compare insert > "limit+1c"]} { tkTextTranspose %W }
|
if {[%W compare insert > "limit+1c"]} { ::tk::TextTranspose %W }
|
||||||
}
|
}
|
||||||
bind TkConsole <<TkCon_ClearLine>> {
|
bind TkConsole <<TkCon_ClearLine>> {
|
||||||
## Clear command line (Unix shell staple)
|
## Clear command line (Unix shell staple)
|
||||||
|
|
@ -4408,10 +4451,10 @@ proc ::tkcon::Bindings {} {
|
||||||
::tkcon::Insert %W $::tkcon::PRIV(tmp)
|
::tkcon::Insert %W $::tkcon::PRIV(tmp)
|
||||||
%W see end
|
%W see end
|
||||||
}
|
}
|
||||||
catch {bind TkConsole <Key-Page_Up> { tkTextScrollPages %W -1 }}
|
catch {bind TkConsole <Key-Page_Up> { ::tk::TextScrollPages %W -1 }}
|
||||||
catch {bind TkConsole <Key-Prior> { tkTextScrollPages %W -1 }}
|
catch {bind TkConsole <Key-Prior> { ::tk::TextScrollPages %W -1 }}
|
||||||
catch {bind TkConsole <Key-Page_Down> { tkTextScrollPages %W 1 }}
|
catch {bind TkConsole <Key-Page_Down> { ::tk::TextScrollPages %W 1 }}
|
||||||
catch {bind TkConsole <Key-Next> { tkTextScrollPages %W 1 }}
|
catch {bind TkConsole <Key-Next> { ::tk::TextScrollPages %W 1 }}
|
||||||
bind TkConsole <$PRIV(meta)-d> {
|
bind TkConsole <$PRIV(meta)-d> {
|
||||||
if {[%W compare insert >= limit]} {
|
if {[%W compare insert >= limit]} {
|
||||||
%W delete insert {insert wordend}
|
%W delete insert {insert wordend}
|
||||||
|
|
@ -4429,7 +4472,7 @@ proc ::tkcon::Bindings {} {
|
||||||
}
|
}
|
||||||
bind TkConsole <ButtonRelease-2> {
|
bind TkConsole <ButtonRelease-2> {
|
||||||
if {
|
if {
|
||||||
(!$tkPriv(mouseMoved) || $tk_strictMotif) &&
|
(!$::tk::Priv(mouseMoved) || $tk_strictMotif) &&
|
||||||
![catch {::tkcon::GetSelection %W} ::tkcon::PRIV(tmp)]
|
![catch {::tkcon::GetSelection %W} ::tkcon::PRIV(tmp)]
|
||||||
} {
|
} {
|
||||||
if {[%W compare @%x,%y < limit]} {
|
if {[%W compare @%x,%y < limit]} {
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue