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