You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
164 lines
5.6 KiB
164 lines
5.6 KiB
/**CHeaderFile*****************************************************************
|
|
|
|
FileName [mtr.h]
|
|
|
|
PackageName [mtr]
|
|
|
|
Synopsis [Multiway-branch tree manipulation]
|
|
|
|
Description [This package provides two layers of functions. Functions
|
|
of the lower level manipulate multiway-branch trees, implemented
|
|
according to the classical scheme whereby each node points to its
|
|
first child and its previous and next siblings. These functions are
|
|
collected in mtrBasic.c.<p>
|
|
Functions of the upper layer deal with group trees, that is the trees
|
|
used by group sifting to represent the grouping of variables. These
|
|
functions are collected in mtrGroup.c.]
|
|
|
|
SeeAlso [The CUDD package documentation; specifically on group
|
|
sifting.]
|
|
|
|
Author [Fabio Somenzi]
|
|
|
|
Copyright [This file was created at the University of Colorado at
|
|
Boulder. The University of Colorado at Boulder makes no warranty
|
|
about the suitability of this software for any purpose. It is
|
|
presented on an AS IS basis.]
|
|
|
|
Revision [$Id: mtr.h,v 1.12 2004/01/01 06:55:26 fabio Exp $]
|
|
|
|
******************************************************************************/
|
|
|
|
#ifndef __MTR
|
|
#define __MTR
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Nested includes */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Constant declarations */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
#ifndef SIZEOF_VOID_P
|
|
#define SIZEOF_VOID_P 4
|
|
#endif
|
|
#ifndef SIZEOF_INT
|
|
#define SIZEOF_INT 4
|
|
#endif
|
|
|
|
#undef CONST
|
|
#if defined(__STDC__) || defined(__cplusplus)
|
|
#define CONST const
|
|
#else /* !(__STDC__ || __cplusplus) */
|
|
#define CONST
|
|
#endif /* !(__STDC__ || __cplusplus) */
|
|
|
|
#if defined(__GNUC__)
|
|
#define MTR_INLINE __inline__
|
|
# if (__GNUC__ >2 || __GNUC_MINOR__ >=7)
|
|
# define MTR_UNUSED __attribute__ ((unused))
|
|
# else
|
|
# define MTR_UNUSED
|
|
# endif
|
|
#else
|
|
#define MTR_INLINE
|
|
#define MTR_UNUSED
|
|
#endif
|
|
|
|
/* Flag definitions */
|
|
#define MTR_DEFAULT 0x00000000
|
|
#define MTR_TERMINAL 0x00000001
|
|
#define MTR_SOFT 0x00000002
|
|
#define MTR_FIXED 0x00000004
|
|
#define MTR_NEWNODE 0x00000008
|
|
|
|
/* MTR_MAXHIGH is defined in such a way that on 32-bit and 64-bit
|
|
** machines one can cast a value to (int) without generating a negative
|
|
** number.
|
|
*/
|
|
#if SIZEOF_VOID_P == 8 && SIZEOF_INT == 4
|
|
#define MTR_MAXHIGH (((MtrHalfWord) ~0) >> 1)
|
|
#else
|
|
#define MTR_MAXHIGH ((MtrHalfWord) ~0)
|
|
#endif
|
|
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Stucture declarations */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Type declarations */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
#if SIZEOF_VOID_P == 8 && SIZEOF_INT == 4
|
|
typedef unsigned int MtrHalfWord;
|
|
#else
|
|
typedef unsigned short MtrHalfWord;
|
|
#endif
|
|
|
|
typedef struct MtrNode {
|
|
MtrHalfWord flags;
|
|
MtrHalfWord low;
|
|
MtrHalfWord size;
|
|
MtrHalfWord index;
|
|
struct MtrNode *parent;
|
|
struct MtrNode *child;
|
|
struct MtrNode *elder;
|
|
struct MtrNode *younger;
|
|
} MtrNode;
|
|
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Variable declarations */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Macro declarations */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
/* Flag manipulation macros */
|
|
#define MTR_SET(node, flag) (node->flags |= (flag))
|
|
#define MTR_RESET(node, flag) (node->flags &= ~ (flag))
|
|
#define MTR_TEST(node, flag) (node->flags & (flag))
|
|
|
|
|
|
/**AutomaticStart*************************************************************/
|
|
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Function prototypes */
|
|
/*---------------------------------------------------------------------------*/
|
|
|
|
extern MtrNode * Mtr_AllocNode (void);
|
|
extern void Mtr_DeallocNode (MtrNode *node);
|
|
extern MtrNode * Mtr_InitTree (void);
|
|
extern void Mtr_FreeTree (MtrNode *node);
|
|
extern MtrNode * Mtr_CopyTree (MtrNode *node, int expansion);
|
|
extern void Mtr_MakeFirstChild (MtrNode *parent, MtrNode *child);
|
|
extern void Mtr_MakeLastChild (MtrNode *parent, MtrNode *child);
|
|
extern MtrNode * Mtr_CreateFirstChild (MtrNode *parent);
|
|
extern MtrNode * Mtr_CreateLastChild (MtrNode *parent);
|
|
extern void Mtr_MakeNextSibling (MtrNode *first, MtrNode *second);
|
|
extern void Mtr_PrintTree (MtrNode *node);
|
|
extern MtrNode * Mtr_InitGroupTree (int lower, int size);
|
|
extern MtrNode * Mtr_MakeGroup (MtrNode *root, unsigned int low, unsigned int high, unsigned int flags);
|
|
extern MtrNode * Mtr_DissolveGroup (MtrNode *group);
|
|
extern MtrNode * Mtr_FindGroup (MtrNode *root, unsigned int low, unsigned int high);
|
|
extern int Mtr_SwapGroups (MtrNode *first, MtrNode *second);
|
|
extern void Mtr_PrintGroups (MtrNode *root, int silent);
|
|
extern MtrNode * Mtr_ReadGroups (FILE *fp, int nleaves);
|
|
|
|
/**AutomaticEnd***************************************************************/
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
#endif /* __MTR */
|