sensitivity.cc revision 13207:034ca389a810
19665Sandreas.hansson@arm.com/* 29665Sandreas.hansson@arm.com * Copyright 2018 Google, Inc. 39665Sandreas.hansson@arm.com * 49665Sandreas.hansson@arm.com * Redistribution and use in source and binary forms, with or without 59665Sandreas.hansson@arm.com * modification, are permitted provided that the following conditions are 69665Sandreas.hansson@arm.com * met: redistributions of source code must retain the above copyright 79665Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer; 89665Sandreas.hansson@arm.com * redistributions in binary form must reproduce the above copyright 99665Sandreas.hansson@arm.com * notice, this list of conditions and the following disclaimer in the 109665Sandreas.hansson@arm.com * documentation and/or other materials provided with the distribution; 119665Sandreas.hansson@arm.com * neither the name of the copyright holders nor the names of its 129665Sandreas.hansson@arm.com * contributors may be used to endorse or promote products derived from 135353Svilas.sridharan@gmail.com * this software without specific prior written permission. 143395Shsul@eecs.umich.edu * 153395Shsul@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 163395Shsul@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 173395Shsul@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 183395Shsul@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 193395Shsul@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 203395Shsul@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 213395Shsul@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 223395Shsul@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 233395Shsul@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 243395Shsul@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 253395Shsul@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 263395Shsul@eecs.umich.edu * 273395Shsul@eecs.umich.edu * Authors: Gabe Black 283395Shsul@eecs.umich.edu */ 293395Shsul@eecs.umich.edu 303395Shsul@eecs.umich.edu#include "systemc/core/sensitivity.hh" 313395Shsul@eecs.umich.edu 323395Shsul@eecs.umich.edu#include "systemc/core/event.hh" 333395Shsul@eecs.umich.edu#include "systemc/core/port.hh" 343395Shsul@eecs.umich.edu#include "systemc/core/scheduler.hh" 353395Shsul@eecs.umich.edu#include "systemc/ext/core/sc_export.hh" 363395Shsul@eecs.umich.edu#include "systemc/ext/core/sc_interface.hh" 373395Shsul@eecs.umich.edu#include "systemc/ext/core/sc_port.hh" 383395Shsul@eecs.umich.edu 393395Shsul@eecs.umich.edunamespace sc_gem5 403395Shsul@eecs.umich.edu{ 418920Snilay@cs.wisc.edu 428920Snilay@cs.wisc.edu/* 438920Snilay@cs.wisc.edu * Common sensitivity interface. 4411688Sandreas.hansson@arm.com */ 457025SBrad.Beckmann@amd.com 4611688Sandreas.hansson@arm.comvoid 4711688Sandreas.hansson@arm.comSensitivity::satisfy() 4811688Sandreas.hansson@arm.com{ 4910747SChris.Emmons@arm.com process->satisfySensitivity(this); 509520SAndreas.Sandberg@ARM.com} 519520SAndreas.Sandberg@ARM.com 529520SAndreas.Sandberg@ARM.combool 539520SAndreas.Sandberg@ARM.comSensitivity::notify(Event *e) 549665Sandreas.hansson@arm.com{ 559665Sandreas.hansson@arm.com if (process->disabled()) 569665Sandreas.hansson@arm.com return false; 579665Sandreas.hansson@arm.com return notifyWork(e); 5811238Sandreas.sandberg@arm.com} 5911238Sandreas.sandberg@arm.com 6011238Sandreas.sandberg@arm.com 6111238Sandreas.sandberg@arm.com/* 6211688Sandreas.hansson@arm.com * Dynamic vs. static sensitivity. 6311688Sandreas.hansson@arm.com */ 6411688Sandreas.hansson@arm.com 6511688Sandreas.hansson@arm.comvoid 668920Snilay@cs.wisc.eduDynamicSensitivity::addToEvent(const ::sc_core::sc_event *e) 679827Sakash.bagdia@arm.com{ 689827Sakash.bagdia@arm.com Event::getFromScEvent(e)->addSensitivity(this); 699827Sakash.bagdia@arm.com} 709827Sakash.bagdia@arm.com 719790Sakash.bagdia@arm.comvoid 729790Sakash.bagdia@arm.comDynamicSensitivity::delFromEvent(const ::sc_core::sc_event *e) 739790Sakash.bagdia@arm.com{ 749790Sakash.bagdia@arm.com Event::getFromScEvent(e)->delSensitivity(this); 7511688Sandreas.hansson@arm.com} 7611688Sandreas.hansson@arm.com 7711688Sandreas.hansson@arm.comvoid 7811688Sandreas.hansson@arm.comStaticSensitivity::addToEvent(const ::sc_core::sc_event *e) 7911688Sandreas.hansson@arm.com{ 8011688Sandreas.hansson@arm.com Event::getFromScEvent(e)->addSensitivity(this); 8111688Sandreas.hansson@arm.com} 8211688Sandreas.hansson@arm.com 8311688Sandreas.hansson@arm.comvoid 8411688Sandreas.hansson@arm.comStaticSensitivity::delFromEvent(const ::sc_core::sc_event *e) 8511688Sandreas.hansson@arm.com{ 8611688Sandreas.hansson@arm.com Event::getFromScEvent(e)->delSensitivity(this); 8711688Sandreas.hansson@arm.com} 8811688Sandreas.hansson@arm.com 8911688Sandreas.hansson@arm.com 9011688Sandreas.hansson@arm.com/* 9111688Sandreas.hansson@arm.com * Static sensitivities. 9211688Sandreas.hansson@arm.com */ 9311688Sandreas.hansson@arm.com 9411688Sandreas.hansson@arm.comvoid 9511688Sandreas.hansson@arm.comnewStaticSensitivityEvent(Process *p, const sc_core::sc_event *e) 9611688Sandreas.hansson@arm.com{ 9711688Sandreas.hansson@arm.com auto s = new StaticSensitivityEvent(p, e); 9811688Sandreas.hansson@arm.com s->addToEvent(s->event); 9911688Sandreas.hansson@arm.com p->addStatic(s); 10011688Sandreas.hansson@arm.com} 10111688Sandreas.hansson@arm.com 10211688Sandreas.hansson@arm.comvoid 10311688Sandreas.hansson@arm.comnewStaticSensitivityInterface(Process *p, const sc_core::sc_interface *i) 10411688Sandreas.hansson@arm.com{ 10511688Sandreas.hansson@arm.com auto s = new StaticSensitivityInterface(p, i); 10611688Sandreas.hansson@arm.com s->addToEvent(s->event); 10711688Sandreas.hansson@arm.com p->addStatic(s); 10811688Sandreas.hansson@arm.com} 10911688Sandreas.hansson@arm.com 11011688Sandreas.hansson@arm.comvoid 11111688Sandreas.hansson@arm.comnewStaticSensitivityPort(Process *p, const sc_core::sc_port_base *pb) 11211688Sandreas.hansson@arm.com{ 11311688Sandreas.hansson@arm.com auto s = new StaticSensitivityPort(p); 11411688Sandreas.hansson@arm.com Port *port = Port::fromPort(pb); 11511688Sandreas.hansson@arm.com port->sensitive(s); 11611688Sandreas.hansson@arm.com p->addStatic(s); 11711688Sandreas.hansson@arm.com} 11811688Sandreas.hansson@arm.com 11911688Sandreas.hansson@arm.comvoid 12011688Sandreas.hansson@arm.comnewStaticSensitivityExport(Process *p, const sc_core::sc_export_base *exp) 12111688Sandreas.hansson@arm.com{ 12211688Sandreas.hansson@arm.com auto s = new StaticSensitivityExport(p, exp); 12311688Sandreas.hansson@arm.com s->addToEvent(s->event); 12411688Sandreas.hansson@arm.com p->addStatic(s); 12511688Sandreas.hansson@arm.com} 12611688Sandreas.hansson@arm.com 12711688Sandreas.hansson@arm.comvoid 12811688Sandreas.hansson@arm.comnewStaticSensitivityFinder(Process *p, const sc_core::sc_event_finder *f) 12911688Sandreas.hansson@arm.com{ 13011688Sandreas.hansson@arm.com auto s = new StaticSensitivityFinder(p, f); 13111688Sandreas.hansson@arm.com Port *port = Port::fromPort(f->port()); 13211688Sandreas.hansson@arm.com port->sensitive(s); 13311688Sandreas.hansson@arm.com p->addStatic(s); 13411688Sandreas.hansson@arm.com} 13511688Sandreas.hansson@arm.com 13611688Sandreas.hansson@arm.com 13711688Sandreas.hansson@arm.comStaticSensitivityInterface::StaticSensitivityInterface( 13811688Sandreas.hansson@arm.com Process *p, const sc_core::sc_interface *i) : 13911688Sandreas.hansson@arm.com Sensitivity(p), StaticSensitivity(p), 14011688Sandreas.hansson@arm.com SensitivityEvent(p, &i->default_event()) 14111688Sandreas.hansson@arm.com{} 1429789Sakash.bagdia@arm.com 1439789Sakash.bagdia@arm.comStaticSensitivityExport::StaticSensitivityExport( 1449789Sakash.bagdia@arm.com Process *p, const sc_core::sc_export_base *exp) : 1459800Snilay@cs.wisc.edu Sensitivity(p), StaticSensitivity(p), 1469800Snilay@cs.wisc.edu SensitivityEvent(p, &exp->get_interface()->default_event()) 1479800Snilay@cs.wisc.edu{} 1489800Snilay@cs.wisc.edu 1499800Snilay@cs.wisc.educonst ::sc_core::sc_event & 15011251Sradhika.jagtap@ARM.comStaticSensitivityFinder::find(::sc_core::sc_interface *i) 15111251Sradhika.jagtap@ARM.com{ 15211251Sradhika.jagtap@ARM.com return finder->find_event(i); 15311251Sradhika.jagtap@ARM.com} 15411251Sradhika.jagtap@ARM.com 15511251Sradhika.jagtap@ARM.com 15611251Sradhika.jagtap@ARM.com/* 15711251Sradhika.jagtap@ARM.com * Dynamic sensitivities. 15811251Sradhika.jagtap@ARM.com */ 15911251Sradhika.jagtap@ARM.com 16011251Sradhika.jagtap@ARM.comvoid 16111251Sradhika.jagtap@ARM.comnewDynamicSensitivityEvent(Process *p, const sc_core::sc_event *e) 16211251Sradhika.jagtap@ARM.com{ 1639800Snilay@cs.wisc.edu auto s = new DynamicSensitivityEvent(p, e); 16410037SARM gem5 Developers s->addToEvent(s->event); 16510037SARM gem5 Developers p->setDynamic(s); 16610037SARM gem5 Developers} 1679800Snilay@cs.wisc.edu 1689800Snilay@cs.wisc.eduvoid 16911626Smichael.lebeane@amd.comnewDynamicSensitivityEventOrList( 17011626Smichael.lebeane@amd.com Process *p, const sc_core::sc_event_or_list *eol) 17111626Smichael.lebeane@amd.com{ 17211703Smichael.lebeane@amd.com auto s = new DynamicSensitivityEventOrList(p, eol); 17311703Smichael.lebeane@amd.com for (auto event: s->events) 17411626Smichael.lebeane@amd.com s->addToEvent(event); 17511626Smichael.lebeane@amd.com p->setDynamic(s); 17611626Smichael.lebeane@amd.com} 17711626Smichael.lebeane@amd.com 17811626Smichael.lebeane@amd.comvoid newDynamicSensitivityEventAndList( 17911626Smichael.lebeane@amd.com Process *p, const sc_core::sc_event_and_list *eal) 18011626Smichael.lebeane@amd.com{ 18111626Smichael.lebeane@amd.com auto s = new DynamicSensitivityEventAndList(p, eal); 18211626Smichael.lebeane@amd.com for (auto event: s->events) 18311626Smichael.lebeane@amd.com s->addToEvent(event); 18411626Smichael.lebeane@amd.com p->setDynamic(s); 18511626Smichael.lebeane@amd.com} 18611626Smichael.lebeane@amd.com 18711626Smichael.lebeane@amd.com 18811626Smichael.lebeane@amd.comDynamicSensitivityEventOrList::DynamicSensitivityEventOrList( 18911626Smichael.lebeane@amd.com Process *p, const sc_core::sc_event_or_list *eol) : 19011626Smichael.lebeane@amd.com Sensitivity(p), DynamicSensitivity(p), SensitivityEvents(p, eol->events) 19111626Smichael.lebeane@amd.com{} 19211626Smichael.lebeane@amd.com 19311626Smichael.lebeane@amd.combool 19411626Smichael.lebeane@amd.comDynamicSensitivityEventOrList::notifyWork(Event *e) 19511626Smichael.lebeane@amd.com{ 19611626Smichael.lebeane@amd.com events.erase(e->sc_event()); 19711626Smichael.lebeane@amd.com 19811626Smichael.lebeane@amd.com // All the other events need this deleted from their lists since this 19911626Smichael.lebeane@amd.com // sensitivity has been satisfied without them triggering. 20011626Smichael.lebeane@amd.com for (auto le: events) 20111626Smichael.lebeane@amd.com delFromEvent(le); 20211626Smichael.lebeane@amd.com 20311626Smichael.lebeane@amd.com satisfy(); 2048920Snilay@cs.wisc.edu return true; 2058920Snilay@cs.wisc.edu} 2068920Snilay@cs.wisc.edu 2078920Snilay@cs.wisc.eduDynamicSensitivityEventAndList::DynamicSensitivityEventAndList( 2088920Snilay@cs.wisc.edu Process *p, const sc_core::sc_event_and_list *eal) : 2098920Snilay@cs.wisc.edu Sensitivity(p), DynamicSensitivity(p), SensitivityEvents(p, eal->events) 21010159Sgedare@rtems.org{} 21110159Sgedare@rtems.org 2128920Snilay@cs.wisc.edubool 2138920Snilay@cs.wisc.eduDynamicSensitivityEventAndList::notifyWork(Event *e) 2148920Snilay@cs.wisc.edu{ 2158920Snilay@cs.wisc.edu events.erase(e->sc_event()); 2168920Snilay@cs.wisc.edu 2178920Snilay@cs.wisc.edu // This sensitivity is satisfied if all events have triggered. 2188920Snilay@cs.wisc.edu if (events.empty()) 2198920Snilay@cs.wisc.edu satisfy(); 2208920Snilay@cs.wisc.edu 22110757SCurtis.Dunham@arm.com return true; 22210757SCurtis.Dunham@arm.com} 22310757SCurtis.Dunham@arm.com 2246776SBrad.Beckmann@amd.com} // namespace sc_gem5 2259800Snilay@cs.wisc.edu