6 #define API_USE_REAL_TYPES
7 #include "gen_API_netlist.h"
10 static mbkContext gen_api_ctx
[32];
11 /*lofig_list *gen_api_head_lofig;
12 ht *gen_api_ht_lofig;*/
15 void gen_API_Action_Initialize ()// commentaire pour desactiver l'ajout de token
19 // Contextualize HEAD_LOFIG ___________________________
21 gen_api_ctx
[recur
].HEAD_LOFIG
=GEN_HEAD_LOFIG
;
22 gen_api_ctx
[recur
].HT_LOFIG
=GEN_HT_LOFIG
;
24 mbkSwitchContext(&gen_api_ctx
[recur
]);
28 gen_api_head_lofig = HEAD_LOFIG;
29 HEAD_LOFIG = GEN_HEAD_LOFIG;
31 gen_api_ht_lofig = HT_LOFIG;
32 HT_LOFIG = GEN_HT_LOFIG;
34 if ((str
= avt_gethashvar ("GEN_SEPAR")))
39 // Global variables initialization
40 /* if (TRANS_TO_SUPPRESS) {
41 freechain (TRANS_TO_SUPPRESS);
42 TRANS_TO_SUPPRESS = NULL;
46 // Release HEAD_LOFIG _________________________________
48 void gen_API_Action_Terminate ()// commentaire pour desactiver l'ajout de token
51 if (recur
<0) avt_fprintf(stderr
,"¤6internal_error in gen_API¤.");
53 mbkSwitchContext(&gen_api_ctx
[recur
]);
55 GEN_HEAD_LOFIG = HEAD_LOFIG;
56 HEAD_LOFIG = gen_api_head_lofig;
58 GEN_HT_LOFIG = HT_LOFIG;
59 HT_LOFIG = gen_api_ht_lofig;
62 //_____________________________________________________________________________
63 //_____________________________________________________________________________
65 lofig_list
*gns_GetNetlist ()
69 gen_update_loins (CUR_HIER_LOFIG
, CUR_CORRESP_TABLE
);
70 gen_update_transistors (CUR_HIER_LOFIG
, CUR_CORRESP_TABLE
);
71 return CUR_HIER_LOFIG
;
74 lofig_list
*gns_GetInstanceNetlist (char *name
)
76 CorrespondingInstance
*xi
;
77 lofig_list
*lf
, *duplf
;
79 xi
=gns_GetCorrespondingInstance(name
);
80 if (xi
==NULL
) return NULL
;
81 lf
=gen_getlofig(xi
->CRT
->GENIUS_FIGNAME
);
84 gen_update_loins(duplf
, xi
->CRT
);
85 gen_update_transistors (duplf
, xi
->CRT
);
86 duplf
->USER
=addptype(duplf
->USER
, GEN_ORIG_INS_CORRESP_PTYPE
, xi
->CRT
);
90 lofig_list
*gns_DuplicateNetlist (lofig_list
*lf
)
97 //_____________________________________________________________________________
98 //_____________________________________________________________________________
100 void gns_DumpCorrespTable ()
105 sprintf (buf
, "%s.dic", CUR_HIER_LOFIG
->NAME
);
106 if ((f
= fopen (buf
, "w+"))) gen_drive_corresp_htable (f
, buf
, NULL
, 1, CUR_CORRESP_TABLE
);
109 // Fonctions de correspondance et de nommage _____________________________________
111 //_____________________________________________________________________________
112 //_____________________________________________________________________________
114 void gns_ViewLo (Netlist
*ptfig
)
118 viewlofig ((lofig_list
*)ptfig
);
121 //_____________________________________________________________________________
123 void gns_DriveNetlist (Netlist
*ptfig
, char *format
, char *path
, char *name
)
126 char *prev_work_lib
= WORK_LIB
;
134 ptfig
->NAME
=namealloc(name
);
137 strcpy (prev_out_lo
, OUT_LO
);
140 if (!strcasecmp (format
, "spice")) {
141 strcpy (OUT_LO
, "spi");
142 savelofig ((lofig_list
*)ptfig
);
144 else if (!strcasecmp (format
, "vhdl")) {
145 strcpy (OUT_LO
, "vhd");
146 savelofig ((lofig_list
*)ptfig
);
148 else if (!strcasecmp (format
, "al")) {
149 strcpy (OUT_LO
, "al");
150 savelofig ((lofig_list
*)ptfig
);
152 else if (!strcasecmp (format
, "verilog")) {
153 strcpy (OUT_LO
, "vlg");
154 savelofig ((lofig_list
*)ptfig
);
157 fprintf (stderr
, "Supported formats are 'spice', 'vhdl' and 'verilog'\n");
159 WORK_LIB
= prev_work_lib
;
160 strcpy (OUT_LO
, prev_out_lo
);
166 //_____________________________________________________________________________
168 extern chain_list
*expansedloins
, *originalloins
;
170 //_____________________________________________________________________________
172 //_____________________________________________________________________________
174 char *gns_GetInstanceName(loins_list
*li
)
179 //_____________________________________________________________________________
183 //_____________________________________________________________________________
185 char *gns_GetInstanceModelName(loins_list
*li
)
190 //_____________________________________________________________________________
192 void gns_GetModelSignalRange(char *name
, int *left
, int *right
)
201 if (current_lofig
==NULL
)
203 fprintf(stderr
,"%s: Can't call gns_GetSignalRange() outside genius recognition process\n",gen_info());
206 arbo
=gen_hierarchical_split(gen_makesignalname(name
));
207 if (arbo
->NEXT
!=NULL
)
210 fprintf(stderr
,"%s: gns_GetSignalRange() called with a hierarchical name '%s'\n",gen_info(),name
);
214 // sight=gen_get_losig_ht(current_lofig);
216 modells
=mbk_quickly_getlosigbyname(current_lofig
, vectorradical((char *)arbo
->DATA
));
218 modells
=mbk_quickly_getlosigbyname(current_lofig
, (char *)arbo
->DATA
);
220 if ((l=gethtitem(sight, vectorradical((char *)arbo->DATA)))!=EMPTYHT
221 || (l=gethtitem(sight, (char *)arbo->DATA))!=EMPTYHT
223 modells=(losig_list *)l;
228 for (modells=current_lofig->LOSIG;
229 modells!=NULL && modells->NAMECHAIN->DATA!=vectorradical((char *)arbo->DATA);
230 modells=modells->NEXT) ;
232 if (modells==NULL && current_lofig->LOINS==NULL)
234 for (modells=current_lofig->LOSIG;
235 modells!=NULL && modells->NAMECHAIN->DATA!=(char *)arbo->DATA;
236 modells=modells->NEXT) ;
243 if (!current_lofig
->LOINS
)
248 p
=getptype(modells
->USER
, GEN_REAL_RANGE_PTYPE
);
251 tree
=(tree_list
*)p
->DATA
;
256 if (gen_is_token_to (TOKEN(tree
)) || gen_is_token_downto (TOKEN(tree
)))
258 *left
=Eval_Exp_VHDL(tree
->NEXT
->DATA
, ALL_ENV
);
259 *right
=Eval_Exp_VHDL(tree
->NEXT
->NEXT
->DATA
, ALL_ENV
);
267 fprintf(stderr
,"%s: gns_GetSignalRange() can't find signal '%s' in model\n",gen_info(),name
);
271 //_____________________________________________________________________________
273 chain_list
*gns_GetModelConnectorList()
278 if (current_lofig
==NULL
)
280 fprintf(stderr
,"%s: Can't call gns_GetConnectorList() at the end of genius process\n",gen_info());
284 for (lc
=current_lofig
->LOCON
, lst
=NULL
; lc
!=NULL
; lc
=lc
->NEXT
)
286 lst
=addchain(lst
, lc
);
294 //_____________________________________________________________________________
296 chain_list
*gns_GetConnectorList(lofig_list
*lf
)
301 for (lc
=lf
->LOCON
, lst
=NULL
; lc
!=NULL
; lc
=lc
->NEXT
)
302 lst
=addchain(lst
, lc
);
307 //_____________________________________________________________________________
309 char *gns_GetConnectorName(locon_list
*lc
)
314 //_____________________________________________________________________________
316 losig_list
*gns_GetConnectorSignal(locon_list
*lc
)
321 //_____________________________________________________________________________
323 char *gns_GetConnectorDirection(locon_list
*lc
)
325 switch(lc
->DIRECTION
)
327 case IN
: return namealloc("in");
328 case OUT
: return namealloc("out");
329 case INOUT
: return namealloc("inout");
330 case UNKNOWN
: return namealloc("linkage");
332 case TRANSCV
: return namealloc("mux_bit");
334 return namealloc("linkage");
337 //_____________________________________________________________________________
339 char *gns_Vectorize(char *name
, int index
)
342 sprintf(temp
,"%s(%d)",name
,index
);
343 return namealloc(temp
);
346 //_____________________________________________________________________________
348 char *gns_Vectorize2D(char *name
, int index0
, int index1
)
351 sprintf(temp
,"%s(%d)(%d)",name
,index0
,index1
);
352 return namealloc(temp
);
355 //_____________________________________________________________________________
357 chain_list
*gns_GetModelSignalList()
362 if (current_lofig
==NULL
)
364 fprintf(stderr
,"%s: Can't call gns_GetModelSignalList() at the end of genius process\n",gen_info());
368 for (ls
=current_lofig
->LOSIG
, lst
=NULL
; ls
!=NULL
; ls
=ls
->NEXT
)
369 lst
=addchain(lst
, ls
);
376 //_____________________________________________________________________________
378 char *gns_GetSignalName(losig_list
*ls
)
382 fprintf (stderr
, "Error in 'gns_GetSignalName', parameter 'ls' is NULL\n");
386 if (vectorindex((char *)ls
->NAMECHAIN
->DATA
)==-1)
387 return (char *)ls
->NAMECHAIN
->DATA
;
388 return gns_Vectorize(vectorradical((char *)ls
->NAMECHAIN
->DATA
), vectorindex((char *)ls
->NAMECHAIN
->DATA
));
391 //_____________________________________________________________________________
393 int gns_IsSignalExternal(losig_list
*ls
)
395 return ls
->TYPE
=='E';
398 //_____________________________________________________________________________
400 chain_list
*gns_GetInstanceConnectorList(loins_list
*ls
)
405 if (current_lofig
==NULL
)
407 fprintf(stderr
,"%s: Can't call gns_GetConnectorList() at the end of genius process\n",gen_info());
412 for (lc
=ls
->LOCON
, lst
=NULL
; lc
!=NULL
; lc
=lc
->NEXT
)
413 lst
=addchain(lst
, lc
);
415 if (getptype(ls
->USER
, GEN_FOUNDINS_PTYPE
)!=NULL
)
421 locon_list
*gns_GetInstanceConnector(loins_list
*ls
, char *name
)
423 chain_list
*lst
, *arbo
;
426 arbo
=gen_hierarchical_split(gen_makesignalname(name
));
427 if (arbo
->NEXT
!=NULL
)
430 fprintf(stderr
,"%s: gns_GetInstanceConnector() called with a hierarchical name '%s'\n",gen_info(),name
);
433 for (lc
=ls
->LOCON
, lst
=NULL
; lc
!=NULL
; lc
=lc
->NEXT
)
435 if (vectorradical(lc
->NAME
)==vectorradical((char *)arbo
->DATA
)
436 && vectorindex(lc
->NAME
)==vectorindex((char *)arbo
->DATA
))
444 fprintf(stderr
,"%s: gns_GetInstanceConnector() can't find connector '%s' for instance\n",gen_info(),name
);
448 loins_list
*gns_GetInstance(lofig_list
*lf
, char *name
)
452 name
=namealloc(gen_makeinstancename(name
));
454 for (li
=lf
->LOINS
; li
!=NULL
&& li
->INSNAME
!=name
; li
=li
->NEXT
) ;
459 //_____________________________________________________________________________
461 chain_list
*gns_GetAllCorrespondingInstances()
466 for (cl
=CUR_CORRESP_TABLE
->SUBINSTS
, lst
=NULL
; cl
!=NULL
; cl
=cl
->NEXT
)
467 lst
=addchain(lst
, cl
);
472 //_____________________________________________________________________________
474 chain_list
*gns_GetAllCorrespondingTransistors()
476 return GetAllHTElems(CUR_CORRESP_TABLE
->TRANSISTORS
);
479 //_____________________________________________________________________________
481 chain_list
*gns_GetAllCorrespondingInstanceModels()
483 chain_list
*lst
, *cl
, *cl1
;
486 cl
=gns_GetAllCorrespondingInstances();
489 si
=(subinst_t
*)cl
->DATA
;
490 for (cl1
=lst
; cl1
!=NULL
&& cl1
->DATA
!=si
->CRT
->GENIUS_FIGNAME
; cl1
=cl1
->NEXT
) ;
492 lst
=addchain(lst
, si
->CRT
->GENIUS_FIGNAME
);
499 //_____________________________________________________________________________
501 //_____________________________________________________________________________
503 locon_list
*gns_GetTransistorGrid(lotrs_list
*lt
)
508 //_____________________________________________________________________________
510 locon_list
*gns_GetTransistorDrain(lotrs_list
*lt
)
515 //_____________________________________________________________________________
517 locon_list
*gns_GetTransistorSource(lotrs_list
*lt
)
522 //_____________________________________________________________________________
524 char gns_GetTransistorType(lotrs_list
*lt
)
526 if (MLO_IS_TRANSN(lt
->TYPE
)) return 'n';
530 //_____________________________________________________________________________
532 char *gns_GetTransistorTypeName(lotrs_list
*lt
)
534 return getlotrsmodel(lt
);
537 //_____________________________________________________________________________
539 double gns_GetTransistorParameter(char *name
, lotrs_list
*lt
)
541 if (strcasecmp(name
,"w")==0)
542 return ((double)lt
->WIDTH
/SCALE_X
)*1e-6;
543 if (strcasecmp(name
,"l")==0)
544 return ((double)lt
->LENGTH
/SCALE_X
)*1e-6;
546 if (strcasecmp(name
,"as")==0)
548 if (lt
->XS
<0) return -1;
549 else return ((double) lt
->XS
* lt
->WIDTH
/ ( SCALE_X
* SCALE_X
))*1e-12;
551 if (strcasecmp(name
,"ad")==0)
553 if (lt
->XD
<0) return -1;
554 else return ((double) lt
->XD
* lt
->WIDTH
/ ( SCALE_X
* SCALE_X
))*1e-12;
556 if (strcasecmp(name
,"ps")==0)
558 if (lt
->PS
<0) return -1;
559 else return ((double) lt
->PS
/SCALE_X
)*1e-6;
561 if (strcasecmp(name
,"pd")==0)
563 if (lt
->PD
<0) return -1;
564 else return ((double) lt
->PD
/SCALE_X
)*1e-6;
567 if (strcasecmp(name
,"x")==0)
568 return ((double) lt
->X
);
569 if (strcasecmp(name
,"y")==0)
570 return ((double) lt
->Y
);
572 fprintf(stderr
,"%s: gns_GetTransistorParameter() can't find parameter '%s' for transistor\n",gen_info(),name
);
576 //_____________________________________________________________________________
578 char *gns_GetTransistorName(lotrs_list
*lt
)
580 return lt
->TRNAME
==NULL
?namealloc("??"):lt
->TRNAME
;
583 //_____________________________________________________________________________
585 chain_list
*gns_GetAllTransistorsConnectedtoSignal(losig_list
*ls
)
587 chain_list
*lst
, *cl
;
590 for (cl
=getptype(ls
->USER
, LOFIGCHAIN
)->DATA
, lst
=NULL
; cl
!=NULL
; cl
=cl
->NEXT
)
592 lc
=(locon_list
*)cl
->DATA
;
595 lst
=addchain(lst
, lc
->ROOT
);
602 //_____________________________________________________________________________
604 locon_list
*gns_GetExternalConnectorOfSignal(losig_list
*ls
)
609 for (cl
=getptype(ls
->USER
, LOFIGCHAIN
)->DATA
; cl
!=NULL
; cl
=cl
->NEXT
)
611 lc
=(locon_list
*)cl
->DATA
;
621 //_____________________________________________________________________________
623 int gns_VectorIndex(char *name
)
625 return vectorindex(name
);
628 //_____________________________________________________________________________
630 char *gns_VectorRadical(char *name
)
632 return vectorradical(namealloc(name
));
635 //_____________________________________________________________________________
637 char *gns_CreateVhdlName(char *name
)
639 return bvl_vhdlname(name
);
642 //_____________________________________________________________________________
644 void gns_ChangeInstanceModelName(loins_list
*li
, char *name
)
648 addhtitem(NEW_LOINS_NAMES_HT
, CUR_CORRESP_TABLE
->GENIUS_INSNAME
, (long)namealloc(name
));
652 li
->FIGNAME
=namealloc(name
);
656 //_____________________________________________________________________________
658 locon_list
*gns_GetConnector (lofig_list
*netlist
, char *con_name
)
660 return gen_get_connector (netlist
, con_name
);
663 //_____________________________________________________________________________
665 double gns_GetConnectorCapa (locon_list
*lc
)
671 if (lc
->DIRECTION
!= 'I') return 0.0;
673 for (ch
= gen_get_lofigchain (lc
->SIG
); ch
; ch
= ch
->NEXT
) {
674 ptcon
= (locon_list
*)ch
->DATA
;
675 if (ptcon
->TYPE
!= 'T' || ptcon
->NAME
== lc
->NAME
) continue;
676 capa
+= gen_get_transistor_capa (ptcon
);
683 //_____________________________________________________________________________
685 lotrs_list
*gns_GetTransistor (lofig_list
*netlist
, char *tr_name
)
687 return gen_get_transistor (netlist
, tr_name
);
690 //_____________________________________________________________________________
692 lotrs_list
*gns_GetCorrespondingTransistor (char *name
)
694 return gen_GetCorrespondingTransistor(name
, CUR_CORRESP_TABLE
);
695 // return gen_corresp_trs (gen_makeinstancename(name), CUR_CORRESP_TABLE);
698 //_____________________________________________________________________________
700 losig_list
*gns_GetCorrespondingSignal (char *name
)
702 return gen_corresp_sig (gen_makesignalname(name
), CUR_CORRESP_TABLE
);
705 //_____________________________________________________________________________
707 losig_list
*gns_GetSignal (lofig_list
*netlist
, char *signame
)
709 lofig_list
*head_lofig
;
714 fprintf (stderr
, "Error in 'gns_GetSignal', parameter 'netlist' is NULL\n");
719 fprintf (stderr
, "Error in 'gns_GetSignal', parameter 'signame' is NULL\n");
723 // Contextualize HEAD_LOFIG ___________________________
724 head_lofig
= HEAD_LOFIG
;
725 HEAD_LOFIG
= GEN_HEAD_LOFIG
;
727 HT_LOFIG
= GEN_HT_LOFIG
;
729 // Function call ______________________________________
730 sig
= gen_get_signal (netlist
, signame
);
732 // Release HEAD_LOFIG _________________________________
733 GEN_HEAD_LOFIG
= HEAD_LOFIG
;
734 HEAD_LOFIG
= head_lofig
;
735 GEN_HT_LOFIG
= HT_LOFIG
;
742 subinst_t
*gns_GetCorrespondingInstance(char *name
)
744 return gen_GetCorrespondingInstance(name
, CUR_CORRESP_TABLE
);
747 lotrs_list *gns_GetCorrespondingTransistor(char *name)
749 return gen_GetCorrespondingTransistor(name, CUR_CORRESP_TABLE);
752 losig_list
*gns_GetCorrespondingInstanceConnectorSignal(subinst_t
*subins
, char *name
)
754 loins_list
*loins_in_model
;
759 conname
=namealloc(gen_makesignalname(name
));
760 loins_in_model
=gen_findinstance(CUR_HIER_LOFIG
, subins
->INSNAME
);
761 if (loins_in_model
==NULL
) return NULL
;
762 for (lc
=loins_in_model
->LOCON
; lc
!=NULL
&& lc
->NAME
!=conname
; lc
=lc
->NEXT
) ;
763 if (lc
==NULL
) return NULL
;
764 ls
=gen_corresp_sig (gen_losigname(lc
->SIG
), CUR_CORRESP_TABLE
);
765 if (ls
==NULL
) return NULL
;
769 char *gns_GetCorrespondingInstanceName(subinst_t
*subins
)
771 return subins
->CRT
->GENIUS_INSNAME
;
774 char *gns_GetCorrespondingInstanceModelName(subinst_t
*subins
)
776 return subins
->CRT
->GENIUS_FIGNAME
;
779 chain_list *gns_GetAllCorrespondingInstances()
781 return dupchainlst(CUR_CORRESP_TABLE->SUBINSTS);
785 char *gen_change_hier_divider (char *name
, char divider
)
790 for (i
= 0; name
[i
] != '\0'; i
++) {
791 if (name
[i
] == SEPAR
)
799 return namealloc (buf
);
803 void gns_ChangeHierarchyDivider (lofig_list
*netlist
, char divider
)
808 for (pttrs
= netlist
->LOTRS
; pttrs
; pttrs
= pttrs
->NEXT
)
809 pttrs
->TRNAME
= gen_change_hier_divider (pttrs
->TRNAME
, divider
);
811 for (ptsig
= netlist
->LOSIG
; ptsig
; ptsig
= ptsig
->NEXT
)
812 ptsig
->NAMECHAIN
->DATA
= gen_change_hier_divider ((char*)ptsig
->NAMECHAIN
->DATA
, divider
);
815 int gns_GetGeneric(char *name
)
817 return gen_getvariable(name
);
820 char *gns_GetCurrentArchi()
822 return gen_getarchi();
825 char *gns_GetCurrentModel()
827 return gen_getmodel();
830 char *gns_GetCurrentInstance()
832 return gen_getinstancename();
836 void ASSOCIATE_BEHAVIOUR(void *func
)
838 APICallFunc
*cf
=(APICallFunc
*)func
;
840 HierLofigInfo
*hli
=gethierlofiginfo(CUR_HIER_LOFIG
);
842 if (hli
->BUILD_BEH
==NULL
)
844 // ajout a la lofig hierarchique de l'info
847 if (APIExecAPICallFunc(APIGetExecutionContext(), cf
, &ret
, 0)) EXIT(1);
855 APIFreeTARGS(cf
->ARGS
);
860 void *callfunc(char *funcname
, ...)
865 libgetargfunc_type libfunc
;
869 sprintf(fname
, "wrap_getargs_%s",funcname
);
871 libfunc
=(libgetargfunc_type
)GetDynamicFunction(fname
);
875 fprintf(stderr
,"callfunc: function '%s' can't be found in the dynamic libraries\n",fname
);
881 va_start(ap
, funcname
);
882 for (i
= 0; i
< nb
; i
++)
884 if (tab
[i
]->POINTER
>0)
886 if (tab
[i
]->POINTER
==1 && strcmp(tab
[i
]->TYPE
,"char")==0)
887 *(void **)tab
[i
]->VALUE
= sensitive_namealloc(va_arg(ap
, void *));
890 fprintf(stderr
,"callfunc: only 'char *' pointer type can be used in function call\n");
893 /**(void **)tab[i]->VALUE = sensitive_namealloc(va_arg(ap, void *));*/
896 if (strcmp(tab
[i
]->TYPE
,"char")==0)
897 *(char *)tab
[i
]->VALUE
= va_arg(ap
, int);
898 else if (strcmp(tab
[i
]->TYPE
,"int")==0)
899 *(int *)tab
[i
]->VALUE
= va_arg(ap
, int);
900 else if (strcmp(tab
[i
]->TYPE
,"long")==0)
901 *(long *)tab
[i
]->VALUE
= va_arg(ap
, long);
902 else if (strcmp(tab
[i
]->TYPE
,"double")==0)
903 *(double *)tab
[i
]->VALUE
= va_arg(ap
, double);
907 acf
=(APICallFunc
*)mbkalloc(sizeof(APICallFunc
));
908 acf
->NAME
=sensitive_namealloc(funcname
);
909 acf
->ARGS
=APIPrepareFunctionARGS(NULL
, tab
, nb
, NULL
);
913 void *callfunc_tcl(char *funcname
, chain_list
*args
)
915 int i
, nb
=countchain(args
);
920 acf
=(APICallFunc
*)mbkalloc(sizeof(APICallFunc
));
921 acf
->NAME
=sensitive_namealloc(funcname
);
926 tab
=mbkalloc(sizeof (t_arg
*)*nb
);
927 for (i
= 0, cl
=args
; i
< nb
; i
++, cl
=cl
->NEXT
)
929 sprintf(buf
,"arg%d",i
);
930 tab
[i
]=APINewTARG("char", 1, namealloc(buf
));
931 *(void **)tab
[i
]->VALUE
= sensitive_namealloc((char *)cl
->DATA
);
933 acf
->ARGS
=APIPrepareFunctionARGS(NULL
, tab
, nb
, NULL
);
939 void gns_DriveSpiceNetlistGroup(chain_list
*cl
, char *filename
)
942 char oldSPI_VECTOR
[64];
945 strcpy(oldSPI_VECTOR
, SPI_VECTOR
);
946 strcpy(SPI_VECTOR
, "[]");
951 if ((f
=mbkfopen(filename
, NULL
, WRITE_TEXT
))!=NULL
)
953 sprintf(temp
,"'%s'", filename
);
954 spiceprintdate(temp
, f
);
955 spicesavelofigsinfile(cl
, f
);
958 fprintf(stderr
, "could not openfile '%s'\n", filename
);
961 strcpy(SPI_VECTOR
, oldSPI_VECTOR
);
966 if (CUR_CORRESP_TABLE
->FLAGS
& LOINS_IS_TOPLEVEL
) return 1;
970 char *_equiv(char *name
)
972 template_corresp
*tc
;
975 tc
=gen_get_template_corresp(GNS_TEMPLATE_HT
, CUR_CORRESP_TABLE
->FIGNAME
);
978 if (gen_find_template_corresp(GNS_TEMPLATE_HT
, tc
->defines
, name
, res
)==0)
979 return namealloc(res
);
983 if (c
==NULL
) return namealloc(name
);
984 return namealloc(c
+1);
987 void gns_REJECT_INSTANCE()
992 curins
=gns_GetCurrentInstance();
993 if ((k
=gethtitem(LOINS_LIST_CONTROL
, curins
))==EMPTYHT
) k
=0;
995 addhtitem(LOINS_LIST_CONTROL
, curins
, k
);
998 void gns_KEEP_INSTANCE()
1003 curins
=gns_GetCurrentInstance();
1004 if ((k
=gethtitem(LOINS_LIST_CONTROL
, curins
))==EMPTYHT
) k
=0;
1006 addhtitem(LOINS_LIST_CONTROL
, curins
, k
);
1009 void gns_REJECT_MODEL()
1014 curmodel
=gns_GetCurrentModel();
1015 if ((k
=gethtitem(LOINS_LIST_CONTROL
, curmodel
))==EMPTYHT
) k
=0;
1017 addhtitem(LOINS_LIST_CONTROL
, curmodel
, k
);
1020 void gns_KEEP_MODEL()
1025 curmodel
=gns_GetCurrentModel();
1026 if ((k
=gethtitem(LOINS_LIST_CONTROL
, curmodel
))==EMPTYHT
) k
=0;
1028 addhtitem(LOINS_LIST_CONTROL
, curmodel
, k
);
1031 char *gns_GetWorkingFigureName()
1033 return LATEST_GNS_RUN
->FIGNAME
;
1036 int gns_IsVss(losig_list
*sig
)
1038 return mbk_LosigIsVSS(sig
);
1041 int gns_IsVdd(losig_list
*sig
)
1043 return mbk_LosigIsVDD(sig
);
1046 int gns_IsBlackBox()
1048 return (CUR_CORRESP_TABLE
->FLAGS
& LOINS_IS_BLACKBOX
)!=0;