From mboxrd@z Thu Jan 1 00:00:00 1970 From: "J. Johnston" To: sid@sources.redhat.com Subject: New bus_mux component Date: Fri, 05 Jan 2001 13:38:00 -0000 Message-id: <3A563EBB.75FA72A9@cygnus.com> X-SW-Source: 2001-q1/msg00007.html The following patch is for a new glue component: bus_mux which is a bus multiplexer. It supports one bus input and attaches the bus to one of two accessors. The output accessor can be switched via a switch pin. I have included the patch plus a new documentation file. Ok to check in? -- Jeff J. ? sid/component/glue/hw-glue-bus-mux.txt Index: sid/include/ChangeLog =================================================================== RCS file: /cvs/src/src/sid/include/ChangeLog,v retrieving revision 1.1 diff -u -r1.1 ChangeLog --- ChangeLog 2000/12/07 19:31:09 1.1 +++ ChangeLog 2001/01/05 21:34:18 @@ -1,3 +1,8 @@ +2001-01-05 Jeff Johnston + + * sidbusutil.h (mux_passthrough_bus): New bus allowing one + input bus tied to one of two accessors with dynamic switching. + 2000-11-27 Frank Ch. Eigler * sidattrutil.h (attribute_coder_alias): New coder for attribute Index: sid/include/sidbusutil.h =================================================================== RCS file: /cvs/src/src/sid/include/sidbusutil.h,v retrieving revision 1.1 diff -u -r1.1 sidbusutil.h --- sidbusutil.h 2000/12/07 19:31:09 1.1 +++ sidbusutil.h 2001/01/05 21:34:18 @@ -255,6 +255,58 @@ sid::bus** target; }; + // This sort of bus passes accesses through to one of two buses which + // are specified by meta-pointers. Access can be switched dynamically. + class mux_passthrough_bus: public sid::bus + { + public: + mux_passthrough_bus(sid::bus** t1, sid::bus** t2): index(0), target(t1) + { + assert (t1 != 0); + assert (t2 != 0); + t[0] = t1; + t[1] = t2; + } + ~mux_passthrough_bus() {} + void switch_bus() { index ^= 1; target = t[index]; } + + // Some macros to make manufacturing of the cartesian-product + // calls simpler. +#define SID_GB_WRITE(dtype) \ + sid::bus::status write(sid::host_int_4 addr, dtype data) throw ()\ + { if (*target) return (*target)->write(addr, data); else return sid::bus::unpermitted; } + +#define SID_GB_READ(dtype) \ + sid::bus::status read(sid::host_int_4 addr, dtype& data) throw ()\ + { if (*target) return (*target)->read(addr, data); else return sid::bus::unpermitted; } + + SID_GB_WRITE(sid::little_int_1) + SID_GB_WRITE(sid::big_int_1) + SID_GB_WRITE(sid::little_int_2) + SID_GB_WRITE(sid::big_int_2) + SID_GB_WRITE(sid::little_int_4) + SID_GB_WRITE(sid::big_int_4) + SID_GB_WRITE(sid::little_int_8) + SID_GB_WRITE(sid::big_int_8) + + SID_GB_READ(sid::little_int_1) + SID_GB_READ(sid::big_int_1) + SID_GB_READ(sid::little_int_2) + SID_GB_READ(sid::big_int_2) + SID_GB_READ(sid::little_int_4) + SID_GB_READ(sid::big_int_4) + SID_GB_READ(sid::little_int_8) + SID_GB_READ(sid::big_int_8) + +#undef SID_GB_WRITE +#undef SID_GB_READ + + private: + int index; + sid::bus** target; + sid::bus** t[2]; + }; + // The passthrough_word_bus maps memory and either directly passes through to the underlying // bus or else converts the incoming bus access call to a particular // preferred size & type. The bus object is addressable as if it Index: sid/component/glue/ChangeLog =================================================================== RCS file: /cvs/src/src/sid/component/glue/ChangeLog,v retrieving revision 1.1 diff -u -r1.1 ChangeLog --- ChangeLog 2000/12/07 19:30:51 1.1 +++ ChangeLog 2001/01/05 21:34:18 @@ -1,3 +1,12 @@ +2001-01-05 Jeff Johnston + + * glue.cxx (bus_mux): New bus multiplex component accepting + one input bus and having two output accessors. + (list_types): List it under type "hw-glue-bus-mux". + (create): Ditto. + (do_delete): Ditto. + * hw-glue-bus-mux.txt: New documentation for bus_mux. + 2000-11-21 Frank Ch. Eigler * Makefile.in: Regenerated. Index: sid/component/glue/Makefile.am =================================================================== RCS file: /cvs/src/src/sid/component/glue/Makefile.am,v retrieving revision 1.1 diff -u -r1.1 Makefile.am --- Makefile.am 2000/12/07 19:30:51 1.1 +++ Makefile.am 2001/01/05 21:34:18 @@ -12,7 +12,7 @@ seqinval.exp sequence.exp sequence1.exp sequence2.exp sequence8.exp \ seqvalid.exp gluemonkey.exp traffic.exp -pkgdata_DATA = hw-glue-sequence.txt hw-glue-probe-bus.txt sw-glue-attribbank.txt +pkgdata_DATA = hw-glue-sequence.txt hw-glue-probe-bus.txt sw-glue-attribbank.txt hw-glue-bus-mux.txt checkme: (cd ../testsuite ; $(MAKE) check RUNTESTFLAGS="$(RUNTESTFLAGS) $(DEJAGNUTESTS)" ) Index: sid/component/glue/Makefile.in =================================================================== RCS file: /cvs/src/src/sid/component/glue/Makefile.in,v retrieving revision 1.1 diff -u -r1.1 Makefile.in --- Makefile.in 2000/12/07 19:30:51 1.1 +++ Makefile.in 2001/01/05 21:34:19 @@ -99,7 +99,7 @@ seqvalid.exp gluemonkey.exp traffic.exp -pkgdata_DATA = hw-glue-sequence.txt hw-glue-probe-bus.txt sw-glue-attribbank.txt +pkgdata_DATA = hw-glue-sequence.txt hw-glue-probe-bus.txt sw-glue-attribbank.txt hw-glue-bus-mux.txt mkinstalldirs = $(SHELL) $(top_srcdir)/../config/mkinstalldirs CONFIG_HEADER = ../config.h CONFIG_CLEAN_FILES = @@ -126,6 +126,7 @@ TAR = gtar GZIP_ENV = --best +DEP_FILES = .deps/glue.P SOURCES = $(libglue_la_SOURCES) OBJECTS = $(libglue_la_OBJECTS) @@ -133,9 +134,9 @@ .SUFFIXES: .SUFFIXES: .S .c .cxx .lo .o .s $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) - cd $(top_srcdir) && $(AUTOMAKE) --cygnus glue/Makefile + cd $(top_srcdir) && $(AUTOMAKE) --foreign glue/Makefile -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status $(BUILT_SOURCES) cd $(top_builddir) \ && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status @@ -165,9 +166,6 @@ $(LIBTOOL) --mode=uninstall rm -f $(DESTDIR)$(pkglibdir)/$$p; \ done -.c.o: - $(COMPILE) -c $< - .s.o: $(COMPILE) -c $< @@ -184,9 +182,6 @@ maintainer-clean-compile: -.c.lo: - $(LIBTOOL) --mode=compile $(COMPILE) -c $< - .s.lo: $(LIBTOOL) --mode=compile $(COMPILE) -c $< @@ -263,8 +258,13 @@ subdir = glue distdir: $(DISTFILES) + here=`cd $(top_builddir) && pwd`; \ + top_distdir=`cd $(top_distdir) && pwd`; \ + distdir=`cd $(distdir) && pwd`; \ + cd $(top_srcdir) \ + && $(AUTOMAKE) --include-deps --build-dir=$$here --srcdir-name=$(top_srcdir) --output-dir=$$top_distdir --foreign glue/Makefile @for file in $(DISTFILES); do \ - if test -f $$file; then d=.; else d=$(srcdir); fi; \ + d=$(srcdir); \ if test -d $$d/$$file; then \ cp -pr $$d/$$file $(distdir)/$$file; \ else \ @@ -273,16 +273,65 @@ || cp -p $$d/$$file $(distdir)/$$file || :; \ fi; \ done + +DEPS_MAGIC := $(shell mkdir .deps > /dev/null 2>&1 || :) + +-include $(DEP_FILES) + +mostlyclean-depend: + +clean-depend: + +distclean-depend: + -rm -rf .deps + +maintainer-clean-depend: + +%.o: %.c + @echo '$(COMPILE) -c $<'; \ + $(COMPILE) -Wp,-MD,.deps/$(*F).pp -c $< + @-cp .deps/$(*F).pp .deps/$(*F).P; \ + tr ' ' '\012' < .deps/$(*F).pp \ + | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ + >> .deps/$(*F).P; \ + rm .deps/$(*F).pp + +%.lo: %.c + @echo '$(LTCOMPILE) -c $<'; \ + $(LTCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $< + @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \ + < .deps/$(*F).pp > .deps/$(*F).P; \ + tr ' ' '\012' < .deps/$(*F).pp \ + | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ + >> .deps/$(*F).P; \ + rm -f .deps/$(*F).pp + +%.o: %.cxx + @echo '$(CXXCOMPILE) -c $<'; \ + $(CXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $< + @-cp .deps/$(*F).pp .deps/$(*F).P; \ + tr ' ' '\012' < .deps/$(*F).pp \ + | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ + >> .deps/$(*F).P; \ + rm .deps/$(*F).pp + +%.lo: %.cxx + @echo '$(LTCXXCOMPILE) -c $<'; \ + $(LTCXXCOMPILE) -Wp,-MD,.deps/$(*F).pp -c $< + @-sed -e 's/^\([^:]*\)\.o[ ]*:/\1.lo \1.o :/' \ + < .deps/$(*F).pp > .deps/$(*F).P; \ + tr ' ' '\012' < .deps/$(*F).pp \ + | sed -e 's/^\\$$//' -e '/^$$/ d' -e '/:$$/ d' -e 's/$$/ :/' \ + >> .deps/$(*F).P; \ + rm -f .deps/$(*F).pp info-am: info: info-am dvi-am: dvi: dvi-am -check-am: +check-am: all-am check: check-am installcheck-am: installcheck: installcheck-am -install-info-am: -install-info: install-info-am install-exec-am: install-pkglibLTLIBRARIES install-exec: install-exec-am @@ -312,27 +361,27 @@ maintainer-clean-generic: mostlyclean-am: mostlyclean-pkglibLTLIBRARIES mostlyclean-compile \ - mostlyclean-libtool mostlyclean-tags \ + mostlyclean-libtool mostlyclean-tags mostlyclean-depend \ mostlyclean-generic mostlyclean: mostlyclean-am clean-am: clean-pkglibLTLIBRARIES clean-compile clean-libtool \ - clean-tags clean-generic mostlyclean-am + clean-tags clean-depend clean-generic mostlyclean-am clean: clean-am distclean-am: distclean-pkglibLTLIBRARIES distclean-compile \ - distclean-libtool distclean-tags distclean-generic \ - clean-am + distclean-libtool distclean-tags distclean-depend \ + distclean-generic clean-am -rm -f libtool distclean: distclean-am maintainer-clean-am: maintainer-clean-pkglibLTLIBRARIES \ maintainer-clean-compile maintainer-clean-libtool \ - maintainer-clean-tags maintainer-clean-generic \ - distclean-am + maintainer-clean-tags maintainer-clean-depend \ + maintainer-clean-generic distclean-am @echo "This command is intended for maintainers to use;" @echo "it deletes files that may require special tools to rebuild." @@ -345,12 +394,13 @@ maintainer-clean-compile mostlyclean-libtool distclean-libtool \ clean-libtool maintainer-clean-libtool uninstall-pkgdataDATA \ install-pkgdataDATA tags mostlyclean-tags distclean-tags clean-tags \ -maintainer-clean-tags distdir info-am info dvi-am dvi check check-am \ -installcheck-am installcheck install-info-am install-info \ -install-exec-am install-exec install-data-am install-data install-am \ -install uninstall-am uninstall all-redirect all-am all installdirs \ -mostlyclean-generic distclean-generic clean-generic \ -maintainer-clean-generic clean mostlyclean distclean maintainer-clean +maintainer-clean-tags distdir mostlyclean-depend distclean-depend \ +clean-depend maintainer-clean-depend info-am info dvi-am dvi check \ +check-am installcheck-am installcheck install-exec-am install-exec \ +install-data-am install-data install-am install uninstall-am uninstall \ +all-redirect all-am all installdirs mostlyclean-generic \ +distclean-generic clean-generic maintainer-clean-generic clean \ +mostlyclean distclean maintainer-clean checkme: Index: sid/component/glue/glue.cxx =================================================================== RCS file: /cvs/src/src/sid/component/glue/glue.cxx,v retrieving revision 1.1 diff -u -r1.1 glue.cxx --- glue.cxx 2000/12/07 19:30:51 1.1 +++ glue.cxx 2001/01/05 21:34:19 @@ -67,6 +67,7 @@ using sidutil::recursion_limited; using sidutil::recursion_record; using sidutil::self_watcher; + using sidutil::mux_passthrough_bus; using std::map; using std::deque; @@ -509,7 +510,43 @@ return s; } +class bus_mux: public virtual component, + protected fixed_pin_map_component, + protected fixed_accessor_map_component, + protected fixed_attribute_map_component, + protected no_relation_component, + protected fixed_bus_map_component +{ + mux_passthrough_bus upstream; + bus* downstream1; + bus* downstream2; + + callback_pin switch_pin; + +public: + bus_mux (): + switch_pin (this, &bus_mux::handle_switch_pin), + upstream (&this->downstream1, &this->downstream2), + downstream1 (0), downstream2 (0) + { + add_bus ("upstream", &this->upstream); + add_accessor ("downstream1", &this->downstream1); + add_accessor ("downstream2", &this->downstream2); + add_pin ("switch", &switch_pin); + add_attribute ("switch", &switch_pin, "pin"); + } + ~bus_mux () {} + + void handle_switch_pin (host_int_4 value) + { + if (value != 0) + { + upstream.switch_bus(); + } + } +}; + // ---------------------------------------------------------------------------- static @@ -523,6 +560,7 @@ types.push_back("hw-glue-sequence-8"); types.push_back("sw-glue-attribbank"); types.push_back("hw-glue-probe-bus"); + types.push_back("hw-glue-bus-mux"); return types; } @@ -543,6 +581,8 @@ return new attr_storage_component (); if (typeName == "hw-glue-probe-bus") return new bus_prober (); + if (typeName == "hw-glue-bus-mux") + return new bus_mux (); else return 0; } @@ -552,13 +592,15 @@ void do_delete(component* c) { - // Two of these dynamic_cast<>s will return 0. It is safe to delete 0. + // Three of these dynamic_cast<>s will return 0. It is safe to delete 0. sequence_component* g1 = dynamic_cast(c); if (g1) { delete g1; return; } attr_storage_component* g2 = dynamic_cast(c); if (g2) { delete g2; return; } bus_prober* g3 = dynamic_cast(c); if (g3) { delete g3; return; } + bus_mux* g4 = dynamic_cast(c); + if (g4) { delete g4; return; } }