1 /**CFile***********************************************************************
7 Synopsis [Basic manipulation of multiway branching trees.]
9 Description [External procedures included in this module:
12 <li> Mtr_DeallocNode()
16 <li> Mtr_MakeFirstChild()
17 <li> Mtr_MakeLastChild()
18 <li> Mtr_CreateFirstChild()
19 <li> Mtr_CreateLastChild()
20 <li> Mtr_MakeNextSibling()
25 SeeAlso [cudd package]
27 Author [Fabio Somenzi]
29 Copyright [Copyright (c) 1995-2004, Regents of the University of Colorado
33 Redistribution and use in source and binary forms, with or without
34 modification, are permitted provided that the following conditions
37 Redistributions of source code must retain the above copyright
38 notice, this list of conditions and the following disclaimer.
40 Redistributions in binary form must reproduce the above copyright
41 notice, this list of conditions and the following disclaimer in the
42 documentation and/or other materials provided with the distribution.
44 Neither the name of the University of Colorado nor the names of its
45 contributors may be used to endorse or promote products derived from
46 this software without specific prior written permission.
48 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
49 "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
50 LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
51 FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
52 COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
53 INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
54 BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
55 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
56 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
57 LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
58 ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
59 POSSIBILITY OF SUCH DAMAGE.]
61 ******************************************************************************/
67 /*---------------------------------------------------------------------------*/
68 /* Constant declarations */
69 /*---------------------------------------------------------------------------*/
71 /*---------------------------------------------------------------------------*/
72 /* Stucture declarations */
73 /*---------------------------------------------------------------------------*/
75 /*---------------------------------------------------------------------------*/
76 /* Type declarations */
77 /*---------------------------------------------------------------------------*/
79 /*---------------------------------------------------------------------------*/
80 /* Variable declarations */
81 /*---------------------------------------------------------------------------*/
84 static char rcsid
[] MTR_UNUSED
= "$Id: mtrBasic.c,v 1.13 2009/02/20 02:03:47 fabio Exp $";
87 /*---------------------------------------------------------------------------*/
88 /* Macro declarations */
89 /*---------------------------------------------------------------------------*/
91 /**AutomaticStart*************************************************************/
93 /*---------------------------------------------------------------------------*/
94 /* Static function prototypes */
95 /*---------------------------------------------------------------------------*/
98 /**AutomaticEnd***************************************************************/
101 /*---------------------------------------------------------------------------*/
102 /* Definition of exported functions */
103 /*---------------------------------------------------------------------------*/
105 /**Function********************************************************************
107 Synopsis [Allocates new tree node.]
109 Description [Allocates new tree node. Returns pointer to node.]
113 SeeAlso [Mtr_DeallocNode]
115 ******************************************************************************/
121 node
= ALLOC(MtrNode
,1);
124 } /* Mtr_AllocNode */
127 /**Function********************************************************************
129 Synopsis [Deallocates tree node.]
135 SeeAlso [Mtr_AllocNode]
137 ******************************************************************************/
140 MtrNode
* node
/* node to be deallocated */)
145 } /* end of Mtr_DeallocNode */
148 /**Function********************************************************************
150 Synopsis [Initializes tree with one node.]
152 Description [Initializes tree with one node. Returns pointer to node.]
156 SeeAlso [Mtr_FreeTree Mtr_InitGroupTree]
158 ******************************************************************************/
164 node
= Mtr_AllocNode();
165 if (node
== NULL
) return(NULL
);
167 node
->parent
= node
->child
= node
->elder
= node
->younger
= NULL
;
172 } /* end of Mtr_InitTree */
175 /**Function********************************************************************
177 Synopsis [Disposes of tree rooted at node.]
183 SeeAlso [Mtr_InitTree]
185 ******************************************************************************/
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
);
196 } /* end of Mtr_FreeTree */
199 /**Function********************************************************************
201 Synopsis [Makes a copy of tree.]
203 Description [Makes a copy of tree. If parameter expansion is greater
204 than 1, it will expand the tree by that factor. It is an error for
205 expansion to be less than 1. Returns a pointer to the copy if
206 successful; NULL otherwise.]
210 SeeAlso [Mtr_InitTree]
212 ******************************************************************************/
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
);
232 if (node
->younger
!= NULL
) {
233 copy
->younger
= Mtr_CopyTree(node
->younger
, expansion
);
234 if (copy
->younger
== NULL
) {
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
;
245 MtrNode
*auxnode
= copy
->child
;
246 while (auxnode
!= NULL
) {
247 auxnode
->parent
= copy
;
248 auxnode
= auxnode
->younger
;
253 } /* end of Mtr_CopyTree */
256 /**Function********************************************************************
258 Synopsis [Makes child the first child of parent.]
264 SeeAlso [Mtr_MakeLastChild Mtr_CreateFirstChild]
266 ******************************************************************************/
272 child
->parent
= parent
;
273 child
->younger
= parent
->child
;
275 if (parent
->child
!= NULL
) {
277 assert(parent
->child
->elder
== NULL
);
279 parent
->child
->elder
= child
;
281 parent
->child
= child
;
284 } /* end of Mtr_MakeFirstChild */
287 /**Function********************************************************************
289 Synopsis [Makes child the last child of parent.]
295 SeeAlso [Mtr_MakeFirstChild Mtr_CreateLastChild]
297 ******************************************************************************/
305 child
->younger
= NULL
;
307 if (parent
->child
== NULL
) {
308 parent
->child
= child
;
311 for (node
= parent
->child
;
312 node
->younger
!= NULL
;
313 node
= node
->younger
);
314 node
->younger
= child
;
317 child
->parent
= parent
;
320 } /* end of Mtr_MakeLastChild */
323 /**Function********************************************************************
325 Synopsis [Creates a new node and makes it the first child of parent.]
327 Description [Creates a new node and makes it the first child of
328 parent. Returns pointer to new child.]
332 SeeAlso [Mtr_MakeFirstChild Mtr_CreateLastChild]
334 ******************************************************************************/
336 Mtr_CreateFirstChild(
341 child
= Mtr_AllocNode();
342 if (child
== NULL
) return(NULL
);
344 child
->child
= child
->younger
= child
-> elder
= NULL
;
346 Mtr_MakeFirstChild(parent
,child
);
349 } /* end of Mtr_CreateFirstChild */
352 /**Function********************************************************************
354 Synopsis [Creates a new node and makes it the last child of parent.]
356 Description [Creates a new node and makes it the last child of parent.
357 Returns pointer to new child.]
361 SeeAlso [Mtr_MakeLastChild Mtr_CreateFirstChild]
363 ******************************************************************************/
370 child
= Mtr_AllocNode();
371 if (child
== NULL
) return(NULL
);
373 child
->child
= child
->younger
= child
->elder
= NULL
;
375 Mtr_MakeLastChild(parent
,child
);
378 } /* end of Mtr_CreateLastChild */
381 /**Function********************************************************************
383 Synopsis [Makes second the next sibling of first.]
385 Description [Makes second the next sibling of first. Second becomes a
386 child of the parent of first.]
392 ******************************************************************************/
398 second
->younger
= first
->younger
;
399 if (first
->younger
!= NULL
) {
400 first
->younger
->elder
= second
;
402 second
->parent
= first
->parent
;
403 first
->younger
= second
;
404 second
->elder
= first
;
407 } /* end of Mtr_MakeNextSibling */
410 /**Function********************************************************************
412 Synopsis [Prints a tree, one node per line.]
418 SeeAlso [Mtr_PrintGroups]
420 ******************************************************************************/
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
);
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
);
438 if (!MTR_TEST(node
,MTR_TERMINAL
)) Mtr_PrintTree(node
->child
);
439 Mtr_PrintTree(node
->younger
);
442 } /* end of Mtr_PrintTree */
444 /*---------------------------------------------------------------------------*/
445 /* Definition of internal functions */
446 /*---------------------------------------------------------------------------*/
448 /*---------------------------------------------------------------------------*/
449 /* Definition of static functions */
450 /*---------------------------------------------------------------------------*/