subckt.c, fix .model processing (scope)
This commit is contained in:
parent
59de942bdf
commit
a088a6e0e6
|
|
@ -1191,6 +1191,7 @@ AC_CONFIG_FILES([Makefile
|
|||
tests/mos6/Makefile
|
||||
tests/polezero/Makefile
|
||||
tests/regression/Makefile
|
||||
tests/regression/subckt-processing/Makefile
|
||||
tests/regression/lib-processing/Makefile
|
||||
tests/regression/parser/Makefile
|
||||
tests/sensitivity/Makefile
|
||||
|
|
|
|||
|
|
@ -212,12 +212,24 @@ inp_subcktexpand(struct line *deck) {
|
|||
/* Get all the model names so we can deal with BJTs, etc.
|
||||
* Stick all the model names into the doubly-linked wordlist modnames.
|
||||
*/
|
||||
for (c = deck; c; c = c->li_next)
|
||||
if (ciprefix(model, c->li_line)) {
|
||||
s = c->li_line;
|
||||
txfree(gettok(&s)); /* discard the model keyword */
|
||||
modnames = wl_cons(gettok(&s), modnames);
|
||||
} /* model name finding routine */
|
||||
{
|
||||
int nest = 0;
|
||||
for (c = deck; c; c = c->li_next) {
|
||||
|
||||
if (ciprefix(".subckt", c->li_line))
|
||||
nest++;
|
||||
else if (ciprefix(".ends", c->li_line))
|
||||
nest--;
|
||||
else if (nest > 0)
|
||||
continue;
|
||||
|
||||
if (ciprefix(model, c->li_line)) {
|
||||
s = c->li_line;
|
||||
txfree(gettok(&s)); /* discard the model keyword */
|
||||
modnames = wl_cons(gettok(&s), modnames);
|
||||
} /* model name finding routine */
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef TRACE
|
||||
{
|
||||
|
|
@ -595,8 +607,10 @@ doit(struct line *deck, wordlist *modnames) {
|
|||
lcc = inp_deckcopy(sss->su_def);
|
||||
|
||||
/* Change the names of .models found in .subckts . . . */
|
||||
submod = NULL;
|
||||
if (modtranslate(lcc, scname, &submod, &modnames)) /* this translates the model name in the .model line */
|
||||
devmodtranslate(lcc, scname, submod); /* This translates the model name on all components in the deck */
|
||||
wl_free(submod);
|
||||
|
||||
{
|
||||
char *s = sss->su_args;
|
||||
|
|
@ -664,7 +678,6 @@ doit(struct line *deck, wordlist *modnames) {
|
|||
#endif
|
||||
|
||||
wl_delete_slice(modnames, xmodnames);
|
||||
wl_free(submod);
|
||||
|
||||
if (error)
|
||||
return NULL; /* error message already reported; should free() */
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
## Process this file with automake to produce Makefile.in
|
||||
|
||||
SUBDIRS = lib-processing parser
|
||||
SUBDIRS = lib-processing parser subckt-processing
|
||||
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
|
|
|
|||
|
|
@ -0,0 +1,12 @@
|
|||
## Process this file with automake to produce Makefile.in
|
||||
|
||||
|
||||
TESTS = model-scope-5.cir
|
||||
|
||||
TESTS_ENVIRONMENT = ngspice_vpath=$(srcdir) $(SHELL) $(top_srcdir)/tests/bin/check.sh $(top_builddir)/src/ngspice
|
||||
|
||||
EXTRA_DIST = \
|
||||
$(TESTS) \
|
||||
$(TESTS:.cir=.out)
|
||||
|
||||
MAINTAINERCLEANFILES = Makefile.in
|
||||
|
|
@ -0,0 +1,84 @@
|
|||
check scoping of nested .model definitions
|
||||
|
||||
* (exec-spice "ngspice -b %s")
|
||||
* (tests-aux-renumber)
|
||||
|
||||
|
||||
i1 n1001_t 0 dc=-1
|
||||
i2 n1002_t 0 dc=-1
|
||||
i3 n1003_t 0 dc=-1
|
||||
i4 n1004_t 0 dc=-1
|
||||
i5 n1005_t 0 dc=-1
|
||||
i6 n1006_t 0 dc=-1
|
||||
i7 n1007_t 0 dc=-1
|
||||
|
||||
x1 n1001_t sub1
|
||||
v1_g n1001_g 0 2k
|
||||
|
||||
x2 n1002_t n1003_t n1004_t n1005_t n1006_t n1007_t sub2
|
||||
v2_g n1002_g 0 4k
|
||||
v3_g n1003_g 0 1k
|
||||
v4_g n1004_g 0 8k
|
||||
v5_g n1005_g 0 1k
|
||||
v6_g n1006_g 0 8k
|
||||
v7_g n1007_g 0 43
|
||||
|
||||
.subckt sub1 2
|
||||
.model my r r=2k
|
||||
r1 2 0 my
|
||||
.ends
|
||||
|
||||
.subckt sub2 3 41a 41b 42a 42b 5
|
||||
r2 3 0 my
|
||||
|
||||
x31 41a 41b sub3
|
||||
x32 42a 42b sub3
|
||||
|
||||
.subckt sub3 4 5
|
||||
.model my r r=8k
|
||||
.model any r r=42
|
||||
r5 4 0 1k
|
||||
r6 5 0 my
|
||||
.ends
|
||||
|
||||
.model just r r=43
|
||||
r5 5 0 just
|
||||
.ends
|
||||
|
||||
.model my r r=4k
|
||||
|
||||
|
||||
.control
|
||||
|
||||
define mismatch(a,b,err) abs(a-b)>err
|
||||
|
||||
op
|
||||
|
||||
let total_count = 0
|
||||
let fail_count = 0
|
||||
|
||||
let tests = 1001 + vector(7)
|
||||
|
||||
foreach n $&tests
|
||||
set n_test = "n{$n}_t"
|
||||
set n_gold = "n{$n}_g"
|
||||
if mismatch(v($n_test), v($n_gold), 1e-9)
|
||||
let v_test = v($n_test)
|
||||
let v_gold = v($n_gold)
|
||||
echo "ERROR, test failure, v($n_test) = $&v_test but should be $&v_gold"
|
||||
let fail_count = fail_count + 1
|
||||
end
|
||||
let total_count = total_count + 1
|
||||
end
|
||||
|
||||
if fail_count > 0
|
||||
echo "ERROR: $&fail_count of $&total_count tests failed"
|
||||
quit 1
|
||||
else
|
||||
echo "INFO: $&fail_count of $&total_count tests failed"
|
||||
quit 0
|
||||
end
|
||||
|
||||
.endc
|
||||
|
||||
.end
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
|
||||
Circuit: check scoping of nested .model definitions
|
||||
|
||||
Doing analysis at TEMP = 27.000000 and TNOM = 27.000000
|
||||
|
||||
|
||||
No. of Data Rows : 1
|
||||
INFO: 0 of 7 tests failed
|
||||
ngspice-25 done
|
||||
Loading…
Reference in New Issue