diff --git a/.gitignore b/.gitignore index 895ab2b6e..ba885fa6d 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,7 @@ Makefile /_pli_types.h config.h +/tgt-pcb/pcb_config.h /tgt-vvp/vvp_config.h /tgt-vhdl/vhdl_config.h /vpi/vpi_config.h diff --git a/Makefile.in b/Makefile.in index 7eac1a986..a58de7a63 100644 --- a/Makefile.in +++ b/Makefile.in @@ -39,7 +39,7 @@ srcdir = @srcdir@ datarootdir = @datarootdir@ SUBDIRS = ivlpp vhdlpp vvp vpi libveriuser cadpli tgt-null tgt-stub tgt-vvp \ - tgt-vhdl tgt-vlog95 driver + tgt-vhdl tgt-vlog95 tgt-pcb driver # Only run distclean for these directories. NOTUSED = tgt-fpga tgt-pal tgt-verilog diff --git a/configure.in b/configure.in index cae2abf7c..56e2fc408 100644 --- a/configure.in +++ b/configure.in @@ -8,6 +8,7 @@ AC_CONFIG_HEADER(vpi/vpi_config.h) AC_CONFIG_HEADER(libveriuser/config.h) AC_CONFIG_HEADER(tgt-vvp/vvp_config.h) AC_CONFIG_HEADER(tgt-vhdl/vhdl_config.h) +AC_CONFIG_HEADER(tgt-pcb/pcb_config.h) AC_CANONICAL_HOST dnl Checks for programs. @@ -299,4 +300,4 @@ AC_MSG_RESULT(ok) # XXX disable tgt-fpga for the moment -AC_OUTPUT(Makefile ivlpp/Makefile vhdlpp/Makefile vvp/Makefile vpi/Makefile driver/Makefile driver-vpi/Makefile cadpli/Makefile libveriuser/Makefile tgt-null/Makefile tgt-stub/Makefile tgt-vvp/Makefile tgt-vhdl/Makefile tgt-fpga/Makefile tgt-verilog/Makefile tgt-pal/Makefile tgt-vlog95/Makefile) +AC_OUTPUT(Makefile ivlpp/Makefile vhdlpp/Makefile vvp/Makefile vpi/Makefile driver/Makefile driver-vpi/Makefile cadpli/Makefile libveriuser/Makefile tgt-null/Makefile tgt-stub/Makefile tgt-vvp/Makefile tgt-vhdl/Makefile tgt-fpga/Makefile tgt-verilog/Makefile tgt-pal/Makefile tgt-vlog95/Makefile tgt-pcb/Makefile) diff --git a/tgt-pcb/Makefile.in b/tgt-pcb/Makefile.in new file mode 100644 index 000000000..328d7cf5a --- /dev/null +++ b/tgt-pcb/Makefile.in @@ -0,0 +1,109 @@ +# +# This source code is free software; you can redistribute it +# and/or modify it in source code form under the terms of the GNU +# Library General Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Library General Public License for more details. +# +# You should have received a copy of the GNU Library General Public +# License along with this program; if not, write to the Free +# Software Foundation, Inc., +# 59 Temple Place - Suite 330 +# Boston, MA 02111-1307, USA +# +SHELL = /bin/sh + +suffix = @install_suffix@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +srcdir = @srcdir@ + +VPATH = $(srcdir) + +bindir = @bindir@ +libdir = @libdir@ + +CC = @CC@ +CXX = @CXX@ +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ + +ifeq (@srcdir@,.) +INCLUDE_PATH = -I. -I.. +else +INCLUDE_PATH = -I. -I.. -I$(srcdir) -I$(srcdir)/.. +endif + +CPPFLAGS = $(INCLUDE_PATH) @CPPFLAGS@ @DEFS@ @PICFLAG@ +CFLAGS = @WARNING_FLAGS@ @CFLAGS@ +LDFLAGS = @LDFLAGS@ + +O = pcb.o scope.o show_netlist.o + +all: dep pcb.tgt + +check: all + +clean: + rm -rf *.o dep pcb.tgt + +distclean: clean + rm -f Makefile config.log + +cppcheck: $(O:.o=.c) + cppcheck --enable=all -f $(INCLUDE_PATH) $^ + +Makefile: $(srcdir)/Makefile.in ../config.status + cd ..; ./config.status --file=tgt-pcb/$@ + +dep: + mkdir dep + +%.o: %.c + $(CC) $(CPPFLAGS) $(CFLAGS) @DEPENDENCY_FLAG@ -c $< -o $*.o + mv $*.d dep + +%.o: %.cc + $(CXX) $(CPPFLAGS) $(CXXFLAGS) @DEPENDENCY_FLAG@ -c $< -o $*.o + mv $*.d dep + +ifeq (@WIN32@,yes) + TGTLDFLAGS=-L.. -livl + TGTDEPLIBS=../libivl.a +else + TGTLDFLAGS= + TGTDEPLIBS= +endif + +pcb.tgt: $O $(TGTDEPLIBS) + $(CC) @shared@ -o $@ $O $(TGTLDFLAGS) + +install: all installdirs $(libdir)/ivl$(suffix)/pcb.tgt $(INSTALL_DOC) $(libdir)/ivl$(suffix)/pcb.conf $(libdir)/ivl$(suffix)/pcb-s.conf + +$(libdir)/ivl$(suffix)/pcb.tgt: ./pcb.tgt + $(INSTALL_PROGRAM) ./pcb.tgt "$(DESTDIR)$(libdir)/ivl$(suffix)/pcb.tgt" + +$(libdir)/ivl$(suffix)/pcb.conf: $(srcdir)/pcb.conf + $(INSTALL_DATA) $(srcdir)/pcb.conf "$(DESTDIR)$(libdir)/ivl$(suffix)/pcb.conf" + +$(libdir)/ivl$(suffix)/pcb-s.conf: $(srcdir)/pcb-s.conf + $(INSTALL_DATA) $(srcdir)/pcb-s.conf "$(DESTDIR)$(libdir)/ivl$(suffix)/pcb-s.conf" + + +installdirs: $(srcdir)/../mkinstalldirs + $(srcdir)/../mkinstalldirs "$(DESTDIR)$(bindir)" "$(DESTDIR)$(libdir)/ivl$(suffix)" + +uninstall: + rm -f "$(DESTDIR)$(libdir)/ivl$(suffix)/pcb.tgt" + rm -f "$(DESTDIR)$(libdir)/ivl$(suffix)/pcb.conf" + rm -f "$(DESTDIR)$(libdir)/ivl$(suffix)/pcb-s.conf" + + +-include $(patsubst %.o, dep/%.d, $O) diff --git a/tgt-pcb/pcb.cc b/tgt-pcb/pcb.cc new file mode 100644 index 000000000..7ac2e3c66 --- /dev/null +++ b/tgt-pcb/pcb.cc @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2011 Stephen Williams (steve@icarus.com) + * + * This source code is free software; you can redistribute it + * and/or modify it in source code form under the terms of the GNU + * General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +/* + * This is a PCB target module. + */ + +# include "version_base.h" +# include "version_tag.h" +# include "pcb_config.h" +# include +# include +# include "pcb_priv.h" +# include "ivl_target.h" + +static const char*version_string = +"Icarus Verilog PCB Netlist Generator " VERSION " (" VERSION_TAG ")\n\n" +"Copyright (c) 2011 Stephen Williams (steve@icarus.com)\n\n" +" This program is free software; you can redistribute it and/or modify\n" +" it under the terms of the GNU General Public License as published by\n" +" the Free Software Foundation; either version 2 of the License, or\n" +" (at your option) any later version.\n" +"\n" +" This program is distributed in the hope that it will be useful,\n" +" but WITHOUT ANY WARRANTY; without even the implied warranty of\n" +" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" +" GNU General Public License for more details.\n" +"\n" +" You should have received a copy of the GNU General Public License along\n" +" with this program; if not, write to the Free Software Foundation, Inc.,\n" +" 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n" +; + + +int target_design(ivl_design_t des) +{ + ivl_scope_t*root_scopes; + unsigned nroot; + unsigned idx; + FILE*fnet; + int rc = 0; + const char*path = ivl_design_flag(des, "-o"); + if (path == 0) { + return -1; + } + + fnet = fopen(path, "w"); + if (fnet == 0) { + perror (path); + return -2; + } + + ivl_design_roots(des, &root_scopes, &nroot); + for (idx = 0 ; idx < nroot ; idx += 1) { + int tmp = scan_scope(root_scopes[idx]); + if (tmp != 0) { + rc = tmp; + break; + } + } + + show_netlist(fnet); + + fclose(fnet); + return rc; +} + + +const char* target_query(const char*key) +{ + if (strcmp(key,"version") == 0) + return version_string; + + return 0; +} diff --git a/tgt-pcb/pcb.conf b/tgt-pcb/pcb.conf new file mode 100644 index 000000000..7dc3d1117 --- /dev/null +++ b/tgt-pcb/pcb.conf @@ -0,0 +1,3 @@ +functor:cprop +functor:nodangle +flag:DLL=pcb.tgt diff --git a/tgt-pcb/pcb_config.h.in b/tgt-pcb/pcb_config.h.in new file mode 100644 index 000000000..32ee73711 --- /dev/null +++ b/tgt-pcb/pcb_config.h.in @@ -0,0 +1,28 @@ +#ifndef __pcb_config_H +#define __pcb_config_H +/* + * Copyright (c) 2011 Stephen Williams (steve@icarus.com) + * + * This source code is free software; you can redistribute it + * and/or modify it in source code form under the terms of the GNU + * General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +# undef HAVE_STDINT_H +# undef HAVE_INTTYPES_H + +# undef _LARGEFILE_SOURCE +# undef _LARGEFILE64_SOURCE + +#endif /* __pcb_config_H */ diff --git a/tgt-pcb/pcb_priv.h b/tgt-pcb/pcb_priv.h new file mode 100644 index 000000000..8ff7a12d8 --- /dev/null +++ b/tgt-pcb/pcb_priv.h @@ -0,0 +1,39 @@ +#ifndef __pcb_priv_H +#define __pcb_priv_H +/* + * Copyright (c) 2011 Stephen Williams (steve@icarus.com) + * + * This source code is free software; you can redistribute it + * and/or modify it in source code form under the terms of the GNU + * General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +# include +# include +# include +# include +# include + +extern int scan_scope(ivl_scope_t scope); + +struct nexus_data { + std::string name; + std::set pins; +}; + +extern std::list nexus_list; + +extern void show_netlist(FILE*fnet); + +#endif diff --git a/tgt-pcb/scope.cc b/tgt-pcb/scope.cc new file mode 100644 index 000000000..66ee706a2 --- /dev/null +++ b/tgt-pcb/scope.cc @@ -0,0 +1,121 @@ +/* + * Copyright (c) 2011 Stephen Williams (steve@icarus.com) + * + * This source code is free software; you can redistribute it + * and/or modify it in source code form under the terms of the GNU + * General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +# include "pcb_priv.h" +# include +# include + +using namespace std; + +list nexus_list; + +static void sheet_box(ivl_scope_t scope); +static void black_box(ivl_scope_t scope); + +static string wire_name(ivl_signal_t sig); + +int scan_scope(ivl_scope_t scope) +{ + int black_box_flag = 0; + int idx; + + // Scan the attributes, looking in particular for the + // black_box attribute. + for (idx = 0 ; idx < ivl_scope_attr_cnt(scope) ; idx += 1) { + ivl_attribute_t attr = ivl_scope_attr_val(scope, idx); + if (strcmp(attr->key, "ivl_black_box") == 0) + black_box_flag = 1; + } + + // If this scope is a black box, then process it + // so. Otherwise, process it as a sheet, which will recurse. + if (black_box_flag) { + black_box(scope); + } else { + sheet_box(scope); + } + + return 0; +} + +static int child_scan_fun(ivl_scope_t scope, void*) +{ + int rc = scan_scope(scope); + return 0; +} + +void sheet_box(ivl_scope_t scope) +{ + printf("Sheet %s...\n", ivl_scope_name(scope)); + unsigned sigs = ivl_scope_sigs(scope); + for (unsigned idx = 0 ; idx < sigs ; idx += 1) { + ivl_signal_t sig = ivl_scope_sig(scope, idx); + printf(" Wire %s\n", ivl_signal_basename(sig)); + + assert(ivl_signal_array_count(sig) == 1); + ivl_nexus_t nex = ivl_signal_nex(sig, 0); + + struct nexus_data*nex_data = reinterpret_cast + (ivl_nexus_get_private(nex)); + if (nex_data == 0) { + nex_data = new nexus_data; + nex_data->name = wire_name(sig); + nexus_list.push_back(nex_data); + ivl_nexus_set_private(nex, nex_data); + } + } + + ivl_scope_children(scope, child_scan_fun, 0); +} + +/* + * A black box is a component. Do not process the contents, other then + * to get at the ports that we'll attach to the netlist. + */ +static void black_box(ivl_scope_t scope) +{ + assert(ivl_scope_type(scope) == IVL_SCT_MODULE); + printf(" Component %s is %s\n", ivl_scope_name(scope), ivl_scope_tname(scope)); + unsigned sigs = ivl_scope_sigs(scope); + + for (unsigned idx = 0 ; idx < sigs ; idx += 1) { + ivl_signal_t sig = ivl_scope_sig(scope, idx); + ivl_signal_port_t sip = ivl_signal_port(sig); + // Skip signals that are not ports. + if (sip == IVL_SIP_NONE) + continue; + + assert(ivl_signal_array_count(sig) == 1); + ivl_nexus_t nex = ivl_signal_nex(sig, 0); + struct nexus_data*nex_data = reinterpret_cast(ivl_nexus_get_private(nex)); + assert(nex_data); + + string refdes = ivl_scope_basename(scope); + string pindes = ivl_signal_basename(sig); + string pin = refdes + "-" + pindes; + nex_data->pins.insert(pin); + printf(" port %s\n", ivl_signal_basename(sig)); + } +} + +static string wire_name(ivl_signal_t sig) +{ + string res = ivl_signal_basename(sig); + return res; +} diff --git a/tgt-pcb/show_netlist.cc b/tgt-pcb/show_netlist.cc new file mode 100644 index 000000000..a64445663 --- /dev/null +++ b/tgt-pcb/show_netlist.cc @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2011 Stephen Williams (steve@icarus.com) + * + * This source code is free software; you can redistribute it + * and/or modify it in source code form under the terms of the GNU + * General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +# include "pcb_priv.h" + +using namespace std; + +void show_netlist(FILE*fnet) +{ + for (list::iterator cur = nexus_list.begin() + ; cur != nexus_list.end() ; ++ cur) { + + nexus_data*curp = *cur; + fprintf(fnet, "%s", curp->name.c_str()); + for (set::const_iterator cp = curp->pins.begin() + ; cp != curp->pins.end() ; ++ cp) { + fprintf(fnet, " %s", cp->c_str()); + } + fprintf(fnet, "\n"); + } +}