Index: sid/component/cfgroot/compConfig.cxx =================================================================== RCS file: /cvs/src/src/sid/component/cfgroot/compConfig.cxx,v retrieving revision 1.10 diff -c -p -r1.10 compConfig.cxx *** sid/component/cfgroot/compConfig.cxx 19 Aug 2005 19:39:07 -0000 1.10 --- sid/component/cfgroot/compConfig.cxx 23 Aug 2005 20:58:30 -0000 *************** dynamic_configurator_component::reset () *** 1389,1394 **** --- 1389,1396 ---- configure (spec); } } + + step_control_pin.drive (1); // reconfigure during next cycle } // Set the starting configuration Index: sid/component/profiling/gprof.cxx =================================================================== RCS file: /cvs/src/src/sid/component/profiling/gprof.cxx,v retrieving revision 1.12 diff -c -p -r1.12 gprof.cxx *** sid/component/profiling/gprof.cxx 19 Aug 2005 19:46:00 -0000 1.12 --- sid/component/profiling/gprof.cxx 23 Aug 2005 20:58:30 -0000 *************** namespace profiling_components *** 514,521 **** if (s == component::ok) { sim_sched->connect_pin (sim_sched_event + "-event", & accumulate_pin); - sim_sched->set_attribute_value (sim_sched_event + "-regular", "true"); sim_sched->set_attribute_value (sim_sched_event + "-time", make_attribute (cycles)); return; } } --- 514,523 ---- if (s == component::ok) { sim_sched->connect_pin (sim_sched_event + "-event", & accumulate_pin); sim_sched->set_attribute_value (sim_sched_event + "-time", make_attribute (cycles)); + // Take a sample now to make up for the one which just got cancelled when + // N-time was set. + accumulate (1); return; } } *************** namespace profiling_components *** 523,532 **** // No gprof config or cycles was not specified. We will not be triggered by the // target scheduler. if (sim_sched) ! { ! sim_sched->disconnect_pin (sim_sched_event + "-event", & accumulate_pin); ! sim_sched->set_attribute_value (sim_sched_event + "-regular", "false"); ! } return; } } --- 525,531 ---- // No gprof config or cycles was not specified. We will not be triggered by the // target scheduler. if (sim_sched) ! sim_sched->disconnect_pin (sim_sched_event + "-event", & accumulate_pin); return; } } Index: sid/component/sched/compSched.cxx =================================================================== RCS file: /cvs/src/src/sid/component/sched/compSched.cxx,v retrieving revision 1.12 diff -c -p -r1.12 compSched.cxx *** sid/component/sched/compSched.cxx 12 Feb 2005 16:25:47 -0000 1.12 --- sid/component/sched/compSched.cxx 23 Aug 2005 20:58:31 -0000 *************** *** 1,9 **** // compSched.cxx - the scheduler component. -*- C++ -*- ! // Copyright (C) 1999-2003 Red Hat. // This file is part of SID and is licensed under the GPL. // See the file COPYING.SID for conditions for redistribution. - #include "config.h" #include --- 1,8 ---- // compSched.cxx - the scheduler component. -*- C++ -*- ! // Copyright (C) 1999-2003, 2005 Red Hat. // This file is part of SID and is licensed under the GPL. // See the file COPYING.SID for conditions for redistribution. #include "config.h" #include *************** namespace scheduler_component *** 129,140 **** tick_t when; tick_t interval; output_pin* what; ! scheduling_event(): when(0), interval(0), what(0) {} ! scheduling_event(tick_t when, output_pin* what): ! when(when), interval(0), what(what) {} ! scheduling_event(tick_t when, tick_t interval, output_pin* what): ! when(when), interval(interval), what(what) {} }; // Define a comparison function for heaps of scheduling events. It --- 128,140 ---- tick_t when; tick_t interval; output_pin* what; + host_int_4 priority; ! scheduling_event(): when(0), interval(0), what(0), priority (0) {} ! scheduling_event(tick_t when, output_pin* what, host_int_4 priority): ! when(when), interval(0), what(what), priority(priority) {} ! scheduling_event(tick_t when, tick_t interval, output_pin* what, host_int_4 priority): ! when(when), interval(interval), what(what), priority(priority) {} }; // Define a comparison function for heaps of scheduling events. It *************** namespace scheduler_component *** 142,148 **** inline bool operator < (const scheduling_event& a, const scheduling_event& b) { ! return a.when > b.when; } --- 142,148 ---- inline bool operator < (const scheduling_event& a, const scheduling_event& b) { ! return (a.when > b.when) || ((a.when == b.when) && (a.priority < b.priority)); } *************** operator >> (istream& i, exact_host_time *** 603,609 **** } tick_t yield_until; ! if ( (rnext && irnext && (rnext->when < irnext->when)) || (rnext && !irnext)) yield_until = rnext->when; else if (irnext) --- 603,611 ---- } tick_t yield_until; ! if ((rnext && irnext ! && ((rnext->when < irnext->when) ! || (rnext->when == irnext->when && rnext->priority > irnext->priority))) || (rnext && !irnext)) yield_until = rnext->when; else if (irnext) *************** operator >> (istream& i, exact_host_time *** 674,680 **** rnext = & * this->regular_table_iter; } ! if ( (rnext && irnext && (rnext->when < irnext->when)) || (rnext && !irnext)) { return make_pair(rnext,true); --- 676,684 ---- rnext = & * this->regular_table_iter; } ! if ((rnext && irnext ! && ((rnext->when < irnext->when) ! || (rnext->when == irnext->when && rnext->priority > irnext->priority))) || (rnext && !irnext)) { return make_pair(rnext,true); *************** operator >> (istream& i, exact_host_time *** 789,795 **** // Schedule an irregular event. void ! schedule_irregular(tick_t delta, output_pin* what) { // cerr << "schedule_irregular when=" << when << endl; --- 793,799 ---- // Schedule an irregular event. void ! schedule_irregular(tick_t delta, output_pin* what, host_int_4 priority) { // cerr << "schedule_irregular when=" << when << endl; *************** operator >> (istream& i, exact_host_time *** 798,826 **** this->get_now(now); tick_t when = now + delta; ! this->irregular_events.push_back(scheduling_event(when, what)); push_heap(this->irregular_events.begin(), this->irregular_events.end()); } // Schedule a regular event, starting "when" void ! schedule_regular(tick_t when, tick_t interval, output_pin* what) { // cerr << "schedule_regular when=" << when << " interval=" << interval << endl; ! this->regular_events.push_back (scheduling_event(when, interval, what)); this->refill_regular_events_table(); } // Schedule a regular event starting "now" void ! schedule_regular(tick_t interval, output_pin* what) { // cerr << "scheduler_regular interval=" << interval << endl; // infer "now" as starting time tick_t now; this->get_now(now); ! this->schedule_regular (now, interval, what); } --- 802,830 ---- this->get_now(now); tick_t when = now + delta; ! this->irregular_events.push_back(scheduling_event(when, what, priority)); push_heap(this->irregular_events.begin(), this->irregular_events.end()); } // Schedule a regular event, starting "when" void ! schedule_regular(tick_t when, tick_t interval, output_pin* what, host_int_4 priority) { // cerr << "schedule_regular when=" << when << " interval=" << interval << endl; ! this->regular_events.push_back (scheduling_event(when, interval, what, priority)); this->refill_regular_events_table(); } // Schedule a regular event starting "now" void ! schedule_regular(tick_t interval, output_pin* what, host_int_4 priority) { // cerr << "scheduler_regular interval=" << interval << endl; // infer "now" as starting time tick_t now; this->get_now(now); ! this->schedule_regular (now, interval, what, priority); } *************** generic_scheduler::refill_re *** 935,946 **** { if (next_tick_time[reg] > next_tick_time[k]) reg = k; } slot->when = next_tick_time[reg]; slot->interval = 0; // initialize unused field slot->what = this->regular_events[reg].what; ! // cerr << " slot: when=" << slot->when << " what=" << slot->what << endl; next_tick_time[reg] += this->regular_events[reg].interval; } --- 939,954 ---- { if (next_tick_time[reg] > next_tick_time[k]) reg = k; + else if (next_tick_time[reg] == next_tick_time[k] + && this->regular_events[reg].priority < this->regular_events[k].priority) + reg = k; } slot->when = next_tick_time[reg]; slot->interval = 0; // initialize unused field slot->what = this->regular_events[reg].what; ! slot->priority = this->regular_events[reg].priority; ! // cerr << " slot: when=" << slot->when << " what=" << slot->what << " priority=" << slot->priority << endl; next_tick_time[reg] += this->regular_events[reg].interval; } *************** operator << (ostream& o, const generic_s *** 975,981 **** string name; bool ok = it.pin_state_map.find(e->what, name); assert (ok); ! o << " " << e->when << " " << e->interval << " " << name << endl; } o << it.regular_events.size() << endl; --- 983,989 ---- string name; bool ok = it.pin_state_map.find(e->what, name); assert (ok); ! o << " " << e->when << " " << e->priority << " " << e->interval << " " << name << endl; } o << it.regular_events.size() << endl; *************** operator << (ostream& o, const generic_s *** 988,994 **** string name; bool ok = it.pin_state_map.find(e->what, name); assert (ok); ! o << " " << e->when << " " << e->interval << " " << name << endl; } return o; --- 996,1002 ---- string name; bool ok = it.pin_state_map.find(e->what, name); assert (ok); ! o << " " << e->when << " " << e->priority << " " << e->interval << " " << name << endl; } return o; *************** operator >> (istream& i, generic_schedul *** 1024,1031 **** for(unsigned t=0; t> when >> interval >> name; // make base time absolute when += delta; // find new pin --- 1032,1040 ---- for(unsigned t=0; t> when >> priority >> interval >> name; // make base time absolute when += delta; // find new pin *************** operator >> (istream& i, generic_schedul *** 1033,1039 **** bool ok = it.pin_state_map.find(name, pin); assert (ok); // add it ! it.irregular_events.push_back(scheduling_event(when, interval, pin)); } // Clear regular events table --- 1042,1048 ---- bool ok = it.pin_state_map.find(name, pin); assert (ok); // add it ! it.irregular_events.push_back(scheduling_event(when, interval, pin, priority)); } // Clear regular events table *************** operator >> (istream& i, generic_schedul *** 1045,1052 **** for(unsigned t=0; t> when >> interval >> name; // make base time absolute when += delta; // find new pin --- 1054,1062 ---- for(unsigned t=0; t> when >> priority >> interval >> name; // make base time absolute when += delta; // find new pin *************** operator >> (istream& i, generic_schedul *** 1054,1060 **** bool ok = it.pin_state_map.find(name, pin); assert (ok); // add it ! it.regular_events.push_back(scheduling_event(when, interval, pin)); } // get scheduler ready for operation with new data --- 1064,1070 ---- bool ok = it.pin_state_map.find(name, pin); assert (ok); // add it ! it.regular_events.push_back(scheduling_event(when, interval, pin, priority)); } // get scheduler ready for operation with new data *************** public: *** 1083,1088 **** --- 1093,1099 ---- host_int_2 scale_mul, scale_div; // time-to-ticks conversion factor tick_t time; // time of next event (irregular) or interval (regular) bool regular_p; // regular (vs irregular) event source + host_int_4 priority; // priority of client string name; // "pretty" name, for use in scheduler GUI // These are public members for direct pin map twiddlers *************** private: *** 1103,1120 **** // silently prevent division-by-zero if (this->scale_div == 0) this->scale_div = 1; - tick_t sched_time = t * this->scale_mul / this->scale_div; if (LIKELY(t != 0)) { // round up away from zero if (sched_time == 0) sched_time = 1; if (this->regular_p) ! this->comp->sched.schedule_regular (sched_time, & this->event_pin); else ! this->comp->sched.schedule_irregular (sched_time, & this->event_pin); } } --- 1114,1131 ---- // silently prevent division-by-zero if (this->scale_div == 0) this->scale_div = 1; if (LIKELY(t != 0)) { // round up away from zero + tick_t sched_time = t * this->scale_mul / this->scale_div; if (sched_time == 0) sched_time = 1; if (this->regular_p) ! this->comp->sched.schedule_regular (sched_time, & this->event_pin, this->priority); else ! this->comp->sched.schedule_irregular (sched_time, & this->event_pin, this->priority); } } *************** public: *** 1140,1145 **** --- 1151,1157 ---- scale_div (1), time (0), regular_p (true), + priority (0), event_pin (), control_pin(this, & scheduler_client::set_control), comp(comp) *************** operator << (ostream& o, const scheduler *** 1236,1242 **** << it.clients[j]->time << " " << it.clients[j]->scale_mul << " " << it.clients[j]->scale_div << " " ! << it.clients[j]->regular_p << endl; its.add_pin_mapping((make_numeric_attribute(j) + "-event"), & it.clients[j]->event_pin); } --- 1248,1256 ---- << it.clients[j]->time << " " << it.clients[j]->scale_mul << " " << it.clients[j]->scale_div << " " ! << it.clients[j]->regular_p << " " ! << it.clients[j]->priority << " " ! << endl; its.add_pin_mapping((make_numeric_attribute(j) + "-event"), & it.clients[j]->event_pin); } *************** operator >> (istream& i, scheduler_compo *** 1282,1288 **** i >> it.clients[j]->time >> it.clients[j]->scale_mul >> it.clients[j]->scale_div ! >> it.clients[j]->regular_p; it.sched.add_pin_mapping((make_numeric_attribute(j) + "-event"), & it.clients[j]->event_pin); --- 1296,1303 ---- i >> it.clients[j]->time >> it.clients[j]->scale_mul >> it.clients[j]->scale_div ! >> it.clients[j]->regular_p ! >> it.clients[j]->priority; it.sched.add_pin_mapping((make_numeric_attribute(j) + "-event"), & it.clients[j]->event_pin); *************** scheduler_component::client_n *** 1522,1527 **** --- 1537,1543 ---- string num = sidutil::make_numeric_attribute(n); this->remove_attribute (num + "-regular?"); this->remove_attribute (num + "-time"); + this->remove_attribute (num + "-priority"); this->remove_attribute (num + "-scale"); this->remove_attribute (num + "-name"); this->remove_attribute (num + "-event"); *************** scheduler_component::client_n *** 1549,1554 **** --- 1565,1574 ---- & c->time, c, & client_t::reset_events, "setting"); + this->add_attribute_notify (num + "-priority", + & c->priority, c, + & client_t::reset_events, + "setting"); this->add_attribute_virtual (num + "-scale", c, & client_t::get_scale_attr, & client_t::set_scale_attr, "setting"); Index: sid/component/sched/sid-sched.txt =================================================================== RCS file: /cvs/src/src/sid/component/sched/sid-sched.txt,v retrieving revision 1.7 diff -c -p -r1.7 sid-sched.txt *** sid/component/sched/sid-sched.txt 21 Oct 2003 21:36:29 -0000 1.7 --- sid/component/sched/sid-sched.txt 23 Aug 2005 20:58:31 -0000 *************** Functionality: *** 95,118 **** | | | | | Each subscription is defined by | | | an index, a | ! | | regular-vs-irregular flag, and | ! | | a time quantity. The index is a | ! | | number between 0 and | ! | | num-clients -1, and is | | | represented as N in the | | | pin/attribute list templates in | | | this document. The | | | regular-vs-irregular flag is | | | accessible as the N-regular? | ! | | attribute. The time quantity is | ! | | accessible as the N-time | ! | | attribute. If the value is | ! | | zero, it is interpreted as a | ! | | request to cancel all pending | ! | | events for this subscription. | ! | | Otherwise, the value is taken | ! | | to be a delta until the time of | ! | | the requested event. | | | | | | You can also set these controls | | | by driving encoded values into | --- 95,122 ---- | | | | | Each subscription is defined by | | | an index, a | ! | | regular-vs-irregular flag, a | ! | | priority and a time quantity. | ! | | The index is a number between 0 | ! | | and num-clients -1, and is | | | represented as N in the | | | pin/attribute list templates in | | | this document. The | | | regular-vs-irregular flag is | | | accessible as the N-regular? | ! | | attribute. The priority is | ! | | accessible as the N-priority | ! | | attribute. Higher values | ! | | indicate higher priority. The | ! | | time quantity is accessible as | ! | | the N-time attribute. If the | ! | | value is zero, it is | ! | | interpreted as a request to | ! | | cancel all pending events for | ! | | this subscription. Otherwise, | ! | | the value is taken to be a | ! | | delta until the time of the | ! | | requested event. | | | | | | You can also set these controls | | | by driving encoded values into | *************** Functionality: *** 181,186 **** --- 185,198 ---- | | This loop may be aborted early | | | if the yield input pin is | | | driven. | + | | | + | | If more than one event is | + | | scheduled at the same time. | + | | Events will be dispatched in | + | | priority order. Events with | + | | higher priority will be | + | | dispatched before events with | + | | lower priority. | +-------------------------------------------------+ +-------------------------------------------------+ *************** Component Reference: *** 291,296 **** --- 303,310 ---- |---------------------------+----------+----------+-----------+---------------|| |N-time |setting |numeric |'0' |subscription || |---------------------------+----------+----------+-----------+---------------|| + |N-priority |setting |numeric |'0' |subscription || + |---------------------------+----------+----------+-----------+---------------|| |N-scale |setting |numeric |'1' |subscription || | | |fraction | | || |---------------------------+----------+----------+-----------+---------------|| Index: sid/component/sched/sid-sched.xml =================================================================== RCS file: /cvs/src/src/sid/component/sched/sid-sched.xml,v retrieving revision 1.6 diff -c -p -r1.6 sid-sched.xml *** sid/component/sched/sid-sched.xml 21 Oct 2003 21:36:29 -0000 1.6 --- sid/component/sched/sid-sched.xml 23 Aug 2005 20:58:31 -0000 *************** *** 22,27 **** --- 22,28 ---- + *************** *** 110,120 ****

