SVF
mtrBasic.c
Go to the documentation of this file.
1 
63 #include "CUDD/util.h"
64 #include "CUDD/mtrInt.h"
65 
66 
67 /*---------------------------------------------------------------------------*/
68 /* Constant declarations */
69 /*---------------------------------------------------------------------------*/
70 
71 /*---------------------------------------------------------------------------*/
72 /* Stucture declarations */
73 /*---------------------------------------------------------------------------*/
74 
75 /*---------------------------------------------------------------------------*/
76 /* Type declarations */
77 /*---------------------------------------------------------------------------*/
78 
79 /*---------------------------------------------------------------------------*/
80 /* Variable declarations */
81 /*---------------------------------------------------------------------------*/
82 
83 #ifndef lint
84 static char rcsid[] MTR_UNUSED = "$Id: mtrBasic.c,v 1.15 2012/02/05 01:06:19 fabio Exp $";
85 #endif
86 
87 /*---------------------------------------------------------------------------*/
88 /* Macro declarations */
89 /*---------------------------------------------------------------------------*/
90 
93 /*---------------------------------------------------------------------------*/
94 /* Static function prototypes */
95 /*---------------------------------------------------------------------------*/
96 
97 
101 /*---------------------------------------------------------------------------*/
102 /* Definition of exported functions */
103 /*---------------------------------------------------------------------------*/
104 
116 MtrNode *
118 {
119  MtrNode *node;
120 
121  node = ALLOC(MtrNode,1);
122  return node;
123 
124 } /* Mtr_AllocNode */
125 
126 
138 void
140  MtrNode * node /* node to be deallocated */)
141 {
142  FREE(node);
143  return;
144 
145 } /* end of Mtr_DeallocNode */
146 
147 
159 MtrNode *
161 {
162  MtrNode *node;
163 
164  node = Mtr_AllocNode();
165  if (node == NULL) return(NULL);
166 
167  node->parent = node->child = node->elder = node->younger = NULL;
168  node->flags = 0;
169 
170  return(node);
171 
172 } /* end of Mtr_InitTree */
173 
174 
186 void
188  MtrNode * node)
189 {
190  if (node == NULL) return;
191  if (! MTR_TEST(node,MTR_TERMINAL)) Mtr_FreeTree(node->child);
192  Mtr_FreeTree(node->younger);
193  Mtr_DeallocNode(node);
194  return;
195 
196 } /* end of Mtr_FreeTree */
197 
198 
213 MtrNode *
215  MtrNode * node,
216  int expansion)
217 {
218  MtrNode *copy;
219 
220  if (node == NULL) return(NULL);
221  if (expansion < 1) return(NULL);
222  copy = Mtr_AllocNode();
223  if (copy == NULL) return(NULL);
224  copy->parent = copy->elder = copy->child = copy->younger = NULL;
225  if (node->child != NULL) {
226  copy->child = Mtr_CopyTree(node->child, expansion);
227  if (copy->child == NULL) {
228  Mtr_DeallocNode(copy);
229  return(NULL);
230  }
231  }
232  if (node->younger != NULL) {
233  copy->younger = Mtr_CopyTree(node->younger, expansion);
234  if (copy->younger == NULL) {
235  Mtr_FreeTree(copy);
236  return(NULL);
237  }
238  }
239  copy->flags = node->flags;
240  copy->low = node->low * expansion;
241  copy->size = node->size * expansion;
242  copy->index = node->index * expansion;
243  if (copy->younger) copy->younger->elder = copy;
244  if (copy->child) {
245  MtrNode *auxnode = copy->child;
246  while (auxnode != NULL) {
247  auxnode->parent = copy;
248  auxnode = auxnode->younger;
249  }
250  }
251  return(copy);
252 
253 } /* end of Mtr_CopyTree */
254 
255 
267 void
269  MtrNode * parent,
270  MtrNode * child)
271 {
272  child->parent = parent;
273  child->younger = parent->child;
274  child->elder = NULL;
275  if (parent->child != NULL) {
276 #ifdef MTR_DEBUG
277  assert(parent->child->elder == NULL);
278 #endif
279  parent->child->elder = child;
280  }
281  parent->child = child;
282  return;
283 
284 } /* end of Mtr_MakeFirstChild */
285 
286 
298 void
300  MtrNode * parent,
301  MtrNode * child)
302 {
303  MtrNode *node;
304 
305  child->younger = NULL;
306 
307  if (parent->child == NULL) {
308  parent->child = child;
309  child->elder = NULL;
310  } else {
311  for (node = parent->child;
312  node->younger != NULL;
313  node = node->younger);
314  node->younger = child;
315  child->elder = node;
316  }
317  child->parent = parent;
318  return;
319 
320 } /* end of Mtr_MakeLastChild */
321 
322 
335 MtrNode *
337  MtrNode * parent)
338 {
339  MtrNode *child;
340 
341  child = Mtr_AllocNode();
342  if (child == NULL) return(NULL);
343 
344  child->child = NULL;
345  child->flags = 0;
346  Mtr_MakeFirstChild(parent,child);
347  return(child);
348 
349 } /* end of Mtr_CreateFirstChild */
350 
351 
364 MtrNode *
366  MtrNode * parent)
367 {
368  MtrNode *child;
369 
370  child = Mtr_AllocNode();
371  if (child == NULL) return(NULL);
372 
373  child->child = NULL;
374  child->flags = 0;
375  Mtr_MakeLastChild(parent,child);
376  return(child);
377 
378 } /* end of Mtr_CreateLastChild */
379 
380 
393 void
395  MtrNode * first,
396  MtrNode * second)
397 {
398  second->parent = first->parent;
399  second->elder = first;
400  second->younger = first->younger;
401  if (first->younger != NULL) {
402  first->younger->elder = second;
403  }
404  first->younger = second;
405  return;
406 
407 } /* end of Mtr_MakeNextSibling */
408 
409 
421 void
423  MtrNode * node)
424 {
425  if (node == NULL) return;
426  (void) fprintf(stdout,
427 #if SIZEOF_VOID_P == 8
428  "N=0x%-8lx C=0x%-8lx Y=0x%-8lx E=0x%-8lx P=0x%-8lx F=%x L=%u S=%u\n",
429  (unsigned long) node, (unsigned long) node->child,
430  (unsigned long) node->younger, (unsigned long) node->elder,
431  (unsigned long) node->parent, node->flags, node->low, node->size);
432 #else
433  "N=0x%-8x C=0x%-8x Y=0x%-8x E=0x%-8x P=0x%-8x F=%x L=%hu S=%hu\n",
434  (unsigned) node, (unsigned) node->child,
435  (unsigned) node->younger, (unsigned) node->elder,
436  (unsigned) node->parent, node->flags, node->low, node->size);
437 #endif
438  if (!MTR_TEST(node,MTR_TERMINAL)) Mtr_PrintTree(node->child);
439  Mtr_PrintTree(node->younger);
440  return;
441 
442 } /* end of Mtr_PrintTree */
443 
444 /*---------------------------------------------------------------------------*/
445 /* Definition of internal functions */
446 /*---------------------------------------------------------------------------*/
447 
448 /*---------------------------------------------------------------------------*/
449 /* Definition of static functions */
450 /*---------------------------------------------------------------------------*/
void Mtr_PrintTree(MtrNode *node)
Definition: mtrBasic.c:422
#define MTR_TERMINAL
Definition: mtr.h:95
MtrHalfWord flags
Definition: mtr.h:127
MtrHalfWord size
Definition: mtr.h:129
#define FREE(obj)
Definition: util.h:80
MtrNode * Mtr_CreateFirstChild(MtrNode *parent)
Definition: mtrBasic.c:336
#define assert(ex)
Definition: util.h:141
MtrNode * Mtr_CopyTree(MtrNode *node, int expansion)
Definition: mtrBasic.c:214
static char rcsid [] MTR_UNUSED
Definition: mtrBasic.c:84
struct MtrNode * parent
Definition: mtr.h:131
struct MtrNode * elder
Definition: mtr.h:133
void Mtr_MakeLastChild(MtrNode *parent, MtrNode *child)
Definition: mtrBasic.c:299
#define MTR_TEST(node, flag)
Definition: mtr.h:150
struct MtrNode * younger
Definition: mtr.h:134
void Mtr_MakeNextSibling(MtrNode *first, MtrNode *second)
Definition: mtrBasic.c:394
void Mtr_DeallocNode(MtrNode *node)
Definition: mtrBasic.c:139
MtrHalfWord index
Definition: mtr.h:130
#define ALLOC(type, num)
Definition: util.h:76
MtrNode * Mtr_AllocNode(void)
Definition: mtrBasic.c:117
MtrHalfWord low
Definition: mtr.h:128
Definition: mtr.h:126
#define SIZEOF_VOID_P
Definition: mtr.h:75
MtrNode * Mtr_CreateLastChild(MtrNode *parent)
Definition: mtrBasic.c:365
void Mtr_MakeFirstChild(MtrNode *parent, MtrNode *child)
Definition: mtrBasic.c:268
void Mtr_FreeTree(MtrNode *node)
Definition: mtrBasic.c:187
struct MtrNode * child
Definition: mtr.h:132
MtrNode * Mtr_InitTree(void)
Definition: mtrBasic.c:160