This is the mail archive of the sid@sources.redhat.com mailing list for the SID project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

New bus_mux component


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  <jjohnstn@redhat.com>
+
+	* 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  <fche@redhat.com>
 
 	* 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  <jjohnstn@redhat.com>
+
+	* 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  <fche@redhat.com>
 
 	* 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<bus_mux> 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<sequence_component*>(c);
   if (g1) { delete g1; return; }
   attr_storage_component* g2 = dynamic_cast<attr_storage_component*>(c);
   if (g2) { delete g2; return; }
   bus_prober* g3 = dynamic_cast<bus_prober*>(c);
   if (g3) { delete g3; return; }
+  bus_mux* g4 = dynamic_cast<bus_mux*>(c);
+  if (g4) { delete g4; return; }
 }
 
   
* Name
  hw-glue-bus-mux

* Synopsis
  This component provides switchable access from one bus to two separate
  accessors.

  Buses: upstream
  Accessors: downstream1, downstream2
  Attributes: switch
  Pins: switch
  Shared library: libglue.la
  Symbol: glue_component_library

* Functionality
 
  - Modelling
    * This component is a bus multiplexer with one input bus, two
      output accessors, and a switch to alternate between them.

  - Behaviors
    * Initialization
      At start-up, the single input bus: "upstream" is tied by default
      to "downstream1".

    * Switching
      When the "switch" pin is driven high, the output accessor will
      be switched from the current output accessor to the one not in use.
      The "switch" pin can be driven any number of times, each time
      causing the output to be switched.

    * Bus traffic
      Input to the "upstream" bus is passed on to the current
      output accessor: either "downstream1" or "downstream2".

  - SID conventions
    * This is a functional component.
    * It presents one attribute in the "pin" category.

* Environment
  - Related components
    * This component may be used as to implement a multiplexer by
      combining two bus-mux components with the same accessors in the
      opposite order.  For example:

	new hw-glue-bus-mux bus-mux1
	new hw-glue-bus-mux bus-mux2
        connect-bus cpu data-memory-x bus-mux1 upstream
        connect-bus coprocessor data-memory-x bus-mux2 upstream
        connect-bus bus-mux1 downstream1 data-memory-x1 read-write-port
        connect-bus bus-mux1 downstream2 data-memory-x2 read-write-port
        connect-bus bus-mux2 downstream1 data-memory-x2 read-write-port
        connect-bus bus-mux2 downstream2 data-memory-x1 read-write-port
	connect-pin cpu memory-x-ctl bus-mux1 switch
        connect-pin cpu memory-x-ctl bus-mux2 switch

* SID interface reference
  - low level:
    * buses
      - upstream | unrestricted | unrestricted | bus traffic

    * accessors
      - downstream1 | unrestricted | unrestricted | bus traffic
      - downstream2 | unrestricted | unrestricted | bus traffic

    * pins
      - switch | input | 0 or non-zero | switching

    * attributes
      - switch | pin | n/a | n/a | switching

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]