Each subscription is defined by an index, a ! regular-vs-irregular flag, and a time quantity. The index is a number between 0 and num-clients -1, and is represented as N in the pin/attribute list templates in this document. The regular-vs-irregular flag is accessible as the N-regular? ! attribute. The time quantity is accessible as the N-time attribute. If the value is zero, it is interpreted as a request to cancel all pending events for this subscription. Otherwise, the value is taken to be a delta until the time of the --- 111,123 ----

Each subscription is defined by an index, a ! regular-vs-irregular flag, a priority and a time quantity. The index is a number between 0 and num-clients -1, and is represented as N in the pin/attribute list templates in this document. The regular-vs-irregular flag is accessible as the N-regular? ! attribute. The priority is accessible as the N-priority ! attribute. Higher values indicate higher priority. ! The time quantity is accessible as the N-time attribute. If the value is zero, it is interpreted as a request to cancel all pending events for this subscription. Otherwise, the value is taken to be a delta until the time of the *************** *** 166,171 **** --- 169,179 ---- the yield input pin is driven.

+

If more than one event is scheduled at the same time. Events will be dispatched in + priority order. Events with higher priority will be dispatched before events with lower + priority. +

+ Index: sid/include/sidcpuutil.h =================================================================== RCS file: /cvs/src/src/sid/include/sidcpuutil.h,v retrieving revision 1.31 diff -c -p -r1.31 sidcpuutil.h *** sid/include/sidcpuutil.h 19 Aug 2005 19:47:44 -0000 1.31 --- sid/include/sidcpuutil.h 23 Aug 2005 20:58:31 -0000 *************** namespace sidutil *** 270,278 **** recursion_record limit (& this->step_limit); if (UNLIKELY(! limit.ok())) return; - if (UNLIKELY (! gprof_configured_p && configure_gprof_p)) - configure_gprof (); - this->current_step_insn_count = 0; this->yield_p = false; --- 270,275 ---- *************** namespace sidutil *** 450,503 **** return static_cast(trap_disposition_pin.sense ()); } ! void unconfigure_gprof (sid::host_int_4 num_cycles) { assert (gprof); - // First sample the address of the branch which caused - // the reconfig for the given number of cycles. sid::pin *p; ! if (num_cycles && last_caller) { ! p = gprof->find_pin ("sample"); ! if (p) { ! std::string save_pc = this->attribute_value ("pc"); ! if (! save_pc.empty ()) { ! sid::component::status s = this->set_attribute_value ("pc", make_numeric_attribute (last_caller)); ! if (s == sid::component::ok) ! do ! { ! p->driven (1); ! --num_cycles; ! } while (num_cycles); ! this->set_attribute_value ("pc", save_pc); } } } ! ! // Then get gprof to reconfigure itself. ! gprof->set_attribute_value ("configure!", gprof_spec); // Then disconnect the call graph notification pins. - assert (! configure_gprof_p); - assert (gprof_configured_p); p = gprof->find_pin ("cg-caller"); if (p) cg_caller_pin.disconnect (p); p = gprof->find_pin ("cg-callee"); ! if (p) cg_callee_pin.disconnect (p); gprof_configured_p = false; } void configure_gprof () { ! // First get gprof to reconfigure itself. ! assert (gprof); ! gprof->set_attribute_value ("configure!", gprof_spec); ! // Then connect the call graph notification pins. ! assert (configure_gprof_p); ! assert (! gprof_configured_p); sid::pin *p = gprof->find_pin ("cg-caller"); if (p) { --- 447,502 ---- return static_cast(trap_disposition_pin.sense ()); } ! void unconfigure_gprof (const string &gprof_spec, sid::host_int_4 num_cycles) { + if (! gprof_configured_p) + return; + assert (gprof); sid::pin *p; ! ! #if 0 // can't happen? ! // If 'cycles' was specified on the --gprof option, then ! // first, sample the address of the branch which caused ! // the reconfig for the given number of cycles. ! if (num_cycles && last_caller && gprof_spec.size () > 6) { ! vector parts = tokenize (gprof_spec.substr (6), ","); ! if (parts.size () > 1) { ! p = gprof->find_pin ("sample"); ! if (p) { ! std::string save_pc = this->attribute_value ("pc"); ! if (! save_pc.empty ()) ! { ! sid::component::status s = this->set_attribute_value ("pc", make_numeric_attribute (last_caller)); ! if (s == sid::component::ok) ! for (int i = 0; i < num_cycles; ++i) ! p->driven (1); ! this->set_attribute_value ("pc", save_pc); ! } } } } ! #endif // Then disconnect the call graph notification pins. p = gprof->find_pin ("cg-caller"); if (p) cg_caller_pin.disconnect (p); p = gprof->find_pin ("cg-callee"); ! if (p) cg_callee_pin.disconnect (p); ! gprof_configured_p = false; } void configure_gprof () { ! if (gprof_configured_p) ! return; ! // Connect the call graph notification pins. ! assert (gprof); sid::pin *p = gprof->find_pin ("cg-caller"); if (p) { *************** namespace sidutil *** 511,516 **** --- 510,516 ---- if (last_caller && last_callee) p->driven (last_callee); } + gprof_configured_p = true; } *************** namespace sidutil *** 520,530 **** component *gprof; component *core_probe; component *main; - bool gprof_configured_p; - bool configure_gprof_p; sid::host_int_4 last_caller; sid::host_int_4 last_callee; ! string gprof_spec; virtual void configure (const string &config) { --- 520,528 ---- component *gprof; component *core_probe; component *main; sid::host_int_4 last_caller; sid::host_int_4 last_callee; ! bool gprof_configured_p; virtual void configure (const string &config) { *************** namespace sidutil *** 538,551 **** { if (! gprof) return; // nothing to configure ! gprof_spec = config; ! // Set a flag to configure the gprof component the next time ! // our step! pin is driven.... ! configure_gprof_p = (config.size () > 6); ! // ... unless we are unconfiguring the gprof, in which ! // case do it now. ! if (gprof_configured_p && ! configure_gprof_p) ! unconfigure_gprof (num_cycles); return; } if (config.size () <= 11) --- 536,548 ---- { if (! gprof) return; // nothing to configure ! // First get gprof to configure itself ! gprof->set_attribute_value ("configure!", config); ! // Now do our own configuration ! if (config.size () > 6) ! configure_gprof (); ! else ! unconfigure_gprof (config, num_cycles); return; } if (config.size () <= 11) *************** public: *** 754,763 **** trace_filename ("-"), // standard output trace_pin (this, & basic_cpu::trace_pin_handler), gprof (0), - gprof_configured_p (false), - configure_gprof_p (false), last_caller (0), last_callee (0), core_probe (0), main (0) { --- 751,759 ---- trace_filename ("-"), // standard output trace_pin (this, & basic_cpu::trace_pin_handler), gprof (0), last_caller (0), last_callee (0), + gprof_configured_p (false), core_probe (0), main (0) { Index: sid/main/dynamic/commonCfg.cxx =================================================================== RCS file: /cvs/src/src/sid/main/dynamic/commonCfg.cxx,v retrieving revision 1.10 diff -c -p -r1.10 commonCfg.cxx *** sid/main/dynamic/commonCfg.cxx 19 Aug 2005 19:48:45 -0000 1.10 --- sid/main/dynamic/commonCfg.cxx 23 Aug 2005 20:58:31 -0000 *************** void SchedCfg::set_time (int n, int tv) *** 439,444 **** --- 439,451 ---- set (this, s + "-time", ts); } + void SchedCfg::set_priority (int n, int pv) + { + string s = sidutil::make_attribute (n); + string ps = sidutil::make_attribute (pv); + set (this, s + "-priority", ps); + } + void SchedCfg::write_config (Writer &w) { Setting (this, "num-clients", sidutil::make_attribute (n)).write_to (w); *************** GprofCfg::GprofCfg (const string name, *** 997,1014 **** // used now, it could be used due to dynamic configuration. assert (sess->sim_sched); int slot = sess->sim_sched->add_subscription (this, "sample"); ! if (type == simulated_cycles) ! { ! sess->sim_sched->set_regular (slot, true); ! sess->sim_sched->set_time (slot, interval); ! } ! else // default to instruction_count { string ev = sidutil::make_attribute (cpu->get_subscription_number()); ev += "-event"; conn_pin (sess->sim_sched, ev, this, "sample"); } sess->shutdown_seq->add_output (7, this, "store"); relate (this, "target-component", cpu); conn_pin (cpu, "cg-caller", this, "cg-caller"); --- 1004,1021 ---- // used now, it could be used due to dynamic configuration. assert (sess->sim_sched); int slot = sess->sim_sched->add_subscription (this, "sample"); + sess->sim_sched->set_regular (slot, true); + sess->sim_sched->set_time (slot, interval); + sess->sim_sched->set_priority (slot, SchedCfg::gprof_priority); ! if (type != simulated_cycles) { + // default to instruction_count string ev = sidutil::make_attribute (cpu->get_subscription_number()); ev += "-event"; conn_pin (sess->sim_sched, ev, this, "sample"); } + sess->shutdown_seq->add_output (7, this, "store"); relate (this, "target-component", cpu); conn_pin (cpu, "cg-caller", this, "cg-caller"); *************** GprofCfg::GprofCfg (const string name, *** 1034,1039 **** --- 1041,1049 ---- // used now, it could be used due to dynamic configuration. assert (sess->sim_sched); int slot = sess->sim_sched->add_subscription (this, "sample"); + sess->sim_sched->set_regular (slot, true); + sess->sim_sched->set_time (slot, 1); + sess->sim_sched->set_priority (slot, SchedCfg::gprof_priority); sess->shutdown_seq->add_output (7, this, "store"); relate (this, "target-component", cpu); *************** void BoardCfg::write_load (Writer &w) *** 1228,1236 **** dynamic_configurator = new AtomicCfg ("dynamic-config", "libconfig.la", "config_component_library", "sid-control-dynamic-configurator"); - sess->init_seq->add_output (6, dynamic_configurator, "step!"); sess->reset_net->add_output (2, dynamic_configurator, "reset"); ! sess->sim_sched->add_subscription (dynamic_configurator, "step!", "step-control"); add_child (dynamic_configurator); // If we may need a gprof for dynamic configuration but don't have --- 1238,1246 ---- dynamic_configurator = new AtomicCfg ("dynamic-config", "libconfig.la", "config_component_library", "sid-control-dynamic-configurator"); sess->reset_net->add_output (2, dynamic_configurator, "reset"); ! int slot = sess->sim_sched->add_subscription (dynamic_configurator, "step!", "step-control"); ! sess->sim_sched->set_priority (slot, SchedCfg::config_priority); add_child (dynamic_configurator); // If we may need a gprof for dynamic configuration but don't have Index: sid/main/dynamic/commonCfg.h =================================================================== RCS file: /cvs/src/src/sid/main/dynamic/commonCfg.h,v retrieving revision 1.8 diff -c -p -r1.8 commonCfg.h *** sid/main/dynamic/commonCfg.h 19 Aug 2005 19:48:45 -0000 1.8 --- sid/main/dynamic/commonCfg.h 23 Aug 2005 20:58:38 -0000 *************** public: *** 109,115 **** --- 109,121 ---- string time_low); void set_regular (int n, bool v); void set_time (int n, int tv); + void set_priority (int n, int pv); virtual void write_config (Writer &w); + + static const int config_priority = 2; + static const int gprof_priority = 1; + static const int default_priority = 0; + protected: int n; }; Index: sid/main/dynamic/mainDynamic.cxx =================================================================== RCS file: /cvs/src/src/sid/main/dynamic/mainDynamic.cxx,v retrieving revision 1.7 diff -c -p -r1.7 mainDynamic.cxx *** sid/main/dynamic/mainDynamic.cxx 19 Aug 2005 19:48:45 -0000 1.7 --- sid/main/dynamic/mainDynamic.cxx 23 Aug 2005 20:58:38 -0000 *************** void try_add_gprof(const string optstrin *** 419,425 **** { gprof_type type; string interval_string; ! int interval; vector toks = sidutil::tokenize (optstring, ","); type = instruction_count; // default type value --- 419,425 ---- { gprof_type type; string interval_string; ! int interval = 1; vector toks = sidutil::tokenize (optstring, ","); type = instruction_count; // default type value