14 #define API_USE_REAL_TYPES
17 #define AVTWIG_AVOID_CONFLICT
21 static ht
*BEG_MODELHT
= NULL
;
23 static char *BEGAPI_PREFIX
= NULL
;
24 static int BEGAPI_INDEX
= -1;
25 static int BEG_TRACE
= 0;
26 static befig_list
*BEGAPI_BEFIG
= NULL
;
27 static ht
*BEGAPI_DONEHT
= NULL
;
29 static int BEGAPI_USEFILES
= 0;
31 static int BEGAPI_DRIVE_CORRESP
;
32 static int BEGAPI_DRIVE_ALL_BEH
;
33 static ht
*BEGAPI_MODELTABLE
= NULL
;
35 static int DEACTIVATE_BEG
= 0, BEG_QUICK_MODE
=1;
36 static char *BEG_FORCED_NAME
=NULL
;
37 static chain_list
*RECUR_STACK
=NULL
;
38 void begRenameSignalsFromModel();
39 static void begAutoCreateCorrespOnBlackbox(befig_list
*bf
, lofig_list
*lf
);
41 #include "beg_API_correspondance.h"
44 static long getbiablflag(long val
)
47 if (val
& 2) nval
|=BEH_CND_WEAK
;
48 if (val
& 4) nval
|=BEH_CND_STRONG
;
49 if (val
& 8) nval
|=BEH_CND_PULL
;
53 static long getsigflag(long val
)
56 if (val
& 1) nval
|=BEH_FLAG_NORMAL
;
60 /**************************************************************************************/
62 void beg_API_AtLoad_Initialize() // commentaire pour desactiver l'ajout de token
66 if (V_BOOL_TAB
[__API_DRIVE_CORRESP
].VALUE
)
68 mbv_useAdvancedNameAllocator();
69 begInitCorrespondance();
70 BEGAPI_DRIVE_CORRESP
= 1;
73 BEGAPI_DRIVE_CORRESP
= 0;
75 str
= V_STR_TAB
[__API_DRIVE_ALL_BEH
].VALUE
;
76 if (str
&& !strcasecmp(str
,"yes"))
77 BEGAPI_DRIVE_ALL_BEH
= 1;
78 else if (str
&& !strcasecmp(str
,"onlymodel"))
80 BEGAPI_DRIVE_ALL_BEH
= 1;
81 BEGAPI_MODELTABLE
= addht(50);
84 BEGAPI_DRIVE_ALL_BEH
= 0;
87 /**************************************************************************************/
90 beg_API_Action_Initialize() // commentaire pour desactiver l'ajout de token
92 BEG_FORCED_NAME
= NULL
;
97 void beg_API_TopLevel(long list
) // commentaire pour desactiver l'ajout de token
104 res
=check_instances_connections(GENIUS_GLOBAL_LOFIG
, buf
);
107 avt_error("begapi", 1, AVT_WAR,
108 "Functional errors could appear if using the beg_API\n"
113 DEACTIVATE_BEG
=(long)RECUR_STACK
->DATA
; RECUR_STACK
=delchain(RECUR_STACK
, RECUR_STACK
);
114 BEG_FORCED_NAME
= (char *)RECUR_STACK
->DATA
; RECUR_STACK
=delchain(RECUR_STACK
, RECUR_STACK
);
118 beg_API_Action_Terminate() // commentaire pour desactiver l'ajout de token
123 /**************************************************************************************/
126 beg_API_Restart() // commentaire pour desactiver l'ajout de token
128 chain_list
*ptchain
, *refchain
;
131 RECUR_STACK
=addchain(RECUR_STACK
, BEG_FORCED_NAME
);
132 RECUR_STACK
=addchain(RECUR_STACK
, (void *)(long)DEACTIVATE_BEG
);
134 if (BEG_MODELHT
!= NULL
) {
139 if (BEGAPI_INTVARLIST
!= NULL
) {
140 for (ptchain
= BEGAPI_INTVARLIST
; ptchain
; ptchain
= ptchain
->NEXT
) {
141 varname
= (char *)ptchain
->DATA
;
142 refchain
= (chain_list
*)gethtitem(BEGAPI_INTVARHT
, varname
);
145 freechain(BEGAPI_INTVARLIST
);
146 BEGAPI_INTVARLIST
= NULL
;
147 delht(BEGAPI_INTVARHT
);
148 BEGAPI_INTVARHT
= NULL
;
153 /**************************************************************************************/
155 static befig_list
* begGetModel(char *name
)
157 befig_list
*ptbefig
= NULL
;
159 if (BEG_MODELHT
!= NULL
) {
160 ptbefig
= (befig_list
*)gethtitem(BEG_MODELHT
, name
);
161 if (ptbefig
== (befig_list
*)EMPTYHT
) ptbefig
= NULL
;
166 /**************************************************************************************/
168 static int BEG_CHECK_EXISTENCE(char *name
)
171 if (begGetModel(namealloc(name
))!=NULL
)
175 return DEACTIVATE_BEG
;
178 befig_list
*begModelToInstance(char *instance
, char *model
)
180 befig_list
*ptinsbefig
;
182 ptinsbefig
= begGetModel(instance
);
183 if (ptinsbefig
== NULL
)
185 ptinsbefig
= begGetModel(model
);
186 if (ptinsbefig
!= NULL
)
188 ptinsbefig
= beg_duplicate(ptinsbefig
, instance
);
194 static char *_BegGetName()
196 if (BEG_FORCED_NAME
!=NULL
) return BEG_FORCED_NAME
;
198 return gns_GetCurrentInstance();
200 return gns_GetCurrentModel();
203 /**************************************************************************************/
206 begRefDriver(char *varname
, biabl_list
*ptdriver
)
208 chain_list
*varchain
;
209 ptdriver
->TIMEVAR
=namealloc(varname
);
211 if (BEGAPI_INTVARHT
== NULL
) BEGAPI_INTVARHT
= addht(20);
212 if ((varchain
= (chain_list
*)gethtitem(BEGAPI_INTVARHT
, namealloc(varname
))) != (void *)EMPTYHT
) {
213 varchain
= addchain(varchain
, ptdriver
);
214 sethtitem(BEGAPI_INTVARHT
, namealloc(varname
), (long)varchain
);
217 addhtitem(BEGAPI_INTVARHT
, namealloc(varname
), (long)addchain(NULL
, ptdriver
));
218 BEGAPI_INTVARLIST
= addchain(BEGAPI_INTVARLIST
, namealloc(varname
));
223 /**************************************************************************************/
226 begRadical(char *name
)
232 if ((pt
= strchr(buf
, ' ')) != NULL
) *pt
= 0;
233 return namealloc(buf
);
236 /**************************************************************************************/
239 begTranslate(BEG_OBJ ptbegobj
, BEG_OBJ ptportobj
, int shift
, char *name
)
241 vectbiabl_list
*ptvecbiabl
;
246 if (ptbegobj
&& gethtitem(BEGAPI_DONEHT
, ptbegobj
) == EMPTYHT
) {
247 addhtitem(BEGAPI_DONEHT
, ptbegobj
, 0);
248 ptvecbiabl
= beg_getVectBiabl(ptbegobj
);
249 beg_newLeft(ptbegobj
, beg_getLeft(ptbegobj
)+shift
);
250 beg_newRight(ptbegobj
, beg_getRight(ptbegobj
)+shift
);
251 for (;ptvecbiabl
; ptvecbiabl
= ptvecbiabl
->NEXT
) {
252 if (ptvecbiabl
->LEFT
>= 0) ptvecbiabl
->LEFT
+= shift
;
253 if (ptvecbiabl
->RIGHT
>= 0) ptvecbiabl
->RIGHT
+= shift
;
254 for (ptbiabl
= ptvecbiabl
->BIABL
; ptbiabl
; ptbiabl
= ptbiabl
->NEXT
) {
255 ptloop
= beh_getloop(ptbiabl
);
256 for (;ptloop
; ptloop
= ptloop
->NEXT
) {
257 if (ptloop
->INDEX
!= NULL
) {
258 ptloop
->INDEX
= shiftExprStr(ptloop
->INDEX
, shift
);
264 if (ptportobj
&& gethtitem(BEGAPI_DONEHT
, ptportobj
) == EMPTYHT
) {
265 addhtitem(BEGAPI_DONEHT
, ptportobj
, 0);
266 ptvecbiabl
= beg_getVectBiabl(ptportobj
);
267 beg_newLeft(ptportobj
, beg_getLeft(ptportobj
)+shift
);
268 beg_newRight(ptportobj
, beg_getRight(ptportobj
)+shift
);
269 for (;ptvecbiabl
; ptvecbiabl
= ptvecbiabl
->NEXT
) {
270 if (ptvecbiabl
->LEFT
>= 0) ptvecbiabl
->LEFT
+= shift
;
271 if (ptvecbiabl
->RIGHT
>= 0) ptvecbiabl
->RIGHT
+= shift
;
272 for (ptbiabl
= ptvecbiabl
->BIABL
; ptbiabl
; ptbiabl
= ptbiabl
->NEXT
) {
273 ptloop
= beh_getloop(ptbiabl
);
274 for (;ptloop
; ptloop
= ptloop
->NEXT
) {
275 if (ptloop
->INDEX
!= NULL
) {
276 ptloop
->INDEX
= shiftExprStr(ptloop
->INDEX
, shift
);
282 ptberin
= beg_getBerinByName(BEGAPI_BEFIG
, name
);
283 if (ptberin
&& gethtitem(BEGAPI_DONEHT
, ptberin
) == EMPTYHT
) {
284 addhtitem(BEGAPI_DONEHT
, ptberin
, 0);
285 ptberin
->LEFT
+= shift
;
286 ptberin
->RIGHT
+= shift
;
290 /**************************************************************************************/
299 begNameWrap(char *name
)
306 if (strncasecmp(name
,"ext@",4)==0) return name
;
309 if (strchr(name
, ' ') == NULL
) {
310 ptbegobj
= beg_getObjByName(BEGAPI_BEFIG
, name
, &ptportobj
);
311 if (((ptbegobj
!= NULL
&& beg_isVect(ptbegobj
)) || (ptportobj
!= NULL
&& beg_isVect(ptportobj
))) && BEGAPI_INDEX
>= 0) {
312 if (ptbegobj
) shift
= BEGAPI_INDEX
* (abs(beg_getLeft(ptbegobj
) - beg_getRight(ptbegobj
)) + 1);
313 else shift
= BEGAPI_INDEX
* (abs(beg_getLeft(ptportobj
) - beg_getRight(ptportobj
)) + 1);
314 if (shift
> 0) begTranslate(ptbegobj
, ptportobj
, shift
, name
);
315 sprintf(buf
, "%s.%s", BEGAPI_PREFIX
, name
);
316 return namealloc(buf
);
319 if (ptbegobj
== NULL
&& ptportobj
== NULL
&& name
!= BEGAPI_BEFIG
->NAME
) {
320 avt_errmsg(BEG_API_ERRMSG
, "001", AVT_WARNING
, name
, BEGAPI_BEFIG
->NAME
);
321 // avt_error("begapi", 1, AVT_WAR, "name '%s' does not exist in figure '%s'\n", name, BEGAPI_BEFIG->NAME);
323 if (BEGAPI_INDEX
>= 0) {
324 sprintf(buf
, "%s.%s %d", BEGAPI_PREFIX
, name
, BEGAPI_INDEX
);
327 sprintf(buf
, "%s.%s", BEGAPI_PREFIX
, name
);
329 return namealloc(buf
);
333 if (BEGAPI_INDEX
>= 0) {
334 sprintf(buf
, "%s.%s", BEGAPI_PREFIX
, name
);
335 ptbegobj
= beg_getObjByName(BEGAPI_BEFIG
, begRadical(name
), &ptportobj
);
336 if (ptbegobj
!= NULL
|| ptportobj
!= NULL
) {
337 if (ptbegobj
) shift
= BEGAPI_INDEX
* (abs(beg_getLeft(ptbegobj
) - beg_getRight(ptbegobj
)) + 1);
338 else shift
= BEGAPI_INDEX
* (abs(beg_getLeft(ptportobj
) - beg_getRight(ptportobj
)) + 1);
339 if (shift
> 0) return renameVectAtom(buf
, NULL
, shift
);
341 else if (ptbegobj
== NULL
&& ptportobj
== NULL
&& name
!= BEGAPI_BEFIG
->NAME
) {
342 avt_errmsg(BEG_API_ERRMSG
, "001", AVT_WARNING
, name
, BEGAPI_BEFIG
->NAME
);
343 // avt_error("begapi", 1, AVT_WAR, "name '%s' does not exist in figure '%s'\n", name, BEGAPI_BEFIG->NAME);
345 return namealloc(buf
);
348 sprintf(buf
, "%s.%s", BEGAPI_PREFIX
, name
);
349 return namealloc(buf
);
354 static inline int inrange(int num
, int left
, int right
)
356 if (left
<right
&& num
>=left
&& num
<=right
)
358 else if (left
>=right
&& num
>=right
&& num
<=left
)
363 static void begAutoCreateCorrespOnBlackbox(befig_list
*bf
, lofig_list
*lf
)
372 if (BEGAPI_DRIVE_CORRESP
)
374 corresp_ht
= begGetCorrespHTCreate(gns_GetCurrentInstance()/*bf->NAME*/);
376 for (ls
= lf
->LOSIG
; ls
!= NULL
; ls
= ls
->NEXT
)
378 name
= gen_losigname(ls
);
379 if (strchr(name
, ' ') == NULL
)
381 ptbegobj
= beg_getObjByName(bf
, name
, &ptportobj
);
382 if (ptbegobj
!= NULL
)
383 begAddCorrespName(corresp_ht
,name
, name
);
387 index
= vectorindex(name
);
388 ptbegobj
= beg_getObjByName(bf
,vectorradical(name
),&ptportobj
);
389 if (ptbegobj
!= NULL
&&
390 inrange(index
,beg_getLeft(ptbegobj
),beg_getRight(ptbegobj
)))
391 begAddCorrespName(corresp_ht
,name
,name
);
394 begUpdateCorresp(corresp_ht
);
398 /**************************************************************************************/
400 befig_list
*begLoadBefig(char *name
)
402 name
= NULL
; // WARNING PREVENTION
407 /**************************************************************************************/
413 char *name
, *insname
;
417 if (BEGAPI_DRIVE_CORRESP)
419 insname=gns_GetCurrentInstance();
422 if ((ptbefig = begGetModel(insname))==NULL)
423 if ((ptbefig = begGetModel(name))==NULL)
424 ptbefig = beg_get_befig(BEG_NOVERIF);
425 bvl_drivecorresp(insname, ptbefig);
429 if (DEACTIVATE_BEG
) return;
431 ptbefig
= beg_get_befig(BEG_NOVERIF
);
432 if (ptbefig
!= NULL
) savebefig(ptbefig
, 0);
435 /**************************************************************************************/
437 static void _begKeepModel(int mode
)
442 if (BEGAPI_DRIVE_ALL_BEH
)
444 if (!BEGAPI_MODELTABLE
)
446 else if (gethtitem(BEGAPI_MODELTABLE
,CUR_CORRESP_TABLE
->GENIUS_FIGNAME
)
449 addhtitem(BEGAPI_MODELTABLE
,CUR_CORRESP_TABLE
->GENIUS_FIGNAME
,0);
456 ptbefig
= beg_get_befig(BEG_NOVERIF
);
458 if (BEG_MODELHT
== NULL
)
459 BEG_MODELHT
= addht(20);
460 addhtitem(BEG_MODELHT
,ptbefig
->NAME
,(long)ptbefig
);
463 if (mode
==1 && CUR_CORRESP_TABLE
->FLAGS
& LOINS_IS_BLACKBOX
)
465 lf
= gns_GetBlackboxNetlist(CUR_CORRESP_TABLE
->GENIUS_FIGNAME
);
466 begAutoCreateCorrespOnBlackbox(ptbefig
, lf
);
469 if (gns_IsTopLevel())
470 begRenameSignalsFromModel();
480 /**************************************************************************************/
482 /**************************************************************************************/
485 begDestroyModel(void)
487 if (DEACTIVATE_BEG
) return;
491 /**************************************************************************************/
494 begVectorize(char *radical
, int index
)
498 sprintf(temp
, "%s(%d)", radical
, index
);
499 return namealloc(temp
);
502 /**************************************************************************************/
505 begVarVectorize(char *radical
, char *var
)
509 sprintf(temp
, "%s(%s)", radical
, var
);
510 return namealloc(temp
);
513 /**************************************************************************************/
516 begVectorRange(char *radical
, int left
, int right
)
520 sprintf(temp
, "%s(%d:%d)", radical
, left
, right
);
521 return namealloc(temp
);
524 /**************************************************************************************/
527 begCreateModel(char *name
)
529 if (BEG_CHECK_EXISTENCE(name
)) return;
530 BEG_FORCED_NAME
=namealloc(name
);
534 /**************************************************************************************/
537 begCreatePort(char *name
, char direction
)
539 if (DEACTIVATE_BEG
) return;
540 beg_def_por(name
, direction
);
543 /**************************************************************************************/
546 begCreateModelFromConnectors(char *name
, chain_list
*ptloconlist
)
551 chain_list
*ptprevchain
;
555 int left
, right
, index
;
558 if (BEG_CHECK_EXISTENCE(name
) && BEGAPI_DRIVE_CORRESP
==0) return;
561 fprintf (stdout
, "\nbegCreateModelFromConnectors ('%s')\n", name
);
565 if ((ptbefig
= beg_get_befigByName(name
))!=NULL
)
566 beg_delBefig(ptbefig
);
568 ptbefig
= beg_get_befig(BEG_NOVERIF
);
571 if (BEGAPI_DRIVE_CORRESP
)
572 corresp_ht
= begGetCorrespHTCreate(gns_GetCurrentInstance()/*ptbefig->NAME*/);
576 for (ptchain
= ptloconlist
; ptchain
; ptchain
= ptchain
->NEXT
) {
577 ptlocon
= (locon_list
*)ptchain
->DATA
;
578 if ((index
= vectorindex(ptlocon
->NAME
)) == -1) {
579 gns_GetModelSignalRange(ptlocon
->NAME
, &left
, &right
);
582 sprintf(temp
,"%s(%d:%d)",ptlocon
->NAME
,left
,right
);
583 begTraceAndCorresp(corresp_ht
,ptlocon
->NAME
,left
,right
,
584 BEG_TRACE
,BEGAPI_DRIVE_CORRESP
);
588 sprintf(temp
, "%s", ptlocon
->NAME
);
589 begTraceAndCorresp(corresp_ht
,ptlocon
->NAME
,-1,-1,
590 BEG_TRACE
,BEGAPI_DRIVE_CORRESP
);
595 ptprevchain
= ptchain
;
596 basename
= vectorradical(ptlocon
->NAME
);
599 for (; ptchain
; ptchain
= ptchain
->NEXT
)
601 ptlocon
= (locon_list
*)ptchain
->DATA
;
602 if (vectorradical(ptlocon
->NAME
) != basename
)
604 right
= vectorindex(ptlocon
->NAME
);
605 ptprevchain
= ptchain
;
606 begTraceAndCorresp(corresp_ht
,vectorradical(ptlocon
->NAME
),
608 BEG_TRACE
,BEGAPI_DRIVE_CORRESP
);
610 ptchain
= ptprevchain
;
611 sprintf(temp
, "%s(%d:%d)", basename
, left
, right
);
614 if (ptlocon
->DIRECTION
== 'D' || ptlocon
->DIRECTION
== 'S')
617 direction
= ptlocon
->DIRECTION
;
620 beg_def_por(namealloc(temp
), direction
);
622 if (BEGAPI_DRIVE_CORRESP
) {
623 for (ptchain
= ptloconlist
; ptchain
; ptchain
= ptchain
->NEXT
) {
624 ptlocon
= (locon_list
*)ptchain
->DATA
;
625 begAddCorresp(gns_GetCurrentInstance(), ptlocon
->NAME
);
630 /**************************************************************************************/
632 void begCreateModelInterface(char *name
)
634 chain_list
*connectors
;
636 if (BEG_CHECK_EXISTENCE(name
)==0)
638 begCreateModel(name
);
640 connectors
= gns_GetModelConnectorList();
641 begCreateModelFromConnectors(name
, connectors
);
642 freechain(connectors
);
646 void begCreateInterface()
648 chain_list
*connectors
;
652 connectors
= gns_GetModelConnectorList();
653 begCreateModelFromConnectors(name
, connectors
);
654 freechain(connectors
);
657 /**************************************************************************************/
660 begAddInstanceModel(loins_list
*instance
, ht
*corTbl
)
666 bevectpor_list
*ptbevectpor
;
667 lofig_list
*pthierlofig
;
670 int left
, right
, shift
;
674 chain_list
*before_change
, *after_change
;
676 ht
*corTblIns
= NULL
;
677 CorrespondingInstance
*ci
;
679 if (DEACTIVATE_BEG
&& BEGAPI_DRIVE_CORRESP
==0) return;
681 ci
=gns_GetCorrespondingInstance(instance
->INSNAME
);
682 insname
= gns_GetCorrespondingInstanceName(ci
);
683 befig
= begModelToInstance(insname
, ci
->CRT
->GENIUS_FIGNAME
);
686 fprintf(stderr
,"%s: BegApi: Model for instance '%s' does not exist\n", gen_info(), insname
);
690 corTblIns
= begGetCorrespHT(befig
->NAME
);
692 if ((ptype = getptype (befig->USER, BEG_CORRESP_PTYPE)))
693 corTblIns = (ht*)((chain_list*)ptype->DATA)->DATA;
695 pthierlofig
= CUR_HIER_LOFIG
; //gns_GetNetlist();
696 if (befig
== NULL
&& BEGAPI_USEFILES
)
698 befig
= begLoadBefig(instance
->FIGNAME
);
700 befig
->NAME
= insname
;
702 BEGAPI_BEFIG
= befig
;
703 BEGAPI_INDEX
= gns_GetInstanceLoopIndex(instance
, &BEGAPI_PREFIX
);
704 if (BEGAPI_INDEX
!= -1)
706 gns_GetInstanceLoopRange(pthierlofig
, instance
, &left
, &right
);
707 if (left
!= -1 && left
== right
)
712 BEGAPI_PREFIX
= instance
->INSNAME
;
720 for (ptbepor
= befig
->BEPOR
; ptbepor
; ptbepor
= ptbepor
->NEXT
)
722 ptlocon
= gns_GetInstanceConnector(instance
, ptbepor
->NAME
);
723 addhtitem(loconht
, ptbepor
, (long)ptlocon
);
725 for (ptbevectpor
= befig
->BEVECTPOR
; ptbevectpor
; ptbevectpor
= ptbevectpor
->NEXT
)
727 ptlocon
= gns_GetInstanceConnector(instance
, gns_Vectorize(ptbevectpor
->NAME
, ptbevectpor
->LEFT
));
728 addhtitem(loconht
, ptbevectpor
, (long)ptlocon
);
731 /* prefix internal nodes with instance name and rename ports according to rule port map */
733 if (BEGAPI_DRIVE_CORRESP
) /* trace changes */
734 before_change
= begGetNames(befig
);
736 before_change
= NULL
;
738 BEGAPI_DONEHT
= addht(40);
739 beh_namewrap(befig
,begNameWrap
);
740 delht(BEGAPI_DONEHT
);
741 BEGAPI_DONEHT
= NULL
;
743 for (ptberin
= befig
->BERIN
; ptberin
; ptberin
= ptberin
->NEXT
)
744 addhtitem(berinht
,ptberin
->NAME
,(long)ptberin
);
746 for (ptbepor
= befig
->BEPOR
; ptbepor
; ptbepor
= ptbepor
->NEXT
)
748 if (!(ptlocon
= (locon_list
*)gethtitem(loconht
, ptbepor
)))
752 sscanf(ptbepor
->NAME
,"%*[^.].%s",buf
);
753 newname
= namealloc(buf
);
756 newname
= (char *)ptlocon
->SIG
->NAMECHAIN
->DATA
;
757 ptberin
= (berin_list
*)gethtitem(berinht
, ptbepor
->NAME
);
758 if (ptberin
== (berin_list
*)EMPTYHT
)
760 beh_renameport(befig
,ptbepor
,ptberin
,newname
);
763 for (ptbevectpor
= befig
->BEVECTPOR
; ptbevectpor
; ptbevectpor
= ptbevectpor
->NEXT
)
765 left
= ptbevectpor
->LEFT
;
766 ptlocon
= (locon_list
*)gethtitem(loconht
, ptbevectpor
);
767 leftsigname
= (char *)ptlocon
->SIG
->NAMECHAIN
->DATA
;
768 shift
= vectorindex(leftsigname
) - left
;
769 ptberin
= (berin_list
*)gethtitem(berinht
, ptbevectpor
->NAME
);
770 if (ptberin
== (berin_list
*)EMPTYHT
)
772 newname
= vectorradical(leftsigname
);
773 beh_renamevectport(befig
, ptbevectpor
, ptberin
, newname
, shift
);
776 if (BEGAPI_DRIVE_CORRESP
)
778 after_change
= begGetNames(befig
);
780 begUpdateChanges(corTblIns
,corTbl
,before_change
,after_change
);
782 avt_errmsg(BEG_API_ERRMSG
, "002", AVT_WARNING
, insname
);
783 // avt_error("begapi", 6, AVT_WAR,"could not find correspondance for instance '%s'\n",insname);
784 before_change
= NULL
;
792 mbv_freeht(corTblIns
); //delht(corTblIns);
793 begGetCorrespHTUnlink(befig
->NAME
);
796 befig->USER = delptype(befig->USER,BEG_CORRESP_PTYPE);
798 freechain(before_change
);
799 freechain(after_change
);
801 /* merge into figure under construction */
803 beg_eat_figure(befig
);
811 /*}}}************************************************************************/
815 /****************************************************************************/
816 static void addInstance(loins_list
*loins
, ht
*corht
, ht
*fight
, ht
*sight
)
818 // in this case fight and sight are unused and should be NULL so
821 begAddInstanceModel(loins
,corht
);
824 /*}}}************************************************************************/
828 /****************************************************************************/
829 void begAddAllInstanceModels(int compact
)
831 lofig_list
*hierlofig
;
834 char *name
, *insname
;
836 if (DEACTIVATE_BEG
&& BEGAPI_DRIVE_CORRESP
==0) return;
839 mode
|=DISABLE_CREATE_BEH
;
841 if (BEGAPI_DRIVE_CORRESP
==0)
842 mode
|=DISABLE_CREATE_COR
;
845 mode
|=DISABLE_COMPACT
;
848 if ((befig
= begGetModel(name
))==NULL
)
849 befig
= beg_get_befig(BEG_NOVERIF
);
851 hierlofig
= CUR_HIER_LOFIG
; //gns_GetNetlist();
852 // befig = beg_get_befig(BEG_NOVERIF);
853 beg_addAllInstances(gns_GetCurrentInstance(), befig
,hierlofig
->LOINS
,NULL
,NULL
,mode
,addInstance
);
856 /*}}}************************************************************************/
860 /****************************************************************************/
861 char *createName(char *name
, int i
, char *prefix
)
865 if (strncasecmp(name
,"ext@",4)==0) return namealloc(name
);
868 sprintf(buf
,"%s.%s %d",prefix
,name
,i
);
870 sprintf(buf
,"%s.%s",prefix
,name
);
872 sprintf(buf
,"%s %d",name
,i
);
874 sprintf(buf
,"%s",name
);
876 return namealloc(buf
);
879 /*}}}************************************************************************/
883 /****************************************************************************/
884 static void putCorList4Yagle(befig_list
*befig
, char *prefix
)
888 char *unprefixed_name
, *model_name
, *circuit_name
;
889 int left
, right
, inc
, i
;
890 chain_list
*loconlist
, *chainx
;
893 loconlist
= gns_GetModelConnectorList();
895 for (chainx
= loconlist
; chainx
; chainx
= chainx
->NEXT
)
897 locon
= (locon_list
*)chainx
->DATA
;
898 gns_GetModelSignalRange(locon
->NAME
,&left
,&right
);
901 inc
= (right
>= left
) ? 1 : -1;
902 for (i
= left
; i
!= right
+inc
; i
+= inc
)
904 unprefixed_name
= createName(locon
->NAME
,i
,NULL
);
906 sig
= gns_GetCorrespondingSignal(unprefixed_name
);
908 model_name
= createName(locon
->NAME
,i
,prefix
);
910 model_name
= unprefixed_name
;
912 circuit_name
= sig
->NAMECHAIN
->DATA
;
913 renamed
= addptype(renamed
,(long)model_name
,circuit_name
);
918 sig
= gns_GetCorrespondingSignal(locon
->NAME
);
920 model_name
= createName(locon
->NAME
,-1,prefix
);
922 model_name
= locon
->NAME
;
924 circuit_name
= sig
->NAMECHAIN
->DATA
;
925 renamed
= addptype(renamed
,(long)model_name
,circuit_name
);
928 befig
->USER
= addptype(befig
->USER
,BEG_RENAME_LIST
,renamed
);
930 freechain(loconlist
);
933 /*}}}************************************************************************/
937 /****************************************************************************/
938 void begRenameSignalsFromModel(void)
940 chain_list
*before_change
, *after_change
;
944 ht
*corresp_ht
, *new_corresp_ht
;
946 ptbefig
= begModelToInstance(gns_GetCurrentInstance(),
947 gns_GetCurrentModel());
951 addhtitem(BEG_MODELHT
, ptbefig
->NAME
, (long)ptbefig
);
953 if (BEGAPI_DRIVE_CORRESP
)
955 corresp_ht
=begGetCorrespHT(ptbefig
->NAME
);
956 new_corresp_ht
= addht(BEGAPI_HT_BASE
);
957 begGetCorrespHTRelink(ptbefig
->NAME
, new_corresp_ht
);
958 /* if ((ptype = getptype(ptbefig->USER,BEG_CORRESP_PTYPE)))
960 corresp_ht = (ht*)((chain_list*)ptype->DATA)->DATA;
961 new_corresp_ht = addht(BEGAPI_HT_BASE);
962 ((chain_list*)ptype->DATA)->DATA = new_corresp_ht;
965 before_change
= begGetNames(ptbefig
);
970 prefix
= ptbefig
->NAME
;
971 BEGAPI_PREFIX
= prefix
;
973 BEGAPI_BEFIG
= ptbefig
;
974 beh_namewrap(ptbefig
,begNameWrap
);
975 ptbefig
->NAME
= prefix
;
978 if (BEGAPI_DRIVE_CORRESP
)
980 after_change
= begGetNames(ptbefig
);
981 begUpdateChanges(corresp_ht
,new_corresp_ht
,before_change
,after_change
);
982 before_change
= NULL
;
984 mbv_freeht(corresp_ht
); //delht(corresp_ht);
987 putCorList4Yagle(ptbefig
,prefix
);
990 /**************************************************************************************/
992 #define tops(x) (int)(x>=0.9?x+0.5:x*1e12+0.5)
994 begAssign_sub(char *name
, char *expr
, double delay
, double delayr
, double delayf
, char *delayvar
, int flags
)
996 delayvar
= NULL
; // WARNING PREVENTION
998 if (DEACTIVATE_BEG
&& BEGAPI_DRIVE_CORRESP
==0) return;
1001 fprintf(stdout
," signal %s <%s>\n",name
,
1002 gns_GetSignalName(gns_GetCorrespondingSignal(name
)));
1004 if (BEGAPI_DRIVE_CORRESP
)
1005 begAddCorresp(gns_GetCurrentInstance(), name
);
1007 if (!DEACTIVATE_BEG
)
1008 beg_def_sig(name
, expr
, tops(delay
),tops(delayr
),tops(delayf
), getbiablflag(flags
));
1011 begAssign(char *name
, char *expr
, int delay
, char *delayvar
)
1013 begAssign_sub(name
, expr
, delay
*1e-12, 0, 0, delayvar
, 0);
1016 /**************************************************************************************/
1019 begAddBusDriver_sub(char *name
, char *condition
, char *value
, double delay
, double delayr
, double delayf
, char *delayvar
, int flags
)
1021 biabl_list
*ptbiabl
;
1024 fprintf(stdout
, " signal %s <%s>\n",name
,
1025 gns_GetSignalName(gns_GetCorrespondingSignal(name
)));
1027 if (BEGAPI_DRIVE_CORRESP
)
1028 begAddCorresp(gns_GetCurrentInstance(), name
);
1030 if (DEACTIVATE_BEG
) return;
1032 ptbiabl
= beg_def_process(name
, condition
, value
, tops(delay
), tops(delayr
), tops(delayf
), BEG_BUS
,getsigflag(flags
)|BEH_FLAG_FORCEBUS
,getbiablflag(flags
));
1033 if (delayvar
!= NULL
&& strcmp(delayvar
,"NULL")!=0) {
1034 begRefDriver(delayvar
, ptbiabl
);
1036 /* biabl_list *ptbiabl;
1038 ptbiabl = beg_def_mux(name, condition, NULL, value, delay);
1039 if (delayvar != NULL) {
1040 begRefDriver(delayvar, ptbiabl);
1044 begAddBusDriver(char *name
, char *condition
, char *value
, int delay
, char *delayvar
)
1046 begAddBusDriver_sub(name
, condition
, value
, delay
*1e-12, 0, 0, delayvar
, 0);
1049 /**************************************************************************************/
1052 begAddBusElse_sub(char *name
, char *condition
, char *value
, double delay
, double delayr
, double delayf
, char *delayvar
, int flags
)
1054 biabl_list
*ptbiabl
;
1057 fprintf(stdout
, " signal %s <%s>\n",name
,
1058 gns_GetSignalName(gns_GetCorrespondingSignal(name
)));
1060 if (BEGAPI_DRIVE_CORRESP
)
1061 begAddCorresp(gns_GetCurrentInstance(), name
);
1063 if (DEACTIVATE_BEG
) return;
1065 ptbiabl
= beg_def_process(name
, condition
, value
, tops(delay
), tops(delayr
), tops(delayf
), BEG_BUS
|BEG_PRE
,getsigflag(flags
)|BEH_FLAG_FORCEBUS
,getbiablflag(flags
));
1066 if (delayvar
!= NULL
&& strcmp(delayvar
,"NULL")!=0) {
1067 begRefDriver(delayvar
, ptbiabl
);
1071 begAddBusElse(char *name
, char *condition
, char *value
, int delay
, char *delayvar
)
1073 begAddBusElse_sub(name
, condition
, value
, delay
*1e-12, 0, 0, delayvar
, 0);
1075 /**************************************************************************************/
1078 begAddSelectDriver(char *name
, char *select
, char *when
,char *value
, int delay
, char *delayvar
)
1080 biabl_list
*ptbiabl
;
1082 if (DEACTIVATE_BEG
) return;
1084 ptbiabl
= beg_def_mux(name
, select
, when
, value
, delay
,0,0);
1085 if (delayvar
!= NULL
&& strcmp(delayvar
,"NULL")!=0) {
1086 begRefDriver(delayvar
, ptbiabl
);
1090 /**************************************************************************************/
1092 begAddBusDriverLoop(char *name
, char *condition
, char *value
, char *loopvar
, int delay
, char *delayvar
)
1094 biabl_list
*ptbiabl
;
1096 if (DEACTIVATE_BEG
) return;
1098 ptbiabl
= beg_def_loop(name
, condition
, value
, loopvar
, delay
, 0,0,0);
1099 if (delayvar
!= NULL
&& strcmp(delayvar
,"NULL")!=0) {
1100 begRefDriver(delayvar
, ptbiabl
);
1104 /**************************************************************************************/
1106 begAddBusDriverDoubleLoop(char *name
, char *condition
, char *value
, char *loopvar1
, char *loopvar2
, int delay
, char *delayvar
)
1108 biabl_list
*ptbiabl
;
1110 if (DEACTIVATE_BEG
) return;
1112 ptbiabl
= beg_def_biloop(name
, condition
, value
, loopvar1
, loopvar2
, delay
, 0,0,0);
1113 if (delayvar
!= NULL
&& strcmp(delayvar
,"NULL")!=0) {
1114 begRefDriver(delayvar
, ptbiabl
);
1118 /**************************************************************************************/
1121 begAddMemDriver_sub(char *name
, char *condition
, char *value
, double delay
, double delayr
, double delayf
, char *delayvar
,int flags
)
1123 biabl_list
*ptbiabl
;
1126 fprintf(stdout
, " signal %s <%s>\n",name
,
1127 gns_GetSignalName(gns_GetCorrespondingSignal(name
)));
1129 if (BEGAPI_DRIVE_CORRESP
)
1130 begAddCorresp(gns_GetCurrentInstance(), name
);
1132 if (DEACTIVATE_BEG
) return;
1134 ptbiabl
= beg_def_process(name
, condition
, value
, tops(delay
), tops(delayr
), tops(delayf
), BEG_REG
,getsigflag(flags
),getbiablflag(flags
));
1135 if (delayvar
!= NULL
&& strcmp(delayvar
,"NULL")!=0) {
1136 begRefDriver(delayvar
, ptbiabl
);
1141 begAddMemDriver(char *name
, char *condition
, char *value
, int delay
, char *delayvar
)
1143 begAddMemDriver_sub(name
, condition
, value
, delay
*1e-12, 0, 0, delayvar
, 0);
1145 /**************************************************************************************/
1148 begAddMemDriverLoop(char *name
, char *condition
, char *value
, char *loopvar
, int delay
, char *delayvar
)
1150 biabl_list
*ptbiabl
;
1152 if (DEACTIVATE_BEG
) return;
1154 ptbiabl
= beg_def_loop(name
, condition
, value
, loopvar
, delay
, BEG_REG
,0,0);
1155 if (delayvar
!= NULL
&& strcmp(delayvar
,"NULL")!=0) {
1156 begRefDriver(delayvar
, ptbiabl
);
1160 /**************************************************************************************/
1163 begAddMemDriverDoubleLoop(char *name
, char *condition
, char *value
, char *loopvar1
, char *loopvar2
, int delay
, char *delayvar
)
1165 biabl_list
*ptbiabl
;
1167 if (DEACTIVATE_BEG
) return;
1169 ptbiabl
= beg_def_biloop(name
, condition
, value
, loopvar1
, loopvar2
, delay
, BEG_REG
,0,0);
1170 if (delayvar
!= NULL
&& strcmp(delayvar
,"NULL")!=0) {
1171 begRefDriver(delayvar
, ptbiabl
);
1175 /**************************************************************************************/
1178 begAddMemElse_sub(char *name
, char *condition
, char *value
, double delay
, double delayr
, double delayf
, char *delayvar
, int flags
)
1180 biabl_list
*ptbiabl
;
1183 fprintf(stdout
, " signal %s <%s>\n",name
,
1184 gns_GetSignalName(gns_GetCorrespondingSignal(name
)));
1186 if (BEGAPI_DRIVE_CORRESP
)
1187 begAddCorresp(gns_GetCurrentInstance(), name
);
1189 if (DEACTIVATE_BEG
) return;
1191 ptbiabl
= beg_def_process(name
, condition
, value
, tops(delay
), tops(delayr
), tops(delayf
), BEG_REG
|BEG_PRE
,getsigflag(flags
),getbiablflag(flags
));
1192 if (delayvar
!= NULL
&& strcmp(delayvar
,"NULL")!=0) {
1193 begRefDriver(delayvar
, ptbiabl
);
1198 begAddMemElse(char *name
, char *condition
, char *value
, int delay
, char *delayvar
)
1201 begAddMemElse_sub(name
, condition
, value
, delay
*1e-12, 0, 0, delayvar
, 0);
1203 /**************************************************************************************/
1206 begAddWarningCheck(char *testexpr
, char *message
)
1208 if (DEACTIVATE_BEG
) return;
1210 beg_assertion(testexpr
, message
, 'W', NULL
);
1213 /**************************************************************************************/
1216 begAddErrorCheck(char *testexpr
, char *message
)
1218 if (DEACTIVATE_BEG
) return;
1220 beg_assertion(testexpr
, message
, 'E', NULL
);
1223 /**************************************************************************************/
1228 if (DEACTIVATE_BEG
) return;
1233 /**************************************************************************************/
1238 chain_list
*ptchain
, *ptchain0
;
1239 chain_list
*refchain
, *newrefchain
;
1240 biabl_list
*ptdriver
;
1243 if (DEACTIVATE_BEG
) return;
1247 for (ptchain
= BEGAPI_INTVARLIST
; ptchain
; ptchain
= ptchain
->NEXT
) {
1248 varname
= (char *)ptchain
->DATA
;
1249 refchain
= (chain_list
*)gethtitem(BEGAPI_INTVARHT
, varname
);
1251 for (ptchain0
= refchain
; ptchain0
; ptchain0
= ptchain0
->NEXT
) {
1252 ptdriver
= (biabl_list
*)ptchain0
->DATA
;
1253 if (!beg_isDeletedBiabl(ptdriver
)) newrefchain
= addchain(newrefchain
, ptdriver
);
1255 freechain(refchain
);
1256 sethtitem(BEGAPI_INTVARHT
, varname
, (long)newrefchain
);
1261 /**************************************************************************************/
1264 begSetDelay(char *varname
, int value
)
1266 chain_list
*varchain
;
1267 biabl_list
*ptdriver
;
1269 if (DEACTIVATE_BEG
) return;
1271 if (BEH_TIMEVARS
==NULL
) BEH_TIMEVARS
=addht(32);
1272 if (value
<0) value
=0;
1273 addhtitem(BEH_TIMEVARS
, namealloc(varname
), (long)value
);
1276 if ((varchain
= (chain_list
*)gethtitem(BEGAPI_INTVARHT
, namealloc(varname
))) != (void *)EMPTYHT
) {
1277 for (;varchain
; varchain
= varchain
->NEXT
) {
1278 ptdriver
= (biabl_list
*)varchain
->DATA
;
1279 ptdriver
->TIME
= value
;
1283 avt_errmsg(BEG_API_ERRMSG
, "003", AVT_WARNING
, varname
);
1284 // avt_error("begapi", 2, AVT_WAR, "delay variable '%s' does not exist\n", varname);
1289 /**************************************************************************************/
1297 if (BEG_CHECK_EXISTENCE(name
)==0)
1299 begCreateModelInterface(name
);
1300 begAddAllInstanceModels(0);
1303 begAddAllInstanceModels(0);
1307 /**************************************************************************************/
1310 begBuildModelUsingFiles(char *name
)
1312 BEGAPI_USEFILES
= 1;
1313 begBuildModel(name
);
1314 BEGAPI_USEFILES
= 0;
1317 /**************************************************************************************/
1320 begBuildCompactModel()
1324 if (BEG_CHECK_EXISTENCE(name
)==0)
1326 begCreateModelInterface(name
);
1327 begAddAllInstanceModels(1);
1332 begAddAllInstanceModels(1);
1336 /**************************************************************************************/
1339 begBuildCompactModelUsingFiles(char *name
)
1341 BEGAPI_USEFILES
= 1;
1342 begBuildCompactModel(name
);
1343 BEGAPI_USEFILES
= 0;
1346 /**************************************************************************************/
1351 befig_list
*ptbefig
;
1352 char figname
[1024], *name
;
1354 if (DEACTIVATE_BEG
) return;
1356 ptbefig
= beg_get_befig(BEG_NOVERIF
);
1357 if (ptbefig
!= NULL
)
1359 name
= ptbefig
->NAME
;
1360 ptbefig
= beh_duplicate(ptbefig
);
1361 sprintf(figname
,"%s_duplicated",name
);
1362 ptbefig
->NAME
= namealloc(figname
);
1363 savebefig(ptbefig
, 0);
1365 beh_biterize(ptbefig
);
1366 sprintf(figname
,"%s_biterized",name
);
1367 ptbefig
->NAME
= namealloc(figname
);
1368 savebefig(ptbefig
, 0);
1370 beh_frebefig(ptbefig
);
1374 /**************************************************************************************/
1376 void begExport(char *name
)
1378 befig_list
*bf
, *bf0
;
1380 name
=namealloc(name
);
1382 if (begGetModel(name
)==NULL
) {
1383 bf0
=beg_get_befig(BEG_NOVERIF
);
1385 bf
=beh_duplicate(bf0
);
1386 if (BEGAPI_DRIVE_CORRESP
)
1387 begTransfertCorresp(name
, gns_GetCurrentInstance(), 0);
1390 // savebefig(bf, 0);
1391 addhtitem(BEG_MODELHT
, bf
->NAME
, (long)bf
);
1394 avt_errmsg(BEG_API_ERRMSG
, "004", AVT_WARNING
, name
);
1395 // avt_error("begapi", 5, AVT_WAR,"could not export behaviour '%s'. Current instance behaviour is not created yet\n",name);
1398 avt_errmsg(BEG_API_ERRMSG
, "005", AVT_WARNING
, name
);
1399 // avt_error("begapi", 4, AVT_WAR,"behaviour '%s' already exists\n",name);
1402 /**************************************************************************************/
1404 void begImport(char *name
)
1406 befig_list
*bf
, *bf0
;
1410 name
=namealloc(name
);
1411 mname
=_BegGetName();
1413 if (BEGAPI_DRIVE_CORRESP
)
1415 if (CUR_CORRESP_TABLE
->FLAGS
& LOINS_IS_BLACKBOX
) update
=1;
1416 begTransfertCorresp(gns_GetCurrentInstance(), name
, update
);
1419 if (BEG_CHECK_EXISTENCE(mname
))
1425 if ((bf0
=begGetModel(name
))!=NULL
)
1427 begCreateInterface();
1428 bf
=beh_duplicate(bf0
);
1429 // to avoid destruction of the model correspondance table
1430 bf
->NAME
=namealloc("temporary_figure_for_import");
1431 // savebefig(bf, 0);
1436 avt_errmsg(BEG_API_ERRMSG
, "006", AVT_WARNING
, name
);
1437 // avt_error("begapi", 3, AVT_WAR,"could not import behaviour '%s'. It does not exist\n",name);
1440 /**************************************************************************************/