* pin-pacer glue component
@ 2004-08-04 18:18 Robert Shideleff
2004-08-06 14:17 ` Frank Ch. Eigler
0 siblings, 1 reply; 2+ messages in thread
From: Robert Shideleff @ 2004-08-04 18:18 UTC (permalink / raw)
To: sid
[-- Attachment #1: Type: Text/Plain, Size: 473 bytes --]
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
This patch adds a pin-pacer to the glue components. I have used this
successfully in combination with a socket component and netcat to feed test
data from a file into the simulation at a simulation-realistic rate.
Bob
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.2.4 (GNU/Linux)
iD8DBQFBESh68XjOGQDr37YRAhhpAJ4z7M4la5x3tVB8aAZ8BzJXS5yeDACaA0Bg
bm2FRa4shzEGS3MvXGMWs48=
=GlAT
-----END PGP SIGNATURE-----
[-- Attachment #2: sid-glue.diff --]
[-- Type: text/x-diff, Size: 10559 bytes --]
diff --exclude CVS --exclude='*.deps' --exclude='*.libs' --exclude=Makefile --exclude='*.lo' --exclude='*.la' --exclude='*.o' -u --new-file ../../../sid.orig/src/sid/component/glue/glue.cxx glue/glue.cxx
--- ../../../sid.orig/src/sid/component/glue/glue.cxx 2002-11-22 12:15:42.000000000 -0500
+++ glue/glue.cxx 2004-08-04 13:42:41.214170222 -0400
@@ -1,6 +1,7 @@
// glue.cxx - miscellaneous glue components. -*- C++ -*-
// Copyright (C) 1999-2001 Red Hat.
+// Portions Copyright (C) 2004 Sirius Satellite Radio Inc.
// This file is part of SID and is licensed under the GPL.
// See the file COPYING.SID for conditions for redistribution.
@@ -557,11 +558,184 @@
// ----------------------------------------------------------------------------
+ // The pin pacer component paces pin signals based on a trigger input
+ class pin_pacer_component: public virtual component,
+ protected fixed_pin_map_component,
+ protected no_accessor_component,
+ protected fixed_attribute_map_component,
+ protected no_relation_component,
+ protected no_bus_component,
+ protected recursion_limited
+ {
+ host_int_4 trace;
+ host_int_4 signals_per_tick;
+ callback_pin<pin_pacer_component> tick;
+ callback_pin<pin_pacer_component> input;
+ output_pin request_input;
+ output_pin output;
+
+ deque<host_int_4> data_fifo;
+
+ friend class self_watcher<pin_pacer_component>;
+ self_watcher<pin_pacer_component> triggerpoint_manager;
+
+ void handle_input(host_int_4 value)
+ {
+ data_fifo.push_back(value);
+ triggerpoint_manager.check_and_dispatch();
+ }
+
+ void handle_tick(host_int_4 value)
+ {
+ unsigned long output_count = data_fifo.size();
+
+ while(output_count < signals_per_tick)
+ {
+ if(trace)
+ printf("Requesting Data.\n");
+
+ request_input.drive(0);
+
+ // Give up if our souce isn't giving us any data.
+ if(data_fifo.size() == output_count)
+ break;
+
+ output_count = data_fifo.size();
+ }
+
+ if(output_count > signals_per_tick)
+ output_count = signals_per_tick;
+
+ if(trace)
+ {
+ printf("Tick:");
+ if(output_count != signals_per_tick)
+ printf(" Underflow:");
+ printf(" Outputting:");
+ }
+ while(output_count-- > 0)
+ {
+ if(trace)
+ printf(" %X", data_fifo[0]);
+ output.drive(data_fifo[0]);
+ data_fifo.pop_front();
+ }
+ if(trace)
+ printf(".\n");
+
+ triggerpoint_manager.check_and_dispatch();
+ }
+
+ friend ostream& operator << (ostream& o, const pin_pacer_component& it);
+ friend istream& operator >> (istream& i, pin_pacer_component& it);
+ string save_state() { return make_attribute(*this); }
+ component::status restore_state(const string& state) { return parse_attribute(state, *this); }
+
+ // Virtual pin interfaces between self_watcher and fixed_pin_map_component
+ sid::component::status
+ pin_factory(const string& name)
+ {
+ return triggerpoint_manager.create_virtual_pin (name);
+ }
+
+ void
+ pin_junkyard(const string& name)
+ {
+ triggerpoint_manager.destroy_virtual_pin (name);
+ }
+
+
+ public:
+ pin_pacer_component ();
+ ~pin_pacer_component () throw() { };
+ };
+
+
+pin_pacer_component::pin_pacer_component():
+ recursion_limited ("pin signal sequencing"),
+ signals_per_tick (1),
+ trace (0),
+ input (this, &pin_pacer_component::handle_input),
+ tick (this, &pin_pacer_component::handle_tick),
+ triggerpoint_manager (this)
+{
+ add_attribute ("trace?", &trace, "setting");
+ triggerpoint_manager.add_watchable_attribute ("trace?");
+
+ add_attribute ("signals-per-tick", & signals_per_tick, "setting");
+ triggerpoint_manager.add_watchable_attribute ("signals-per-tick");
+
+ add_pin ("input", & input);
+ add_attribute ("input", & input, "pin");
+ triggerpoint_manager.add_watchable_attribute ("input");
+ categorize ("input", "watchable");
+
+ add_pin ("tick", & tick);
+ add_attribute ("tick", & tick, "pin");
+ triggerpoint_manager.add_watchable_attribute ("tick");
+ categorize ("tick", "watchable");
+
+ add_pin ("request-input", & request_input);
+ add_attribute ("request-input", & request_input, "pin");
+ triggerpoint_manager.add_watchable_attribute ("request-input");
+ categorize ("request-input", "watchable");
+
+ add_pin ("output", & output);
+ add_attribute ("output", & output, "pin");
+ triggerpoint_manager.add_watchable_attribute ("output");
+ categorize ("output", "watchable");
+
+ add_attribute_virtual ("state-snapshot", this,
+ & pin_pacer_component::save_state,
+ & pin_pacer_component::restore_state);
+}
+
+
+ ostream&
+ operator << (ostream& o, const pin_pacer_component& it)
+{
+ o << "pin_pacer ";
+ o << it.signals_per_tick << " ";
+ o << it.input << " ";
+ o << it.output << " ";
+ o << it.tick << " ";
+ o << it.request_input;
+ // NB: no whitespace at end!
+ return o;
+}
+
+
+ istream&
+ operator >> (istream& i, pin_pacer_component& it)
+{
+ string key;
+ i >> key;
+ if (key != "pin_pacer")
+ {
+ i.setstate (ios::badbit);
+ return i;
+ }
+
+ i >> it.signals_per_tick;
+
+ i >> it.input;
+ i >> it.output;
+ i >> it.tick;
+ i >> it.request_input;
+
+ return i;
+}
+
+
+
+// ----------------------------------------------------------------------------
+
static
vector<string>
list_types()
{
vector<string> types;
+ types.push_back("hw-glue-pin-pacer");
types.push_back("hw-glue-sequence");
types.push_back("hw-glue-sequence-1");
types.push_back("hw-glue-sequence-2");
@@ -577,6 +751,8 @@
component*
create(const string& typeName)
{
+ if (typeName == "hw-glue-pin-pacer")
+ return new pin_pacer_component ();
if (typeName == "hw-glue-sequence")
return new sequence_component ();
if (typeName == "hw-glue-sequence-1")
@@ -609,6 +785,8 @@
if (g3) { delete g3; return; }
bus_mux* g4 = dynamic_cast<bus_mux*>(c);
if (g4) { delete g4; return; }
+ pin_pacer_component* g5 = dynamic_cast<pin_pacer_component*>(c);
+ if (g5) { delete g5; return; }
}
diff --exclude CVS --exclude='*.deps' --exclude='*.libs' --exclude=Makefile --exclude='*.lo' --exclude='*.la' --exclude='*.o' -u --new-file ../../../sid.orig/src/sid/component/glue/hw-glue-pin-pacer.xml glue/hw-glue-pin-pacer.xml
--- ../../../sid.orig/src/sid/component/glue/hw-glue-pin-pacer.xml 1969-12-31 19:00:00.000000000 -0500
+++ glue/hw-glue-pin-pacer.xml 2004-08-04 14:18:09.258954102 -0400
@@ -0,0 +1,82 @@
+<?xml version="1.0" ?>
+<!DOCTYPE defcomplib SYSTEM "http://sources.redhat.com/sid/component.dtd">
+
+<defcomplib lib="libglue.la" dlsym="glue_component_library">
+ <defcomponent name="hw-glue-sequence" type="abstract">
+
+ <!-- pins -->
+ <defpin name="tick" direction="in" legalvalues="any" behaviors="data forwarding" />
+ <defpin name="request_input" direction="out" legalvalues="any" behaviors="data forwarding" />
+ <defpin name="input" direction="in" legalvalues="any" behaviors="data forwarding" />
+ <defpin name="output" direction="out" legalvalues="any" behaviors="data forwarding" />
+
+ <!-- attributes -->
+ <defattribute name="state-snapshot" category="no category" legalvalues="opaque string" behaviors="state save/restore" />
+ <defattribute name="signals-per-tick" category="setting, watchable" legalvalues="32 bit positive number" defaultvalue="1" behaviors="configuration" />
+ <defattribute name="tick" category="pin, watchable" behaviors="data forwarding" />
+ <defattribute name="request-input" category="pin, watchable" behaviors="data forwarding" />
+ <defattribute name="input" category="pin, watchable" behaviors="data forwarding" />
+ <defattribute name="output" category="pin, watchable" behaviors="data forwarding" />
+ </defcomponent>
+ <synop>
+ <p>
+ This component forwards signals received at its input to its output at a specified number of signals per tick.
+ This is useful for simulating baud rates in serial devices.
+ </p>
+ </synop>
+ <func>
+ <modelling>
+ <p>
+ This component is a fifo for pin signals.
+ </p>
+ </modelling>
+ <behavior name="configuration">
+ <p>
+ <attribute>signals-per-tick</attribute> designates how many signal will be driven (if available) per incoming signal
+ on the tick pin.
+ </p>
+ </behavior>
+ <behavior name="data forwarding">
+ <p>
+ This component is a fifo for pin signals. It will generate a duplicate pin signal on its output for every pin
+ signal on its input at the pace configured in the attribute <attribute>signals-per-tick</attribute>. These
+ signals will be generated whenever the tick input pin is driven. If the fifo contains less than signals-per-tick
+ signals when tick is driven, then request-input will be driven. If no further signals arrive when request-input
+ is driven, then output will be driven with whatever signals are available in the fifo. (If none are available,
+ then none will be driven.) The fifo size is limited only by memory on the simulating pc. Note that input rate is
+ not controlled. The device generating data (for example a stdio component or a socket component) can put data
+ into the fifo at whatver rate it desires, which will simply require more memory to store the data until it
+ can be driven out at the next tick. It is recommended that <pin>request-input</pin> be connected to the polling
+ pin on whatever device is connected to <pin>input</pin>. On the stdio component for example, this would replace
+ the input from a host scheduler.
+ </behavior>
+ <convention name="functional" supported="true">
+ <p>
+ This is a functional component.</p>
+ </convention>
+ <convention name="state save/restore" supported="true">
+ <p>
+ This component supports state save/restore
+ </p>
+ </convention>
+ <convention name="triggerpoints" supported="true">
+ <p>
+ This component supports triggerpoints.
+ </p>
+ </convention>
+ <convention name="Recursion Control" supported="true">
+ <p>
+ This component limits recursion on the <pin>input</pin> pin.</p>
+ </convention>
+ <convention name="presentation" supported="true">
+ <p>
+ This component presents attributes in the <name>pin</name>, <name>setting</name>, and <name>watchable</name> categories.</p>
+ </convention>
+ </func>
+ <env>
+ <p>
+ This device is useful for modeling a baud rate on a serial device.
+ </p>
+ </env>
+</defcomplib>
+
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: pin-pacer glue component
2004-08-04 18:18 pin-pacer glue component Robert Shideleff
@ 2004-08-06 14:17 ` Frank Ch. Eigler
0 siblings, 0 replies; 2+ messages in thread
From: Frank Ch. Eigler @ 2004-08-06 14:17 UTC (permalink / raw)
To: Robert Shideleff; +Cc: sid
Hi -
> This patch adds a pin-pacer to the glue components. I have used this
> successfully in combination with a socket component and netcat to feed test
> data from a file into the simulation at a simulation-realistic rate.
Thank you for this contribution, it is in the repository.
For the future, it would help if the changes include bits
like a ChangeLog entry, and perhaps a test suite smoke test
(so we can tell when/if the code breaks in the future).
- FChE
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2004-08-06 14:17 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2004-08-04 18:18 pin-pacer glue component Robert Shideleff
2004-08-06 14:17 ` Frank Ch. Eigler
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).