diff --git a/Attrib.cc b/Attrib.cc new file mode 100644 index 000000000..349d95344 --- /dev/null +++ b/Attrib.cc @@ -0,0 +1,125 @@ +/* + * Copyright (c) 2000 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 + */ +#if !defined(WINNT) +#ident "$Id: Attrib.cc,v 1.1 2000/12/04 17:37:03 steve Exp $" +#endif + +# include "Attrib.h" +# include + +Attrib::Attrib() +{ + nlist_ = 0; + list_ = 0; +} + +Attrib::~Attrib() +{ + delete[] list_; +} + +void Attrib::set_attributes(const map&attr) +{ + assert(list_ == 0); + + nlist_ = attr.size(); + list_ = new cell_[nlist_]; + + map::const_iterator idx; + unsigned jdx; + for (idx = attr.begin(), jdx = 0 ; idx != attr.end() ; idx ++, jdx++) { + struct cell_*tmp = list_ + jdx; + tmp->key = (*idx).first; + tmp->val = (*idx).second; + } +} + +string Attrib::attribute(const string&key) const +{ + for (unsigned idx = 0 ; idx < nlist_ ; idx += 1) { + + if (key == list_[idx].key) + return list_[idx].val; + } + + return ""; +} + +void Attrib::attribute(const string&key, const string&value) +{ + unsigned idx; + + for (idx = 0 ; idx < nlist_ ; idx += 1) { + if (key == list_[idx].key) { + list_[idx].val = value; + return; + } + } + + struct cell_*tmp = new struct cell_[nlist_+1]; + for (idx = 0 ; idx < nlist_ ; idx += 1) + tmp[idx] = list_[idx]; + + tmp[nlist_].key = key; + tmp[nlist_].val = value; + + nlist_ += 1; + delete[]list_; + list_ = tmp; +} + +bool Attrib::has_compat_attributes(const Attrib&that) const +{ + unsigned idx; + + for (idx = 0 ; idx < that.nlist_ ; idx += 1) { + + string tmp = attribute(that.list_[idx].key); + if (tmp != that.list_[idx].val) + return false; + } + + return true; +} + +unsigned Attrib::size() const +{ + return nlist_; +} + +string Attrib::key(unsigned idx) const +{ + assert(idx < nlist_); + return list_[idx].key; +} + +string Attrib::value(unsigned idx) const +{ + assert(idx < nlist_); + return list_[idx].val; +} + + +/* + * $Log: Attrib.cc,v $ + * Revision 1.1 2000/12/04 17:37:03 steve + * Add Attrib class for holding NetObj attributes. + * + */ + diff --git a/Attrib.h b/Attrib.h new file mode 100644 index 000000000..f7479182c --- /dev/null +++ b/Attrib.h @@ -0,0 +1,69 @@ +#ifndef __Attrib_H +#define __Attrib_H +/* + * Copyright (c) 2000 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 + */ +#if !defined(WINNT) +#ident "$Id: Attrib.h,v 1.1 2000/12/04 17:37:03 steve Exp $" +#endif + +# include +# include + +/* + * This class keeps a map of key/value pairs. The map can be set from + * an STL map, or by setting individual mappings. + */ +class Attrib { + + public: + Attrib(); + ~Attrib(); + + void set_attributes(const map&attr); + string attribute(const string&key) const; + void attribute(const string&key, const string&value); + bool has_compat_attributes(const Attrib&that) const; + + + /* Provide a means of iterating over the entries in the map. */ + unsigned size() const; + string key(unsigned idx) const; + string value(unsigned idx) const; + + private: + struct cell_ { + string key; + string val; + }; + + unsigned nlist_; + struct cell_*list_; + + private: // not implemented + Attrib(const Attrib&); + Attrib& operator= (const Attrib&); +}; + +/* + * $Log: Attrib.h,v $ + * Revision 1.1 2000/12/04 17:37:03 steve + * Add Attrib class for holding NetObj attributes. + * + */ +#endif diff --git a/Makefile.in b/Makefile.in index 8eb4c246b..e699ff697 100644 --- a/Makefile.in +++ b/Makefile.in @@ -16,7 +16,7 @@ # 59 Temple Place - Suite 330 # Boston, MA 02111-1307, USA # -#ident "$Id: Makefile.in,v 1.85 2000/12/02 05:57:46 steve Exp $" +#ident "$Id: Makefile.in,v 1.86 2000/12/04 17:37:03 steve Exp $" # # SHELL = /bin/sh @@ -95,7 +95,7 @@ pad_to_width.o \ parse.o parse_misc.o pform.o pform_dump.o \ set_width.o \ verinum.o verireal.o target.o targets.o util.o \ -LineInfo.o Module.o PDelays.o PEvent.o \ +Attrib.o LineInfo.o Module.o PDelays.o PEvent.o \ PExpr.o PGate.o \ PTask.o PFunction.o PWire.o Statement.o \ $(FF) $(TT) diff --git a/design_dump.cc b/design_dump.cc index a1d0adc52..3bc40e592 100644 --- a/design_dump.cc +++ b/design_dump.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: design_dump.cc,v 1.104 2000/11/11 01:52:09 steve Exp $" +#ident "$Id: design_dump.cc,v 1.105 2000/12/04 17:37:03 steve Exp $" #endif /* @@ -153,11 +153,10 @@ void NetObj::dump_node_pins(ostream&o, unsigned ind) const void NetObj::dump_obj_attr(ostream&o, unsigned ind) const { - for (map::const_iterator idx = attributes_.begin() - ; idx != attributes_.end() - ; idx ++) { - o << setw(ind) << "" << (*idx).first << " = \"" << - (*idx).second << "\"" << endl; + unsigned idx; + for (idx = 0 ; idx < attributes_.size() ; idx += 1) { + o << setw(ind) << "" << attributes_.key(idx) << " = \"" << + attributes_.value(idx) << "\"" << endl; } } @@ -995,6 +994,9 @@ void Design::dump(ostream&o) const /* * $Log: design_dump.cc,v $ + * Revision 1.105 2000/12/04 17:37:03 steve + * Add Attrib class for holding NetObj attributes. + * * Revision 1.104 2000/11/11 01:52:09 steve * change set for support of nmos, pmos, rnmos, rpmos, notif0, and notif1 * change set to correct behavior of bufif0 and bufif1 diff --git a/elab_sig.cc b/elab_sig.cc index 0dfbc0761..98c118169 100644 --- a/elab_sig.cc +++ b/elab_sig.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: elab_sig.cc,v 1.5 2000/11/20 00:58:40 steve Exp $" +#ident "$Id: elab_sig.cc,v 1.6 2000/12/04 17:37:04 steve Exp $" #endif # include "Module.h" @@ -335,7 +335,6 @@ void PWire::elaborate_sig(Design*des, NetScope*scope) const delete rval; NetMemory*sig = new NetMemory(scope, path+"."+basename, wid, lnum, rnum); - sig->set_attributes(attributes); } else { @@ -348,6 +347,9 @@ void PWire::elaborate_sig(Design*des, NetScope*scope) const /* * $Log: elab_sig.cc,v $ + * Revision 1.6 2000/12/04 17:37:04 steve + * Add Attrib class for holding NetObj attributes. + * * Revision 1.5 2000/11/20 00:58:40 steve * Add support for supply nets (PR#17) * diff --git a/netlist.cc b/netlist.cc index a7db9598c..ed22e930f 100644 --- a/netlist.cc +++ b/netlist.cc @@ -17,7 +17,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: netlist.cc,v 1.148 2000/11/29 23:16:19 steve Exp $" +#ident "$Id: netlist.cc,v 1.149 2000/12/04 17:37:04 steve Exp $" #endif # include @@ -209,41 +209,25 @@ const NetScope* NetObj::scope() const void NetObj::set_attributes(const map&attr) { - assert(attributes_.size() == 0); - attributes_ = attr; + attributes_.set_attributes(attr); } string NetObj::attribute(const string&key) const { - map::const_iterator idx = attributes_.find(key); - if (idx == attributes_.end()) - return ""; - - return (*idx).second; + return attributes_.attribute(key); } void NetObj::attribute(const string&key, const string&value) { - attributes_[key] = value; + attributes_.attribute(key, value); } bool NetObj::has_compat_attributes(const NetObj&that) const { - map::const_iterator idx; - for (idx = that.attributes_.begin() - ; idx != that.attributes_.end() ; idx ++) { - map::const_iterator cur; - cur = attributes_.find((*idx).first); - - if (cur == attributes_.end()) - return false; - if ((*cur).second != (*idx).second) - return false; - } - - return true; + return attributes_.has_compat_attributes(that.attributes_); } + Link& NetObj::pin(unsigned idx) { assert(idx < npins_); @@ -2057,11 +2041,6 @@ unsigned NetMemory::index_to_address(long idx) const } -void NetMemory::set_attributes(const map&attr) -{ - assert(attributes_.size() == 0); - attributes_ = attr; -} NetEMemory* NetEMemory::dup_expr() const { @@ -2471,6 +2450,9 @@ bool NetUDP::sequ_glob_(string input, char output) /* * $Log: netlist.cc,v $ + * Revision 1.149 2000/12/04 17:37:04 steve + * Add Attrib class for holding NetObj attributes. + * * Revision 1.148 2000/11/29 23:16:19 steve * Do not delete synthesized signals used in expressions. * diff --git a/netlist.h b/netlist.h index 0ade10f22..92c48ca30 100644 --- a/netlist.h +++ b/netlist.h @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: netlist.h,v 1.183 2000/12/02 05:08:04 steve Exp $" +#ident "$Id: netlist.h,v 1.184 2000/12/04 17:37:04 steve Exp $" #endif /* @@ -33,6 +33,7 @@ # include "verinum.h" # include "LineInfo.h" # include "svector.h" +# include "Attrib.h" class Design; class Link; @@ -115,7 +116,7 @@ class NetObj { unsigned delay2_; unsigned delay3_; - map attributes_; + Attrib attributes_; }; class Link { @@ -625,8 +626,6 @@ class NetMemory { // that are not zero based. unsigned index_to_address(long idx) const; - void set_attributes(const map&a); - void dump(ostream&o, unsigned lm) const; private: @@ -635,8 +634,6 @@ class NetMemory { long idxh_; long idxl_; - map attributes_; - friend class NetRamDq; NetRamDq* ram_list_; @@ -2824,6 +2821,9 @@ extern ostream& operator << (ostream&, NetNet::Type); /* * $Log: netlist.h,v $ + * Revision 1.184 2000/12/04 17:37:04 steve + * Add Attrib class for holding NetObj attributes. + * * Revision 1.183 2000/12/02 05:08:04 steve * Spelling error in comment. *