1 /****************************************************************************/
3 /* Chaine de CAO & VLSI AVERTEC */
5 /* Produit : STM Version 1.00 */
6 /* Fichier : stm_modtb_merge.c */
8 /* (c) copyright 2000 AVERTEC */
9 /* Tous droits reserves */
11 /* Auteur(s) : Gilles Augustins */
13 /****************************************************************************/
15 /****************************************************************************/
17 /****************************************************************************/
21 /****************************************************************************/
23 /****************************************************************************/
25 timing_table
*stm_modtbl_mergec (timing_table
*dttable
, timing_table
*cktable
, float cstr
, float dtload
, float ckload
)
27 timing_table
*delaytabAB
= NULL
;
28 timing_table
*delaytabA
;
29 timing_table
*delaytabB
;
30 int nldA
, /* nb load delaytable A */
31 nsdA
, /* nb slew delaytable A */
32 nsdB
, /* nb load delaytable B */
33 nldB
; /* nb slew delaytable B */
35 float inslewA
, inslewB
;
43 nldA
= stm_modtbl_getnload (delaytabA
);
44 nsdA
= stm_modtbl_getnslew (delaytabA
);
45 nldB
= stm_modtbl_getnload (delaytabB
);
46 nsdB
= stm_modtbl_getnslew (delaytabB
);
49 delaytabAB
= stm_modtbl_create (nsdA
, nsdB
, STM_INPUT_SLEW
, STM_CLOCK_SLEW
);
50 stm_modtbl_Ximportslewaxis (delaytabAB
, delaytabA
);
51 stm_modtbl_Yimportslewaxis (delaytabAB
, delaytabB
);
52 for (i
= 0; i
< nsdA
; i
++) {
53 inslewA
= stm_modtbl_getslewaxisval (delaytabA
, i
);
54 delayA
= stm_modtbl_delay (delaytabA
, loadA
, inslewA
);
55 for (j
= 0; j
< nsdB
; j
++) {
56 inslewB
= stm_modtbl_getslewaxisval (delaytabB
, j
);
57 delayB
= stm_modtbl_delay (delaytabB
, loadB
, inslewB
);
58 stm_modtbl_set2Dval (delaytabAB
, i
, j
, delayA
+ cstr
+ delayB
);
64 delaytabAB
= stm_modtbl_create (nsdA
, 0, STM_INPUT_SLEW
, STM_NOTYPE
);
65 stm_modtbl_Ximportslewaxis (delaytabAB
, delaytabA
);
66 delayB
= stm_modtbl_delay (delaytabB
, loadB
, STM_DONTCARE
);
67 for (i
= 0; i
< nsdA
; i
++) {
68 inslewA
= stm_modtbl_getslewaxisval (delaytabA
, i
);
69 delayA
= stm_modtbl_delay (delaytabA
, loadA
, inslewA
);
70 stm_modtbl_set1Dval (delaytabAB
, i
, delayA
+ cstr
+ delayB
);
75 delaytabAB
= stm_modtbl_create (nsdB
, 0, STM_CLOCK_SLEW
, STM_NOTYPE
);
76 stm_modtbl_Ximportloadaxis (delaytabAB
, delaytabB
);
77 delayA
= stm_modtbl_delay (delaytabA
, loadA
, STM_DONTCARE
);
78 for (i
= 0; i
< nsdB
; i
++) {
79 inslewB
= stm_modtbl_getslewaxisval (delaytabB
, i
);
80 delayB
= stm_modtbl_delay (delaytabB
, loadB
, inslewB
);
81 stm_modtbl_set1Dval (delaytabAB
, i
, delayA
+ cstr
+ delayB
);
86 delaytabAB
= stm_modtbl_create (0, 0, STM_NOTYPE
, STM_NOTYPE
) ;
87 delayA
= stm_modtbl_delay (delaytabA
, loadA
, STM_DONTCARE
) ;
88 delayB
= stm_modtbl_delay (delaytabB
, loadB
, STM_DONTCARE
) ;
89 stm_modtbl_setconst (delaytabAB
, delayA
+ cstr
+ delayB
) ;
93 avt_errmsg (STM_ERRMSG
, "029", AVT_ERROR
);
98 /****************************************************************************/
99 timing_table
*stm_modtbl_mergecd (timing_table
*dttable
, timing_table
*dstable
, timing_table
*cstrtable
, float cstr
, float dtload
)
101 timing_table
*delaytabAB
= NULL
;
102 timing_table
*delaytabA
;
103 timing_table
*slewtabA
;
104 timing_table
*delaytabB
;
105 int nldA
, /* nb load delaytable A */
106 nsdA
, /* nb slew delaytable A */
107 nsdB
, /* nb load delaytable B */
108 nldB
; /* nb slew delaytable B */
110 float inslewA
, ckslewB
, slewA
;
111 float delayA
, delayB
;
112 float loadA
= dtload
;
116 delaytabB
= cstrtable
;
118 nldA
= stm_modtbl_getnload (delaytabA
);
119 nsdA
= stm_modtbl_getnslew (delaytabA
);
120 nldB
= stm_modtbl_getnload (delaytabB
);
121 nsdB
= stm_modtbl_getnckslew (delaytabB
);
123 if (cstrtable
&& cstr
) {
124 avt_errmsg (STM_ERRMSG
, "041", AVT_ERROR
);
129 delaytabAB
= stm_modtbl_create (nsdA
, nsdB
, STM_INPUT_SLEW
, STM_CLOCK_SLEW
);
130 stm_modtbl_Ximportslewaxis (delaytabAB
, delaytabA
);
131 stm_modtbl_Yimportckslewaxis (delaytabAB
, delaytabB
);
132 for (i
= 0; i
< nsdA
; i
++) {
133 inslewA
= stm_modtbl_getslewaxisval (delaytabA
, i
);
134 delayA
= stm_modtbl_delay (delaytabA
, loadA
, inslewA
);
135 slewA
= stm_modtbl_slew (slewtabA
, loadA
, inslewA
);
136 for (j
= 0; j
< nsdB
; j
++) {
137 ckslewB
= stm_modtbl_getckslewaxisval (delaytabB
, j
);
138 delayB
= stm_modtbl_constraint (delaytabB
, slewA
, ckslewB
);
139 stm_modtbl_set2Dval (delaytabAB
, i
, j
, delayA
+ cstr
+ delayB
);
145 delaytabAB
= stm_modtbl_create (nsdA
, 0, STM_INPUT_SLEW
, STM_NOTYPE
);
146 stm_modtbl_Ximportslewaxis (delaytabAB
, delaytabA
);
147 for (i
= 0; i
< nsdA
; i
++) {
148 inslewA
= stm_modtbl_getslewaxisval (delaytabA
, i
);
149 delayA
= stm_modtbl_delay (delaytabA
, loadA
, inslewA
);
150 slewA
= stm_modtbl_slew (slewtabA
, loadA
, inslewA
);
151 delayB
= stm_modtbl_constraint (delaytabB
, slewA
, STM_DONTCARE
);
152 stm_modtbl_set1Dval (delaytabAB
, i
, delayA
+ cstr
+ delayB
);
157 delaytabAB
= stm_modtbl_create (nsdB
, 0, STM_CLOCK_SLEW
, STM_NOTYPE
);
158 stm_modtbl_Ximportckslewaxis (delaytabAB
, delaytabB
);
159 delayA
= stm_modtbl_delay (delaytabA
, loadA
, STM_DONTCARE
);
160 slewA
= stm_modtbl_slew (slewtabA
, loadA
, STM_DONTCARE
);
161 for (i
= 0; i
< nsdB
; i
++) {
162 ckslewB
= stm_modtbl_getckslewaxisval (delaytabB
, i
);
163 delayB
= stm_modtbl_constraint (delaytabB
, slewA
, ckslewB
);
164 stm_modtbl_set1Dval (delaytabAB
, i
, delayA
+ cstr
+ delayB
);
168 if (!nsdA
&& !nsdB
) {
169 delaytabAB
= stm_modtbl_create (0, 0, STM_NOTYPE
, STM_NOTYPE
) ;
170 delayA
= stm_modtbl_delay (delaytabA
, loadA
, STM_DONTCARE
) ;
171 slewA
= stm_modtbl_slew (slewtabA
, loadA
, STM_DONTCARE
);
172 delayB
= stm_modtbl_constraint (delaytabB
, slewA
, STM_DONTCARE
) ;
173 stm_modtbl_setconst (delaytabAB
, delayA
+ cstr
+ delayB
) ;
177 avt_errmsg (STM_ERRMSG
, "029", AVT_ERROR
);
182 /****************************************************************************/
184 timing_table
*stm_modtbl_mergecc (timing_table
*dttable
, timing_table
*dstable
, timing_table
*cstrtable
, float cstr
, float dtload
)
186 timing_table
*delaytabAB
= NULL
;
187 timing_table
*delaytabA
;
188 timing_table
*slewtabA
;
189 timing_table
*delaytabB
;
190 int nldA
, /* nb load delaytable A */
191 nsdA
, /* nb slew delaytable A */
192 nsdB
, /* nb load delaytable B */
193 nldB
; /* nb slew delaytable B */
195 float inslewA
, inslewB
, slewA
;
196 float delayA
, delayB
;
197 float loadA
= dtload
;
201 delaytabB
= cstrtable
;
203 nldA
= stm_modtbl_getnload (delaytabA
);
204 nsdA
= stm_modtbl_getnslew (delaytabA
);
205 nldB
= stm_modtbl_getnload (delaytabB
);
206 nsdB
= stm_modtbl_getnslew (delaytabB
);
208 if (cstrtable
&& cstr
) {
209 avt_errmsg (STM_ERRMSG
, "041", AVT_ERROR
);
214 delaytabAB
= stm_modtbl_create (nsdB
, nsdA
, STM_INPUT_SLEW
, STM_CLOCK_SLEW
);
215 stm_modtbl_Ximportslewaxis (delaytabAB
, delaytabB
);
216 stm_modtbl_Yimportslewaxis (delaytabAB
, delaytabA
);
217 for (i
= 0; i
< nsdA
; i
++) {
218 inslewA
= stm_modtbl_getslewaxisval (delaytabA
, i
);
219 delayA
= stm_modtbl_delay (delaytabA
, loadA
, inslewA
);
220 slewA
= stm_modtbl_slew (slewtabA
, loadA
, inslewA
);
221 for (j
= 0; j
< nsdB
; j
++) {
222 inslewB
= stm_modtbl_getslewaxisval (delaytabB
, j
);
223 delayB
= stm_modtbl_constraint (delaytabB
, inslewB
, slewA
);
224 stm_modtbl_set2Dval (delaytabAB
, j
, i
, delayA
+ cstr
+ delayB
);
230 delaytabAB
= stm_modtbl_create (nsdA
, 0, STM_CLOCK_SLEW
, STM_NOTYPE
);
231 stm_modtbl_Ximportslewaxis (delaytabAB
, delaytabA
);
232 for (i
= 0; i
< nsdA
; i
++) {
233 inslewA
= stm_modtbl_getslewaxisval (delaytabA
, i
);
234 delayA
= stm_modtbl_delay (delaytabA
, loadA
, inslewA
);
235 slewA
= stm_modtbl_slew (slewtabA
, loadA
, inslewA
);
236 delayB
= stm_modtbl_constraint (delaytabB
, STM_DONTCARE
, slewA
);
237 stm_modtbl_set1Dval (delaytabAB
, i
, delayA
+ cstr
+ delayB
);
242 delaytabAB
= stm_modtbl_create (nsdB
, 0, STM_INPUT_SLEW
, STM_NOTYPE
);
243 stm_modtbl_Ximportslewaxis (delaytabAB
, delaytabB
);
244 delayA
= stm_modtbl_delay (delaytabA
, loadA
, STM_DONTCARE
);
245 slewA
= stm_modtbl_slew (slewtabA
, loadA
, STM_DONTCARE
);
246 for (i
= 0; i
< nsdB
; i
++) {
247 inslewB
= stm_modtbl_getslewaxisval (delaytabB
, i
);
248 delayB
= stm_modtbl_constraint (delaytabB
, inslewB
, slewA
);
249 stm_modtbl_set1Dval (delaytabAB
, i
, delayA
+ cstr
+ delayB
);
253 if (!nsdA
&& !nsdB
) {
254 delaytabAB
= stm_modtbl_create (0, 0, STM_NOTYPE
, STM_NOTYPE
) ;
255 delayA
= stm_modtbl_delay (delaytabA
, loadA
, STM_DONTCARE
) ;
256 slewA
= stm_modtbl_slew (slewtabA
, loadA
, STM_DONTCARE
);
257 delayB
= stm_modtbl_constraint (delaytabB
, STM_DONTCARE
, slewA
) ;
258 stm_modtbl_setconst (delaytabAB
, delayA
+ cstr
+ delayB
) ;
262 avt_errmsg (STM_ERRMSG
, "029", AVT_ERROR
);
267 /****************************************************************************/
269 timing_table
*stm_modtbl_merge (timing_table
*delaytabA
, timing_table
*delaytabB
, float delay
, float load
, float slew
)
271 timing_table
*delaytabAB
;
272 int nldA
, /* nb load delaytable A */
273 nsdA
, /* nb slew delaytable A */
274 nsdB
, /* nb load delaytable B */
275 nldB
; /* nb slew delaytable B */
277 float inslew
, outload
;
278 float delayA
, delayB
;
280 nldA
= stm_modtbl_getnload (delaytabA
);
281 nsdA
= stm_modtbl_getnslew (delaytabA
);
282 nldB
= stm_modtbl_getnload (delaytabB
);
283 nsdB
= stm_modtbl_getnslew (delaytabB
);
286 delaytabAB
= stm_modtbl_create (nsdA
, nldB
, STM_INPUT_SLEW
, STM_LOAD
);
287 stm_modtbl_Ximportslewaxis (delaytabAB
, delaytabA
);
288 stm_modtbl_Yimportloadaxis (delaytabAB
, delaytabB
);
289 for (i
= 0; i
< nsdA
; i
++) {
290 inslew
= stm_modtbl_getslewaxisval (delaytabA
, i
);
291 delayA
= stm_modtbl_delay (delaytabA
, load
, inslew
);
292 for (j
= 0; j
< nldB
; j
++) {
293 outload
= stm_modtbl_getloadaxisval (delaytabB
, j
);
294 delayB
= stm_modtbl_delay (delaytabB
, outload
, slew
);
295 stm_modtbl_set2Dval (delaytabAB
, i
, j
, delayA
+ delay
+ delayB
);
301 delaytabAB
= stm_modtbl_create (nsdA
, 0, STM_INPUT_SLEW
, STM_NOTYPE
);
302 stm_modtbl_Ximportslewaxis (delaytabAB
, delaytabA
);
303 delayB
= stm_modtbl_delay (delaytabB
, STM_DONTCARE
, slew
);
304 for (i
= 0; i
< nsdA
; i
++) {
305 inslew
= stm_modtbl_getslewaxisval (delaytabA
, i
);
306 delayA
= stm_modtbl_delay (delaytabA
, load
, inslew
);
307 stm_modtbl_set1Dval (delaytabAB
, i
, delayA
+ delay
+ delayB
);
312 delaytabAB
= stm_modtbl_create (nldB
, 0, STM_LOAD
, STM_NOTYPE
);
313 stm_modtbl_Ximportloadaxis (delaytabAB
, delaytabB
);
314 delayA
= stm_modtbl_delay (delaytabA
, load
, STM_DONTCARE
);
315 for (i
= 0; i
< nldB
; i
++) {
316 outload
= stm_modtbl_getloadaxisval (delaytabB
, i
);
317 delayB
= stm_modtbl_delay (delaytabB
, outload
, slew
);
318 stm_modtbl_set1Dval (delaytabAB
, i
, delayA
+ delay
+ delayB
);
322 if (!nsdA
&& !nldB
) {
323 delaytabAB
= stm_modtbl_create (0, 0, STM_NOTYPE
, STM_NOTYPE
) ;
324 delayA
= stm_modtbl_delay (delaytabA
, load
, STM_DONTCARE
) ;
325 delayB
= stm_modtbl_delay (delaytabB
, STM_DONTCARE
, slew
) ;
326 stm_modtbl_setconst (delaytabAB
, delayA
+ delay
+ delayB
) ;
330 avt_errmsg (STM_ERRMSG
, "029", AVT_ERROR
);
335 /****************************************************************************/
337 timing_table
*stm_modtbl_multidelaymerge (timing_table
*stableA
,
338 timing_table
*dtableA
,
340 timing_table
*dtableB
)
342 timing_table
*dtable
= NULL
;
345 float delay
= 0, slew
, newslew
, load
;
347 ns
= stm_modtbl_getnslew (dtableA
);
348 nl
= stm_modtbl_getnload (dtableB
);
351 dtable
= stm_modtbl_create (ns
, nl
, STM_INPUT_SLEW
, STM_LOAD
);
352 stm_modtbl_Ximportslewaxis (dtable
, dtableA
);
353 stm_modtbl_Yimportloadaxis (dtable
, dtableB
);
354 for (i
= 0; i
< ns
; i
++) {
355 slew
= stm_modtbl_getslewaxisval (dtableA
, i
);
356 for (j
= 0; j
< nl
; j
++) {
357 load
= stm_modtbl_getloadaxisval (dtableB
, j
);
359 delay
= stm_modtbl_delay (dtableA
, capa
, slew
);
360 newslew
= stm_modtbl_slew (stableA
, capa
, newslew
);
361 delay
+= stm_modtbl_delay (dtableB
, load
, slew
);
362 stm_modtbl_set2Dval (dtable
, i
, j
, delay
);
368 dtable
= stm_modtbl_create (ns
, 0, STM_INPUT_SLEW
, STM_NOTYPE
);
369 stm_modtbl_Ximportslewaxis (dtable
, dtableA
);
370 for (i
= 0; i
< ns
; i
++) {
371 slew
= stm_modtbl_getslewaxisval (dtableA
, i
);
372 delay
= stm_modtbl_delay (dtableA
, capa
, slew
);
373 slew
= stm_modtbl_slew (stableA
, capa
, slew
);
374 delay
= stm_modtbl_delay (dtableB
, STM_DONTCARE
, slew
);
375 stm_modtbl_set1Dval (dtable
, i
, delay
);
382 /****************************************************************************/
384 timing_table
*stm_modtbl_multidelaymerge_n (chain_list
*stables
, chain_list
*dtables
)
386 timing_table
*dtable
= NULL
, *dtable_org
, *dtable_end
;
389 chain_list
*dch
, *sch
;
390 float delay
= 0, slew
, newslew
, load
;
392 dtable_org
= (timing_table
*)dtables
->DATA
;
393 ns
= stm_modtbl_getnslew (dtable_org
);
395 for (dch
= dtables
; dch
->NEXT
; dch
= dch
->NEXT
);
396 dtable_end
= (timing_table
*)dch
->DATA
;
397 nl
= stm_modtbl_getnload (dtable_end
);
400 dtable
= stm_modtbl_create (ns
, nl
, STM_INPUT_SLEW
, STM_LOAD
);
401 stm_modtbl_Ximportslewaxis (dtable
, dtable_org
);
402 stm_modtbl_Yimportloadaxis (dtable
, dtable_end
);
403 for (i
= 0; i
< ns
; i
++) {
404 slew
= stm_modtbl_getslewaxisval (dtable_org
, i
);
405 for (j
= 0; j
< nl
; j
++) {
406 load
= stm_modtbl_getloadaxisval (dtable_end
, j
);
409 for (dch
= dtables
, sch
= stables
; dch
->NEXT
; dch
= dch
->NEXT
, sch
= sch
->NEXT
) {
410 delay
+= stm_modtbl_delay ((timing_table
*)dch
->DATA
, STM_DONTCARE
, slew
);
411 newslew
= stm_modtbl_slew ((timing_table
*)sch
->DATA
, STM_DONTCARE
, newslew
);
413 delay
+= stm_modtbl_delay ((timing_table
*)dch
->DATA
, load
, slew
);
414 newslew
= stm_modtbl_slew ((timing_table
*)sch
->DATA
, load
, newslew
);
415 stm_modtbl_set2Dval (dtable
, i
, j
, delay
);
421 dtable
= stm_modtbl_create (ns
, 0, STM_INPUT_SLEW
, STM_NOTYPE
);
422 stm_modtbl_Ximportslewaxis (dtable
, dtable_org
);
423 for (i
= 0; i
< ns
; i
++) {
424 slew
= stm_modtbl_getslewaxisval (dtable_org
, i
);
426 for (dch
= dtables
, sch
= stables
; dch
; dch
= dch
->NEXT
, sch
= sch
->NEXT
) {
427 delay
+= stm_modtbl_delay ((timing_table
*)dch
->DATA
, STM_DONTCARE
, slew
);
428 slew
= stm_modtbl_slew ((timing_table
*)sch
->DATA
, STM_DONTCARE
, slew
);
430 stm_modtbl_set1Dval (dtable
, i
, delay
);
437 /****************************************************************************/
439 timing_table
*stm_modtbl_multislewmerge (timing_table
*stableA
, float capa
, timing_table
*stableB
)
441 timing_table
*stable
= NULL
;
444 float slew
, load
, newslew
;
446 ns
= stm_modtbl_getnslew (stableA
);
447 nl
= stm_modtbl_getnload (stableB
);
450 stable
= stm_modtbl_create (ns
, nl
, STM_INPUT_SLEW
, STM_LOAD
);
451 stm_modtbl_Ximportslewaxis (stable
, stableA
);
452 stm_modtbl_Yimportloadaxis (stable
, stableB
);
454 for (i
= 0; i
< ns
; i
++) {
455 slew
= stm_modtbl_getslewaxisval (stableA
, i
);
456 for (j
= 0; j
< nl
; j
++) {
457 load
= stm_modtbl_getloadaxisval (stableB
, j
);
458 newslew
= stm_modtbl_slew (stableA
, capa
, slew
);
459 newslew
= stm_modtbl_slew (stableB
, load
, newslew
);
460 stm_modtbl_set2Dval (stable
, i
, j
, newslew
);
466 stable
= stm_modtbl_create (ns
, 0, STM_INPUT_SLEW
, STM_NOTYPE
);
467 stm_modtbl_Ximportslewaxis (stable
, stableA
);
469 for (i
= 0; i
< ns
; i
++) {
470 slew
= stm_modtbl_getslewaxisval (stableA
, i
);
471 slew
= stm_modtbl_slew (stableA
, capa
, slew
);
472 slew
= stm_modtbl_slew (stableB
, capa
, slew
);
473 stm_modtbl_set1Dval (stable
, i
, slew
);
480 /****************************************************************************/
482 timing_table
*stm_modtbl_multislewmerge_n (chain_list
*stables
)
484 timing_table
*stable
= NULL
, *stable_org
, *stable_end
;
487 float slew
, load
, newslew
;
490 stable_org
= (timing_table
*)stables
->DATA
;
491 ns
= stm_modtbl_getnslew (stable_org
);
493 for (sch
= stables
; sch
->NEXT
; sch
= sch
->NEXT
);
494 stable_end
= (timing_table
*)sch
->DATA
;
495 nl
= stm_modtbl_getnload (stable_end
);
498 stable
= stm_modtbl_create (ns
, nl
, STM_INPUT_SLEW
, STM_LOAD
);
499 stm_modtbl_Ximportslewaxis (stable
, stable_org
);
500 stm_modtbl_Yimportloadaxis (stable
, stable_end
);
502 for (i
= 0; i
< ns
; i
++) {
503 slew
= stm_modtbl_getslewaxisval (stable_org
, i
);
504 for (j
= 0; j
< nl
; j
++) {
505 load
= stm_modtbl_getloadaxisval (stable_end
, j
);
507 for (sch
= stables
; sch
->NEXT
; sch
= sch
->NEXT
)
508 newslew
= stm_modtbl_slew ((timing_table
*)sch
->DATA
, STM_DONTCARE
, newslew
);
509 newslew
= stm_modtbl_slew ((timing_table
*)sch
->DATA
, load
, newslew
);
510 stm_modtbl_set2Dval (stable
, i
, j
, newslew
);
516 stable
= stm_modtbl_create (ns
, 0, STM_INPUT_SLEW
, STM_NOTYPE
);
517 stm_modtbl_Ximportslewaxis (stable
, stable_org
);
519 for (i
= 0; i
< ns
; i
++) {
520 slew
= stm_modtbl_getslewaxisval (stable_org
, i
);
521 for (sch
= stables
; sch
; sch
= sch
->NEXT
)
522 slew
= stm_modtbl_slew ((timing_table
*)sch
->DATA
, STM_DONTCARE
, slew
);
523 stm_modtbl_set1Dval (stable
, i
, slew
);
530 /****************************************************************************/
532 int stm_modtbl_sametablesize (timing_table
*tableA
, timing_table
*tableB
)
534 if (tableA
&& !tableB
)
537 if (!tableA
&& tableB
)
540 if (!tableA
&& !tableB
)
543 if (tableA
->SET1D
&& tableB
->SET1D
)
546 if (tableA
->SET2D
&& tableB
->SET2D
)