Initial version of donated sources by Avertec, 3.4p5.
[tas-yagle.git] / distrib / sources / api / fcl / fcl_API.c
1 #include AVT_H
2 #include API_H
3 #include MUT_H
4 #include INF_H
5 #include YAG_H
6 #include INF_H
7 #include FCL_H
8 #include GEN_H
9
10 #define API_USE_REAL_TYPES
11 #include "gen_API.h"
12 #include "fcl_API.h"
13
14 static char *getwhere()
15 {
16 static char where[1024];
17 sprintf(where,"%s: ",gen_info());
18 return where;
19 }
20
21 int
22 fclMarkCorrespondingSignal(char *signame, char *marks)
23 {
24 ptype_list *ptuser;
25 losig_list *signal;
26 char *copymarks;
27 char *typeconst;
28 char *pttok;
29 void *ptr;
30 long type = 0;
31 int i;
32 inffig_list *ifl;
33
34 if ((ifl=getloadedinffig(gns_GetWorkingFigureName()))==NULL)
35 ifl=addinffig(gns_GetWorkingFigureName());
36
37 signal = gns_GetCorrespondingSignal(signame);
38 if (signal == NULL) return 0;
39 copymarks = mbkstrdup(marks);
40 ptr = copymarks;
41 while ((pttok = strtok(ptr, "+")) != NULL) {
42 ptr = NULL;
43 typeconst = min_namealloc(pttok);
44 for (i=0; i<NUMNETTYPES; i++) {
45 if (nettype_names[i] == typeconst) type |= nettype_values[i];
46 }
47 if (type == 0) {
48 avt_errmsg(FCL_API_ERRMSG, "001", AVT_ERROR, pttok);
49 //printf("fclMarkSignal: Illegal markings\n");
50 return 0;
51 }
52 }
53
54 if ((type & FCL_VSS) == FCL_VSS) signal->TYPE = CNS_SIGVSS;
55 if ((type & FCL_VDD) == FCL_VDD) signal->TYPE = CNS_SIGVDD;
56 if ((type & FCL_BYPASS) == FCL_BYPASS)
57 {
58 inf_AddString(ifl, INF_LOADED_LOCATION, signal->NAMECHAIN->DATA, INF_BYPASS, INF_ALL, getwhere());
59 //infAddList (ifl, INF_LOADED_LOCATION, signal->NAMECHAIN->DATA, INF_BYPASS, 'd',NULL, getwhere());
60 }
61 if ((ptuser = getptype(signal->USER, FCL_TRANSFER_PTYPE)) != NULL) {
62 ptuser->DATA = (void *)((long)ptuser->DATA | type);
63 }
64 else signal->USER = addptype(signal->USER, FCL_TRANSFER_PTYPE, (void *)type);
65 return 1;
66 }
67
68 int
69 fclMarkCorrespondingTransistor(char *transname, char *marks)
70 {
71 ptype_list *ptuser;
72 lotrs_list *transistor;
73 char *copymarks;
74 char *typeconst;
75 char *pttok;
76 void *ptr;
77 long type = 0;
78 int i;
79
80 transistor = gns_GetCorrespondingTransistor(transname);
81 if (transistor == NULL) {
82 avt_errmsg(FCL_API_ERRMSG, "002", AVT_ERROR, transname);
83 //printf("fclMarkTransistor: transistor '%s' does not exist\n", transname);
84 return 0;
85 }
86 copymarks = mbkstrdup(marks);
87 ptr = copymarks;
88 while ((pttok = strtok(ptr, "+")) != NULL) {
89 ptr = NULL;
90 typeconst = min_namealloc(pttok);
91 for (i=0; i<NUMTRANSTYPES; i++) {
92 if (transtype_names[i] == typeconst) type |= transtype_values[i];
93 }
94 if (type == 0) {
95 avt_errmsg(FCL_API_ERRMSG, "001", AVT_ERROR, pttok);
96 // printf("fclMarkTransistor: Illegal markings\n");
97 return 0;
98 }
99 }
100 if ((ptuser = getptype(transistor->USER, FCL_TRANSFER_PTYPE)) != NULL) {
101 ptuser->DATA = (void *)((long)ptuser->DATA | type);
102 }
103 else transistor->USER = addptype(transistor->USER, FCL_TRANSFER_PTYPE, (void *)type);
104 return 1;
105 }
106
107 void
108 fclOrientCorrespondingSignal(char *signame, int level)
109 {
110 ptype_list *ptuser;
111 losig_list *signal;
112 int oldlevel, newlevel;
113
114 signal = gns_GetCorrespondingSignal(signame);
115 if (signal == NULL) return;
116 ptuser = getptype(signal->USER, YAG_VAL_S_PTYPE);
117 if (ptuser != NULL) {
118 oldlevel = (unsigned int)((long)ptuser->DATA);
119 if (level > oldlevel) {
120 newlevel = level;
121 avt_errmsg(FCL_API_ERRMSG, "003", AVT_ERROR, signame, newlevel);
122 // printf("fclOrientSignal: multiple orientation on '%s', resolved to %u\n", signame, newlevel);
123 }
124 else newlevel = oldlevel;
125 ptuser->DATA = (void *)((long)newlevel);
126 }
127 else {
128 signal->USER = addptype(signal->USER, YAG_VAL_S_PTYPE, (void *)((long)level));
129 }
130 }
131
132 void
133 fclCmpUpConstraint(chain_list *siglist)
134 {
135 chain_list *ptchain;
136 chain_list *newchain = NULL;
137 losig_list *ptlosig;
138 inffig_list *ifl;
139
140 if ((ifl=getloadedinffig(gns_GetWorkingFigureName()))==NULL)
141 ifl=addinffig(gns_GetWorkingFigureName());
142
143 if (siglist == NULL) return;
144 for (ptchain = siglist; ptchain; ptchain = ptchain->NEXT) {
145 ptlosig = (losig_list *)ptchain->DATA;
146 newchain = addchain(newchain, ptlosig->NAMECHAIN->DATA);
147 }
148 inf_AddList(INF_FIG, INF_LOADED_LOCATION, INF_CMPU, "", newchain, getwhere());
149 // ifl->LOADED.INF_CMPU = addchain(ifl->LOADED.INF_CMPU, newchain);
150 }
151
152 void
153 fclCmpDnConstraint(chain_list *siglist)
154 {
155 chain_list *ptchain;
156 chain_list *newchain = NULL;
157 losig_list *ptlosig;
158 inffig_list *ifl;
159
160 if ((ifl=getloadedinffig(gns_GetWorkingFigureName()))==NULL)
161 ifl=addinffig(gns_GetWorkingFigureName());
162
163 if (siglist == NULL) return;
164 for (ptchain = siglist; ptchain; ptchain = ptchain->NEXT) {
165 ptlosig = (losig_list *)ptchain->DATA;
166 newchain = addchain(newchain, ptlosig->NAMECHAIN->DATA);
167 }
168 inf_AddList(INF_FIG, INF_LOADED_LOCATION, INF_CMPD, "", newchain, getwhere());
169 // ifl->LOADED.INF_CMPD = addchain(ifl->LOADED.INF_CMPD, newchain);
170 }
171
172 void
173 fclMuxUpConstraint(chain_list *siglist)
174 {
175 chain_list *ptchain;
176 chain_list *newchain = NULL;
177 losig_list *ptlosig;
178 inffig_list *ifl;
179
180 if ((ifl=getloadedinffig(gns_GetWorkingFigureName()))==NULL)
181 ifl=addinffig(gns_GetWorkingFigureName());
182
183 if (siglist == NULL) return;
184 for (ptchain = siglist; ptchain; ptchain = ptchain->NEXT) {
185 ptlosig = (losig_list *)ptchain->DATA;
186 newchain = addchain(newchain, ptlosig->NAMECHAIN->DATA);
187 }
188 inf_AddList(INF_FIG, INF_LOADED_LOCATION, INF_MUXU, "", newchain, getwhere());
189 // ifl->LOADED.INF_MUXU = addchain(ifl->LOADED.INF_MUXU, newchain);
190 }
191
192 void
193 fclMuxDnConstraint(chain_list *siglist)
194 {
195 chain_list *ptchain;
196 chain_list *newchain = NULL;
197 losig_list *ptlosig;
198 inffig_list *ifl;
199
200 if ((ifl=getloadedinffig(gns_GetWorkingFigureName()))==NULL)
201 ifl=addinffig(gns_GetWorkingFigureName());
202
203 if (siglist == NULL) return;
204 for (ptchain = siglist; ptchain; ptchain = ptchain->NEXT) {
205 ptlosig = (losig_list *)ptchain->DATA;
206 newchain = addchain(newchain, ptlosig->NAMECHAIN->DATA);
207 }
208 inf_AddList(INF_FIG, INF_LOADED_LOCATION, INF_MUXD, "", newchain, getwhere());
209 // ifl->LOADED.INF_MUXD = addchain(ifl->LOADED.INF_MUXD, newchain);
210 }
211
212 void
213 fclAllowShare(lotrs_list *transistor)
214 {
215 ptype_list *ptuser;
216
217 ptuser = getptype(transistor->USER, FCL_MARK_PTYPE);
218 if (ptuser != NULL) {
219 ptuser->DATA = (void *)FCL_SHARE_TRANS;
220 }
221 else transistor->USER = addptype(transistor->USER, FCL_MARK_PTYPE, (void *)FCL_SHARE_TRANS);
222 }
223