gem5
v24.0.0.0
Loading...
Searching...
No Matches
systemc
ext
channel
sc_signal_rv.hh
Go to the documentation of this file.
1
/*
2
* Copyright 2018 Google, Inc.
3
*
4
* Redistribution and use in source and binary forms, with or without
5
* modification, are permitted provided that the following conditions are
6
* met: redistributions of source code must retain the above copyright
7
* notice, this list of conditions and the following disclaimer;
8
* redistributions in binary form must reproduce the above copyright
9
* notice, this list of conditions and the following disclaimer in the
10
* documentation and/or other materials provided with the distribution;
11
* neither the name of the copyright holders nor the names of its
12
* contributors may be used to endorse or promote products derived from
13
* this software without specific prior written permission.
14
*
15
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
21
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
*/
27
28
#ifndef __SYSTEMC_EXT_CHANNEL_SC_SIGNAL_RV_HH__
29
#define __SYSTEMC_EXT_CHANNEL_SC_SIGNAL_RV_HH__
30
31
#include "
../core/sc_module.hh
"
// for sc_gen_unique_name
32
#include "
../dt/bit/sc_logic.hh
"
33
#include "
../dt/bit/sc_lv.hh
"
34
#include "
sc_signal.hh
"
35
36
namespace
sc_gem5
37
{
38
39
class
Process;
40
Process *
getCurrentProcess
();
41
42
}
// namespace sc_gem5
43
44
namespace
sc_dt
45
{
46
47
template
<
int
W>
48
class
sc_lv;
49
50
};
51
52
namespace
sc_core
53
{
54
55
class
sc_port_base;
56
57
template
<
int
W>
58
class
sc_signal_rv
:
public
sc_signal
<sc_dt::sc_lv<W>, SC_MANY_WRITERS>
59
{
60
public
:
61
sc_signal_rv
() :
sc_signal
<
sc_dt
::sc_lv<W>, SC_MANY_WRITERS>(
62
sc_gen_unique_name(
"signal_rv"
))
63
{}
64
sc_signal_rv
(
const
char
*
name
) :
65
sc_signal
<
sc_dt
::sc_lv<W>, SC_MANY_WRITERS>(
name
)
66
{}
67
virtual
~sc_signal_rv
() {}
68
69
virtual
void
register_port
(
sc_port_base
&,
const
char
*) {}
70
71
virtual
void
72
write
(
const
sc_dt::sc_lv<W>
&l)
73
{
74
::sc_gem5::Process
*p =
::sc_gem5::getCurrentProcess
();
75
76
auto
it =
inputs
.find(p);
77
if
(it ==
inputs
.end()) {
78
inputs
.emplace(p, l);
79
this->
request_update
();
80
}
else
if
(it->second != l) {
81
it->second = l;
82
this->
request_update
();
83
}
84
}
85
sc_signal_rv<W>
&
86
operator =
(
const
sc_dt::sc_lv<W>
&l)
87
{
88
write
(l);
89
return
*
this
;
90
}
91
sc_signal_rv<W>
&
92
operator =
(
const
sc_signal_rv<W>
&r)
93
{
94
write
(r.read());
95
return
*
this
;
96
}
97
98
virtual
const
char
*
kind
()
const
{
return
"sc_signal_rv"
; }
99
100
protected
:
101
virtual
void
102
update
()
103
{
104
using
sc_dt::Log_0
;
105
using
sc_dt::Log_1
;
106
using
sc_dt::Log_Z
;
107
using
sc_dt::Log_X
;
108
static
sc_dt::sc_logic_value_t
merge_table[4][4] = {
109
{ Log_0, Log_X, Log_0, Log_X },
110
{ Log_X, Log_1, Log_1, Log_X },
111
{ Log_0, Log_1, Log_Z, Log_X },
112
{ Log_X, Log_X, Log_X, Log_X }
113
};
114
115
// Resolve the inputs, and give the result to the underlying
116
// signal class.
117
for
(
int
i = 0; i < W; i++) {
118
sc_dt::sc_logic_value_t
bit = Log_Z;
119
for
(
auto
&input:
inputs
)
120
bit = merge_table[bit][input.second.get_bit(i)];
121
this->
m_new_val
.set_bit(i, bit);
122
}
123
124
// Ask the signal to update it's value.
125
sc_signal<sc_dt::sc_lv<W>
, SC_MANY_WRITERS>
::update
();
126
}
127
128
private
:
129
// Disabled
130
sc_signal_rv
(
const
sc_signal_rv<W>
&) :
131
sc_signal
<
sc_dt
::sc_lv<W>, SC_MANY_WRITERS>()
132
{}
133
134
std::map<::sc_gem5::Process *, sc_dt::sc_lv<W> >
inputs
;
135
};
136
137
}
// namespace sc_core
138
139
#endif
//__SYSTEMC_EXT_CHANNEL_SC_SIGNAL_RV_HH__
sc_core::sc_port_base
Definition
sc_port.hh:75
sc_core::sc_prim_channel::request_update
void request_update()
Definition
sc_prim.cc:70
sc_core::sc_signal_rv
Definition
sc_signal_rv.hh:59
sc_core::sc_signal_rv::~sc_signal_rv
virtual ~sc_signal_rv()
Definition
sc_signal_rv.hh:67
sc_core::sc_signal_rv::operator=
sc_signal_rv< W > & operator=(const sc_dt::sc_lv< W > &l)
Definition
sc_signal_rv.hh:86
sc_core::sc_signal_rv::register_port
virtual void register_port(sc_port_base &, const char *)
Definition
sc_signal_rv.hh:69
sc_core::sc_signal_rv::write
virtual void write(const sc_dt::sc_lv< W > &l)
Definition
sc_signal_rv.hh:72
sc_core::sc_signal_rv::sc_signal_rv
sc_signal_rv(const char *name)
Definition
sc_signal_rv.hh:64
sc_core::sc_signal_rv::kind
virtual const char * kind() const
Definition
sc_signal_rv.hh:98
sc_core::sc_signal_rv::inputs
std::map<::sc_gem5::Process *, sc_dt::sc_lv< W > > inputs
Definition
sc_signal_rv.hh:134
sc_core::sc_signal_rv::sc_signal_rv
sc_signal_rv()
Definition
sc_signal_rv.hh:61
sc_core::sc_signal_rv::sc_signal_rv
sc_signal_rv(const sc_signal_rv< W > &)
Definition
sc_signal_rv.hh:130
sc_core::sc_signal_rv::update
virtual void update()
Definition
sc_signal_rv.hh:102
sc_core::sc_signal
Definition
sc_signal.hh:273
sc_dt::sc_lv
Definition
sc_lv.hh:68
sc_gem5::Process
Definition
process.hh:63
sc_gem5::ScSignalBaseT< sc_dt::sc_lv< W >, WRITER_POLICY >::m_new_val
sc_dt::sc_lv< W > m_new_val
Definition
sc_signal.hh:236
sc_core
Definition
messages.cc:32
sc_dt
Definition
sc_bit.cc:68
sc_dt::sc_logic_value_t
sc_logic_value_t
Definition
sc_logic.hh:85
sc_dt::Log_Z
@ Log_Z
Definition
sc_logic.hh:88
sc_dt::Log_1
@ Log_1
Definition
sc_logic.hh:87
sc_dt::Log_X
@ Log_X
Definition
sc_logic.hh:89
sc_dt::Log_0
@ Log_0
Definition
sc_logic.hh:86
sc_gem5
Definition
sc_clock.cc:42
sc_gem5::getCurrentProcess
Process * getCurrentProcess()
Definition
scheduler.cc:495
sc_logic.hh
sc_lv.hh
sc_module.hh
sc_signal.hh
name
const std::string & name()
Definition
trace.cc:48
Generated on Tue Jun 18 2024 16:24:06 for gem5 by
doxygen
1.11.0