netgen/base/objlist.h

338 lines
12 KiB
C

/* objlist.h -- core allocation, list generation by regexps */
#ifndef _OBJLIST_H
#define _OBJLIST_H
#ifndef _HASH_H
#include "hash.h"
#endif
#define SEPARATOR "/"
#define INSTANCE_DELIMITER "#"
#define PORT_DELIMITER "."
#define PHYSICALPIN "("
#define ENDPHYSICALPIN ")"
#define PORT (-1)
#define GLOBAL (-2)
#define UNIQUEGLOBAL (-3)
#define PROPERTY (-4) /* For element properties; e.g., length, width */
#define ALLELEMENTS (-5) /* for doing searches; e.g., Fanout() */
#define ALLOBJECTS (-6) /* for doing searches; e.g., Fanout() */
#define UNKNOWN (-7) /* for error checking */
#define NODE 0
#define FIRSTPIN 1
#define IsPort(a) ((a)->type == PORT)
#define IsNonProxyPort(a) (((a)->type == PORT) && ((a)->model.port != PROXY))
#define IsGlobal(a) (((a)->type == GLOBAL) || ((a)->type == UNIQUEGLOBAL))
#define PROXY (0) /* Used in model.port record of ports */
#define NO_CONNECT 1 /* Use in object list to flag an isolated net */
/* Lists of device properties. Order is defined at the time of */
/* the cell definition; values are sorted at the time instances */
/* are read. */
/* Part 1a: Define the types of tokens used in an expression */
#define TOK_NONE 0
#define TOK_DOUBLE 1
#define TOK_STRING 2
#define TOK_MULTIPLY 3
#define TOK_DIVIDE 4
#define TOK_PLUS 5
#define TOK_MINUS 6
#define TOK_FUNC_OPEN 7
#define TOK_FUNC_CLOSE 8
#define TOK_GT 9
#define TOK_LT 10
#define TOK_GE 11
#define TOK_LE 12
#define TOK_EQ 13
#define TOK_NE 14
#define TOK_GROUP_OPEN 15
#define TOK_GROUP_CLOSE 16
#define TOK_FUNC_IF 17
#define TOK_FUNC_THEN 18
#define TOK_FUNC_ELSE 19
#define TOK_SGL_QUOTE 20
#define TOK_DBL_QUOTE 21
/* Part 1b: Stack structure used to hold expressions in tokenized form */
struct tokstack {
int toktype;
union {
double dvalue;
char *string;
} data;
struct tokstack *next;
struct tokstack *last;
};
/* Part 1c: Define the types of property values */
#define PROP_STRING 0
#define PROP_EXPRESSION 1 /* Same as STRING, handled differently */
#define PROP_INTEGER 2
#define PROP_DOUBLE 3
#define PROP_VALUE 4 /* Same as DOUBLE, handled differently */
#define PROP_ENDLIST 5 /* End of the property record. */
/* Part 1d: Linked list of values for temporary unordered storage when */
/* reading a netlist. Values are string only, to be promoted later if */
/* needed. */
struct keyvalue {
char *key;
char *value;
struct keyvalue *next;
};
/* Part 2: Values (corresponding to the keys, and kept in the instance record) */
struct valuelist {
char *key;
unsigned char type; /* string, integer, double, value, expression */
union {
char *string;
double dval;
int ival;
struct tokstack *stack; /* expression in tokenized form */
} value;
};
/* Part 3: Keys & Defaults (kept in the cell record as a hash table) */
#define MERGE_NONE 0x00 /* Property does not change when devices merge */
#define MERGE_P_ADD 0x01 /* Properties sum with device parallel merge */
#define MERGE_P_PAR 0x02 /* Properties add in parallel with parallel merge */
#define MERGE_P_CRIT 0x04 /* This property enables parallel merging */
#define MERGE_P_XCRIT 0x08 /* Old "critical" behavior (deprecated) */
#define MERGE_S_ADD 0x10 /* Properties sum with device series merge */
#define MERGE_S_PAR 0x20 /* Properties add in parallel with series merge */
#define MERGE_S_CRIT 0x40 /* This property enables series merging */
#define MERGE_S_XCRIT 0x80 /* Old "critical" behavior (deprecated) */
#define MERGE_P_MASK (MERGE_P_ADD | MERGE_P_PAR | MERGE_P_CRIT | MERGE_P_XCRIT)
#define MERGE_S_MASK (MERGE_S_ADD | MERGE_S_PAR | MERGE_S_CRIT | MERGE_S_XCRIT)
#define MERGE_ALL_MASK (MERGE_P_MASK | MERGE_S_MASK)
/* Although the above are flags, "ADD" and "PAR" are mutually exclusive. */
/* Note: A "critical" merge means that the property causes the number of */
/* devices to change. e.g., transistor width is critical; transistor drain */
/* area sums when devices are merged, but does not change the number of devices.*/
/* More than one property can be critical. e.g., width and number of fingers. */
/* Also it is possible for a property (e.g., "value") to be critical for both */
/* series and parallel merging. */
struct property {
char *key; /* name of the property */
unsigned char idx; /* index into valuelist */
unsigned char type; /* string, integer, double, value, expression */
unsigned char merge; /* how property changes when devices are merged */
char *pin; /* associated pin (or NULL if not associated) */
union {
char *string;
double dval;
int ival;
struct tokstack *stack;
} pdefault; /* Default value */
union {
double dval;
int ival;
} slop; /* slop allowance in property */
};
/*-------------------------------*/
/* list of objects within a cell */
/*-------------------------------*/
struct objlist {
char *name; /* unique name for the port/node/pin/property */
int type; /* -1 for port, 0 for internal node,
else index of the pin on element */
union {
char *class; /* name of element class; nullstr for nodes */
int port; /* Port number, if type is a port */
} model;
union {
char *name; /* unique name for the instance, or */
/* (string) value of property for properties */
struct valuelist *props; /* Property record */
} instance;
unsigned char flags; /* Used by NODE type to flag isolated net */
int node; /* the electrical node number of the port/node/pin */
struct objlist *next;
};
extern struct objlist *LastPlaced;
/* Record structure for maintaining lists of cell classes to ignore */
struct IgnoreList {
char *class;
int file;
unsigned char type;
struct IgnoreList *next;
};
/* Types used by IgnoreList above */
#define IGNORE_NONE (unsigned char)0
#define IGNORE_CLASS (unsigned char)1
#define IGNORE_SHORTED (unsigned char)2
/* Record structure for handling pin permutations in a cell */
/* Linked list structure allows multiple permutations per cell. */
struct Permutation {
char *pin1;
char *pin2;
struct Permutation *next;
};
#define OBJHASHSIZE 42073 /* the size of the object and instance hash lists */
/* prime numbers are good choices as hash sizes */
/* cell definition for hash table */
/* NOTE: "file" must come first for the hash matching by name and file */
struct nlist {
int file; /* internally ordered file to which cell belongs, or -1 */
char *name;
int number; /* number of instances defined */
int dumped; /* instance count, and general-purpose marker */
unsigned short flags;
unsigned char class;
unsigned long classhash; /* randomized hash value for cell class */
struct Permutation *permutes; /* list of permuting pins */
struct objlist *cell;
struct hashdict objdict; /* hash table of object names */
struct hashdict instdict; /* hash table of instance names */
struct hashdict propdict; /* hash table of property keys */
struct objlist **nodename_cache;
long nodename_cache_maxnodenum; /* largest node number in cache */
void *embedding; /* this will be cast to the appropriate data structure */
struct nlist *next;
};
/* Defined nlist structure flags */
#define CELL_MATCHED 0x001 /* cell matched to another */
#define CELL_NOCASE 0x002 /* cell is case-insensitive (e.g., SPICE) */
#define CELL_TOP 0x004 /* cell is a top-level cell */
#define CELL_PLACEHOLDER 0x008 /* cell is a placeholder cell */
#define CELL_PROPSMATCHED 0x010 /* properties matched to matching cell */
#define CELL_DUPLICATE 0x020 /* cell has a duplicate */
#define CELL_VERILOG 0x040 /* cell is verilog module */
/* Flags for combination allowances and prohibitions */
#define COMB_SERIES 0x100
#define COMB_NO_PARALLEL 0x200
extern struct nlist *CurrentCell;
extern struct objlist *CurrentTail;
extern void AddToCurrentCell(struct objlist *ob);
extern void AddToCurrentCellNoHash(struct objlist *ob);
extern void AddInstanceToCurrentCell(struct objlist *ob);
extern void FreeObject(struct objlist *ob);
extern void FreeObjectAndHash(struct objlist *ob, struct nlist *ptr);
extern void FreePorts(char *cellname);
extern struct IgnoreList *ClassIgnore;
extern int NumberOfPorts(char *cellname, int file);
extern struct objlist *InstanceNumber(struct nlist *tp, int inst);
extern struct objlist *List(char *list_template);
extern struct objlist *ListExact(char *list_template);
extern struct objlist *ListCat(struct objlist *ls1, struct objlist *ls2);
extern int ListLen(struct objlist *head);
extern int ListLength(char *list_template);
extern struct nlist *LookupPrematchedClass(struct nlist *, int);
extern struct objlist *LookupObject(char *name, struct nlist *WhichCell);
extern struct objlist *LookupInstance(char *name, struct nlist *WhichCell);
extern struct objlist *CopyObjList(struct objlist *oldlist, unsigned char doforall);
extern void UpdateNodeNumbers(struct objlist *lst, int from, int to);
/* Function pointer to List or ListExact, allowing regular expressions */
/* to be enabled/disabled. */
extern struct objlist * (*ListPtr)();
extern void PrintCellHashTable(int full, int file);
extern struct nlist *LookupCell(char *s);
extern struct nlist *LookupCellFile(char *s, int f);
extern struct nlist *InstallInCellHashTable(char *name, int f);
extern void InitCellHashTable(void);
extern void ClearDumpedList(void);
extern int RecurseCellHashTable(int (*foo)(struct hashlist *np));
extern int RecurseCellFileHashTable(int (*foo)(struct hashlist *, int), int);
extern struct nlist *RecurseCellHashTable2(struct nlist *(*foo)(struct hashlist *,
void *), void *);
extern struct nlist *FirstCell(void);
extern struct nlist *NextCell(void);
extern char *NodeName(struct nlist *tp, int node);
extern char *NodeAlias(struct nlist *tp, struct objlist *ob);
extern void FreeNodeNames(struct nlist *tp);
extern void CacheNodeNames(struct nlist *tp);
/* enable the following line to debug the core allocator */
/* #define DEBUG_GARBAGE */
#ifdef DEBUG_GARBAGE
extern struct objlist *GetObject(void);
extern struct keyvalue *NewKeyValue(void);
extern struct property *NewProperty(void);
extern struct valuelist *NewPropValue(int entries);
extern void FreeString(char *foo);
extern char *strsave(char *s);
#else /* not DEBUG_GARBAGE */
#define GetObject() ((struct objlist*)CALLOC(1,sizeof(struct objlist)))
#define NewProperty() ((struct property*)CALLOC(1,sizeof(struct property)))
#define NewPropValue(a) ((struct valuelist*)CALLOC((a),sizeof(struct valuelist)))
#define NewKeyValue() ((struct keyvalue*)CALLOC(1,sizeof(struct keyvalue)))
#define FreeString(a) (FREE(a))
#define strsave(a) (STRDUP(a))
#endif /* not DEBUG_GARBAGE */
extern int freeprop(struct hashlist *p);
extern int match(char *, char *);
extern int matchnocase(char *, char *);
extern int matchfile(char *, char *, int, int);
extern int matchfilenocase(char *, char *, int, int);
extern void GarbageCollect(void);
extern void InitGarbageCollection(void);
extern void AddToGarbageList(struct objlist *head);
extern void DeleteProperties(struct keyvalue **topptr);
extern void AddProperty(struct keyvalue **topptr, char *key, char *value);
extern void AddScaledProperty(struct keyvalue **topptr, char *key, char *value, double scale);
extern void DeleteProperties(struct keyvalue **topptr);
extern struct objlist *LinkProperties(char *model, struct keyvalue *topptr);
extern void ClassDelete(char *class, int file);
extern void RemoveShorted(char *class, int file);
extern void CellRehash(char *name, char *newname, int file);
/* defined in netgen.c */
extern int ConvertStringToInteger(char *string, int *ival);
#ifdef HAVE_MALLINFO
void PrintMemoryStats(void);
#endif
#endif /* _OBJLIST_H */