From b5c70decbddbb23dc5ff1f3f5cafcb59db34a1b8 Mon Sep 17 00:00:00 2001 From: Kamyar Mohajerani Date: Tue, 16 Nov 2021 20:06:15 -0500 Subject: [PATCH] fix wrong 'hash' being linked in + C99 compat This fixes crash on macos due to wrong hash() being linked in. It also makes sure that proper function defs are declared and available (as required by C99) to make compile possible in newer compilers (e.g. Apple clang) and to some extend prevent similar linkage issues happening again. --- base/ext.c | 8 +++-- base/flatten.h | 6 ++++ base/hash.c | 4 +-- base/hash.h | 40 +++++++++++------------ base/netcmp.c | 6 +++- base/netcmp.h | 81 ++++++++++++++++++++++++++--------------------- base/netgen.h | 2 ++ base/objlist.c | 7 ++-- base/objlist.h | 13 ++++++++ base/query.c | 2 +- base/spice.c | 3 ++ base/tech.h | 8 +++++ base/verilog.c | 4 +-- base/xilinx.c | 16 ++++------ base/xilinx.h | 10 ++++++ tcltk/Makefile | 2 +- tcltk/tclnetgen.c | 4 ++- 17 files changed, 137 insertions(+), 79 deletions(-) create mode 100644 base/flatten.h create mode 100644 base/tech.h create mode 100644 base/xilinx.h diff --git a/base/ext.c b/base/ext.c index 747b1e9..8f27d7d 100644 --- a/base/ext.c +++ b/base/ext.c @@ -23,12 +23,14 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include /* for strtod() */ #include +#include +#include #include "netgen.h" -#include "hash.h" #include "objlist.h" #include "netfile.h" #include "print.h" +#include "hash.h" void extCell(char *name, int filenum) { @@ -186,7 +188,7 @@ char *ReadExt(char *fname, int doflat, int *fnum) /* Make sure all .ext file reading is case sensitive */ matchfunc = match; matchintfunc = matchfile; - hashfunc = hash; + hashfunc = my_hash; if (LookupCellFile(fname, filenum) != NULL) { Printf("Error: Duplicate cell name \"%s\"!\n", fname); @@ -652,7 +654,7 @@ char *ReadSim(char *fname, int *fnum) /* Make sure all .sim file reading is case sensitive */ matchfunc = match; matchintfunc = matchfile; - hashfunc = hash; + hashfunc = my_hash; CellDef(fname, filenum); diff --git a/base/flatten.h b/base/flatten.h new file mode 100644 index 0000000..605ab1b --- /dev/null +++ b/base/flatten.h @@ -0,0 +1,6 @@ +#ifndef _FLATTEN_H +#define _FLATTEN_H + +void flattenCell(char *name, int file); + +#endif /* _FLATTEN_H */ \ No newline at end of file diff --git a/base/hash.c b/base/hash.c index bd3ba58..40a2a84 100644 --- a/base/hash.c +++ b/base/hash.c @@ -30,8 +30,8 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #endif #include "netgen.h" -#include "hash.h" #include "objlist.h" +#include "hash.h" unsigned long (*hashfunc)(char *, int) = NULL; int (*matchfunc)(char *, char *) = NULL; @@ -148,7 +148,7 @@ unsigned long hashnocase(char *s, int hashsize) return (hashsize == 0) ? hashval : (hashval % hashsize); } -unsigned long hash(char *s, int hashsize) +unsigned long my_hash(char *s, int hashsize) { unsigned long hashval; diff --git a/base/hash.h b/base/hash.h index 4bd4c3d..be5a30d 100644 --- a/base/hash.h +++ b/base/hash.h @@ -15,40 +15,40 @@ struct hashdict { }; -extern void InitializeHashTable(struct hashdict *dict, int size); -extern int RecurseHashTable(struct hashdict *dict, +void InitializeHashTable(struct hashdict *dict, int size); +int RecurseHashTable(struct hashdict *dict, int (*func)(struct hashlist *elem)); -extern int RecurseHashTableValue(struct hashdict *dict, +int RecurseHashTableValue(struct hashdict *dict, int (*func)(struct hashlist *elem, int), int); -extern struct nlist *RecurseHashTablePointer(struct hashdict *dict, +struct nlist *RecurseHashTablePointer(struct hashdict *dict, struct nlist *(*func)(struct hashlist *elem, void *), void *pointer); -extern void HashDelete(char *name, struct hashdict *dict); -extern void HashIntDelete(char *name, int value, struct hashdict *dict); -extern void HashKill(struct hashdict *dict); +void HashDelete(char *name, struct hashdict *dict); +void HashIntDelete(char *name, int value, struct hashdict *dict); +void HashKill(struct hashdict *dict); -extern int CountHashTableEntries(struct hashlist *p); -extern int CountHashTableBinsUsed(struct hashlist *p); +int CountHashTableEntries(struct hashlist *p); +int CountHashTableBinsUsed(struct hashlist *p); /* these functions return a pointer to a hash list element */ -extern struct hashlist *HashInstall(char *name, struct hashdict *dict); -extern struct hashlist *HashPtrInstall(char *name, void *ptr, +struct hashlist *HashInstall(char *name, struct hashdict *dict); +struct hashlist *HashPtrInstall(char *name, void *ptr, struct hashdict *dict); -extern struct hashlist *HashIntPtrInstall(char *name, int value, void *ptr, +struct hashlist *HashIntPtrInstall(char *name, int value, void *ptr, struct hashdict *dict); -extern struct hashlist *HashInt2PtrInstall(char *name, int c, void *ptr, +struct hashlist *HashInt2PtrInstall(char *name, int c, void *ptr, struct hashdict *dict); /* these functions return the ->ptr field of a struct hashlist */ -extern void *HashLookup(char *s, struct hashdict *dict); -extern void *HashIntLookup(char *s, int i, struct hashdict *dict); -extern void *HashInt2Lookup(char *s, int c, struct hashdict *dict); -extern void *HashFirst(struct hashdict *dict); -extern void *HashNext(struct hashdict *dict); +void *HashLookup(char *s, struct hashdict *dict); +void *HashIntLookup(char *s, int i, struct hashdict *dict); +void *HashInt2Lookup(char *s, int c, struct hashdict *dict); +void *HashFirst(struct hashdict *dict); +void *HashNext(struct hashdict *dict); -extern unsigned long hashnocase(char *s, int hashsize); -extern unsigned long hash(char *s, int hashsize); +unsigned long hashnocase(char *s, int hashsize); +unsigned long my_hash(char *s, int hashsize); extern int (*matchfunc)(char *, char *); /* matchintfunc() compares based on the name and the first */ diff --git a/base/netcmp.c b/base/netcmp.c index 4b8d19b..4430e51 100644 --- a/base/netcmp.c +++ b/base/netcmp.c @@ -21,11 +21,13 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "config.h" #include +#include /* for rand(), abs(), etc */ #include #include #include /* for time() as a seed for random number generator */ #include #include /* for fabs() */ +#include /* for toupper() */ #ifdef IBMPC #include @@ -35,6 +37,7 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifdef TCL_NETGEN #include +int check_interrupt(); #endif #include "netgen.h" @@ -45,6 +48,7 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "netfile.h" #include "print.h" #include "dbug.h" +#include "hash.h" #ifdef TCL_NETGEN int InterruptPending = 0; @@ -3757,7 +3761,7 @@ void CreateTwoLists(char *name1, int file1, char *name2, int file2, int dolist) /* determine if matching will be case sensitive or case insensitive */ matchfunc = match; matchintfunc = matchfile; - hashfunc = hash; + hashfunc = my_hash; if (tc1 != NULL && tc2 != NULL) { if ((tc1->flags & CELL_NOCASE) && (tc2->flags & CELL_NOCASE)) { matchfunc = matchnocase; diff --git a/base/netcmp.h b/base/netcmp.h index 9d289f0..62d8da0 100644 --- a/base/netcmp.h +++ b/base/netcmp.h @@ -18,50 +18,59 @@ extern int InterruptPending; /* Exported procedures */ -extern void PrintElementClasses(struct ElementClass *EC, int type, int dolist); -extern void PrintNodeClasses(struct NodeClass *NC, int type, int dolist); -extern void SummarizeNodeClasses(struct NodeClass *NC); -extern void PrintPropertyResults(int do_list); -extern void PrintCoreStats(void); -extern void ResetState(void); -extern void CreateTwoLists(char *name1, int file1, char *name2, int file2, +void PrintElementClasses(struct ElementClass *EC, int type, int dolist); +void PrintNodeClasses(struct NodeClass *NC, int type, int dolist); +void SummarizeNodeClasses(struct NodeClass *NC); +void PrintPropertyResults(int do_list); +void PrintCoreStats(void); +void ResetState(void); +void CreateTwoLists(char *name1, int file1, char *name2, int file2, int dolist); -extern int Iterate(void); -extern int VerifyMatching(void); -extern void PrintAutomorphisms(void); -extern int ResolveAutomorphisms(void); -extern void PermuteAutomorphisms(void); -extern int Permute(void); -extern int PermuteSetup(char *model, int filenum, char *pin1, char *pin2); -extern int PermuteForget(char *model, int filenum, char *pin1, char *pin2); -extern int EquivalenceElements(char *name1, int file1, char *name2, int file2); -extern int EquivalenceNodes(char *name1, int file1, char *name2, int file2); -extern int EquivalenceClasses(char *name1, int file1, char *name2, int file2); -extern int IgnoreClass(char *name, int file, unsigned char type); -extern int MatchPins(struct nlist *tp1, struct nlist *tp2, int dolist); -extern int PropertyOptimize(struct objlist *ob, struct nlist *tp, int run, +int Iterate(void); +int VerifyMatching(void); +void PrintAutomorphisms(void); +int ResolveAutomorphisms(void); +void PermuteAutomorphisms(void); +int Permute(void); +int PermuteSetup(char *model, int filenum, char *pin1, char *pin2); +int PermuteForget(char *model, int filenum, char *pin1, char *pin2); +int EquivalenceElements(char *name1, int file1, char *name2, int file2); +int EquivalenceNodes(char *name1, int file1, char *name2, int file2); +int EquivalenceClasses(char *name1, int file1, char *name2, int file2); +int IgnoreClass(char *name, int file, unsigned char type); +int MatchPins(struct nlist *tp1, struct nlist *tp2, int dolist); +int PropertyOptimize(struct objlist *ob, struct nlist *tp, int run, int series, int comb); -extern int CreateCompareQueue(char *, int, char *, int); -extern int GetCompareQueueTop(char **, int *, char **, int *); -extern int PeekCompareQueueTop(char **, int *, char **, int *); -extern void RemoveCompareQueue(); +int CreateCompareQueue(char *, int, char *, int); +int GetCompareQueueTop(char **, int *, char **, int *); +int PeekCompareQueueTop(char **, int *, char **, int *); +void RemoveCompareQueue(); -extern void PrintIllegalClasses(); -extern void PrintIllegalNodeClasses(); -extern void PrintIllegalElementClasses(); +void PrintIllegalClasses(); +void PrintIllegalNodeClasses(); +void PrintIllegalElementClasses(); + +void DumpNetwork(struct objlist *ob, int cidx); +void DumpNetworkAll(char *name, int file); + +void RegroupDataStructures(); +void FormatIllegalElementClasses(); +void FormatIllegalNodeClasses(); +int ResolveAutomorphsByProperty(); +int ResolveAutomorphsByPin(); +void SummarizeElementClasses(struct ElementClass *EC); +int remove_group_tags(struct objlist *ob); -extern void DumpNetwork(struct objlist *ob, int cidx); -extern void DumpNetworkAll(char *name, int file); #ifdef TCL_NETGEN -extern int EquivalentNode(); -extern int EquivalentElement(); +int EquivalentNode(); +int EquivalentElement(); -extern void enable_interrupt(); -extern void disable_interrupt(); +void enable_interrupt(); +void disable_interrupt(); -extern Tcl_Obj *ListNodeClasses(int legal); -extern Tcl_Obj *ListElementClasses(int legal); +Tcl_Obj *ListNodeClasses(int legal); +Tcl_Obj *ListElementClasses(int legal); #endif diff --git a/base/netgen.h b/base/netgen.h index b60893c..982fc9b 100644 --- a/base/netgen.h +++ b/base/netgen.h @@ -18,6 +18,8 @@ #define HORIZONTAL 1 #define VERTICAL 2 +int UniquePins(char *name, int filenum); + /* netgen.c */ extern void ReopenCellDef(char *name, int file); extern void CellDef(char *name, int file); diff --git a/base/objlist.c b/base/objlist.c index 17102f2..2cdbb86 100644 --- a/base/objlist.c +++ b/base/objlist.c @@ -22,6 +22,7 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include +#include #ifdef IBMPC #include #endif @@ -31,13 +32,13 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #endif #include "netgen.h" -#include "hash.h" #include "objlist.h" #include "regexp.h" #include "dbug.h" #include "print.h" #include "netfile.h" #include "netcmp.h" +#include "hash.h" #ifdef TCL_NETGEN extern Tcl_Interp *netgeninterp; @@ -178,7 +179,7 @@ char *strsave(char *s) int match(char *st1, char *st2) { - if (0==strcmp(st1,st2)) return(1); + if (0==strncmp(st1,st2,PATH_MAX)) return(1); else return(0); } @@ -288,7 +289,7 @@ static struct hashdict cell_dict; void InitCellHashTable(void) { - hashfunc = hash; + hashfunc = my_hash; matchfunc = NULL; matchintfunc = matchfile; InitializeHashTable(&cell_dict, CELLHASHSIZE); diff --git a/base/objlist.h b/base/objlist.h index 500018e..b3d9f4c 100644 --- a/base/objlist.h +++ b/base/objlist.h @@ -312,6 +312,19 @@ extern void GarbageCollect(void); extern void InitGarbageCollection(void); extern void AddToGarbageList(struct objlist *head); +void DeleteProperties(struct keyvalue **topptr); +void AddProperty(struct keyvalue **topptr, char *key, char *value); +void AddScaledProperty(struct keyvalue **topptr, char *key, char *value, double scale); +void DeleteProperties(struct keyvalue **topptr); +struct objlist *LinkProperties(char *model, struct keyvalue *topptr); + +void ClassDelete(char *class, int file); +void RemoveShorted(char *class, int file); +void CellRehash(char *name, char *newname, int file); + +/* defined in netgen.c */ +int ConvertStringToInteger(char *string, int *ival); + #ifdef HAVE_MALLINFO void PrintMemoryStats(void); #endif diff --git a/base/query.c b/base/query.c index b22c2d3..55147cd 100644 --- a/base/query.c +++ b/base/query.c @@ -1033,7 +1033,7 @@ void Query(void) break; case 'v': promptstring("Write Verilog: circuit name: ", repstr); - VerilogModule(repstr, filenum, ""); + VerilogTop(repstr, filenum, ""); break; case 'E': promptstring("Write ESACAP: circuit name: ", repstr); diff --git a/base/spice.c b/base/spice.c index 7c83788..95378e0 100644 --- a/base/spice.c +++ b/base/spice.c @@ -26,6 +26,7 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #endif #include /* for calloc(), free(), getenv() */ +#include /* for toupper(), isascii() */ #ifndef IBMPC #include /* for getpwnam() tilde expansion */ #include @@ -40,6 +41,8 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "objlist.h" #include "netfile.h" #include "print.h" +#include "query.h" +#include "objlist.h" // Global storage for parameters from .PARAM struct hashdict spiceparams; diff --git a/base/tech.h b/base/tech.h new file mode 100644 index 0000000..82d31c4 --- /dev/null +++ b/base/tech.h @@ -0,0 +1,8 @@ +#ifndef _TECH_H +#define _TECH_H + +int ActelLibPresent(void); +void ActelLib(void); +void VerilogTop(char *name, int fnum, char *filename); + +#endif /* _TECH_H */ \ No newline at end of file diff --git a/base/verilog.c b/base/verilog.c index f5ac6b0..5b92a90 100644 --- a/base/verilog.c +++ b/base/verilog.c @@ -52,10 +52,10 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #endif #include "netgen.h" -#include "hash.h" #include "objlist.h" #include "netfile.h" #include "print.h" +#include "hash.h" // See netfile.c for explanation of delimiters. 'X' // separates single-character delimiters from two-character delimiters. @@ -2239,7 +2239,7 @@ char *ReadVerilogTop(char *fname, int *fnum, int blackbox) else { matchfunc = match; matchintfunc = matchfile; - hashfunc = hash; + hashfunc = my_hash; } InitializeHashTable(&verilogparams, OBJHASHSIZE); diff --git a/base/xilinx.c b/base/xilinx.c index b448364..71beda2 100644 --- a/base/xilinx.c +++ b/base/xilinx.c @@ -23,6 +23,7 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include +#include #ifdef IBMPC #include /* for strtol on PC */ @@ -33,6 +34,8 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "netfile.h" #include "hash.h" #include "print.h" +#include "xilinx.h" +#include "flatten.h" #define XILINXHASHSIZE 99 static long xilinxhashbase = 0xA00; @@ -132,10 +135,8 @@ char *xilinx_class(model) } return(model); } -void -Xilinx(cellname, filename) - char *cellname; - char *filename; + +void Xilinx(char *cellname, char *filename) { char Path[500]; char FileName[500]; @@ -163,8 +164,7 @@ Xilinx(cellname, filename) CloseFile(FileName); } -xilinxCell(cell) - char *cell; +int xilinxCell(char *cell) { struct nlist *nl; struct objlist *ob; @@ -252,9 +252,7 @@ struct objlist *xilinx_gate(ob,nl) return(nob); } -xilinx_sym(nl,gob) - struct nlist *nl; - struct objlist *gob; +void xilinx_sym(struct nlist *nl, struct objlist *gob) { struct objlist *ob; char *cp,*rindex(); diff --git a/base/xilinx.h b/base/xilinx.h new file mode 100644 index 0000000..bb6b7c6 --- /dev/null +++ b/base/xilinx.h @@ -0,0 +1,10 @@ +#ifndef _XILINX_H +#define _XILINX_H + +void xilinx_sym(struct nlist *nl, struct objlist *gob); +void Xilinx(char *cellname, char *filename); +int xilinxCell(char *cell); +int XilinxLibPresent(void); +void XilinxLib(void); + +#endif /* _XILINX_H */ \ No newline at end of file diff --git a/tcltk/Makefile b/tcltk/Makefile index e74b1b5..c637eee 100644 --- a/tcltk/Makefile +++ b/tcltk/Makefile @@ -9,7 +9,7 @@ EXTRA_LIBS = ${MAIN_EXTRA_LIBS} DFLAGS += -DNETGEN_DATE="\"`date`\"" LIBS += -lm CLEANS += netgen.sh netgen.tcl netgenexec${EXEEXT} -CFLAGS += -I${NETGENDIR}/base +CFLAGS += -I${NETGENDIR}/base -I./base TCL_FILES = \ $(DESTDIR)${INSTALL_TCLDIR}/tkcon.tcl \ diff --git a/tcltk/tclnetgen.c b/tcltk/tclnetgen.c index f933bb8..c59e16c 100644 --- a/tcltk/tclnetgen.c +++ b/tcltk/tclnetgen.c @@ -32,6 +32,8 @@ the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "print.h" #include "query.h" /* for ElementNodes() */ #include "hash.h" +#include "xilinx.h" +#include "tech.h" #ifndef TRUE #define TRUE 1 @@ -976,7 +978,7 @@ _netgen_writenet(ClientData clientData, SpiceCell(repstr, filenum, ""); break; case VERILOG_IDX: - VerilogModule(repstr, filenum, ""); + VerilogTop(repstr, filenum, ""); break; case WOMBAT_IDX: Wombat(repstr,NULL);