Skip to content

Commit

Permalink
Extracted tlm_signal into separate file and added signal interface
Browse files Browse the repository at this point in the history
  • Loading branch information
eyck committed Jul 28, 2018
1 parent 57853f5 commit 0e5cf3f
Show file tree
Hide file tree
Showing 2 changed files with 94 additions and 72 deletions.
94 changes: 94 additions & 0 deletions incl/tlm/tlm_signal.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,98 @@
#include "tlm_signal_gp.h"
#include "tlm_signal_sockets.h"

namespace tlm {

template<typename SIG=bool, typename TYPES = tlm_signal_baseprotocol_types<SIG>, int N = 32>
struct tlm_signal:
public sc_core::sc_module,
public tlm_signal_fw_transport_if<SIG, TYPES>,
public tlm_signal_bw_transport_if<SIG, TYPES>,
sc_core::sc_signal_in_if<SIG>
{
using tlm_signal_type = SIG;
using protocol_types = TYPES;
using payload_type = typename TYPES::tlm_payload_type;
using phase_type = typename TYPES::tlm_phase_type;

SC_HAS_PROCESS(tlm_signal);

tlm_signal_opt_target_socket<tlm_signal_type, protocol_types, N> in;

tlm_signal_opt_initiator_socket<tlm_signal_type, protocol_types, N> out;

tlm_signal(sc_core::sc_module_name nm)
: sc_core::sc_module(nm)
, in(sc_core::sc_gen_unique_name("in"))
, out(sc_core::sc_gen_unique_name("out"))
{
in.bind(*(tlm_signal_fw_transport_if<tlm_signal_type, protocol_types>*)this);
out.bind(*(tlm_signal_bw_transport_if<tlm_signal_type, protocol_types>*)this);
SC_METHOD(que_cb);
sensitive<<que.event();
}

void trace( sc_core::sc_trace_file* tf ) const override;

const char* kind() const override { return "tlm_signal"; }

tlm_sync_enum nb_transport_fw(payload_type&, phase_type&, sc_core::sc_time&) override;

tlm_sync_enum nb_transport_bw(payload_type&, phase_type&, sc_core::sc_time&) override;

// get the value changed event
const sc_core::sc_event& value_changed_event() const override {return value.value_changed_event();}
// read the current value
const SIG& read() const override{ return value.read();}
// get a reference to the current value (for tracing)
const SIG& get_data_ref() const override {return value.get_data_ref();}
// was there a value changed event?
bool event() const override {return false;}

const sc_core::sc_event& default_event() const override {return value.default_event();}

const sc_core::sc_event& posedge_event() const override {return value.posedge_event();}

const sc_core::sc_event& negedge_event() const override {return value.negedge_event();}

bool posedge() const override {return value.posedge();}

bool negedge() const override {return value.posedge();};

private:
void que_cb();
scc::peq<tlm_signal_type> que;
sc_core::sc_signal<tlm_signal_type> value;
};

template<typename SIG , typename TYPES, int N>
void tlm_signal<SIG, TYPES, N>::trace(sc_core::sc_trace_file* tf) const {
sc_trace(tf, value, name());
}


template<typename SIG, typename TYPES, int N>
tlm_sync_enum tlm::tlm_signal<SIG, TYPES, N>::nb_transport_fw(payload_type& gp, phase_type& phase, sc_core::sc_time& delay) {
que.notify(gp.get_value(), delay);
auto& p = out.get_base_port();
for(size_t i=0; i<p.size(); ++i){
p.get_interface(i)->nb_transport_fw(gp, phase, delay);
}
}

template<typename SIG, typename TYPES, int N>
tlm_sync_enum tlm::tlm_signal<SIG, TYPES, N>::nb_transport_bw(payload_type& gp, phase_type& phase, sc_core::sc_time& delay) {
auto& p = in.get_base_port();
for(size_t i=0; i<p.size(); ++i){
p.get_interface(i)->nb_transport_bw(gp, phase, delay);
}
}

template<typename SIG, typename TYPES, int N>
void tlm::tlm_signal<SIG, TYPES, N>::que_cb(){
while(auto oi = que.get_next())
value.write(oi.value());
}

}
#endif /* _TLM_TLM_SIGNAL_H_ */
72 changes: 0 additions & 72 deletions incl/tlm/tlm_signal_sockets.h
Original file line number Diff line number Diff line change
Expand Up @@ -121,78 +121,6 @@ struct tlm_signal_target_socket :
template <typename SIG=bool, typename TYPES = tlm_signal_baseprotocol_types<SIG>, int N = 1>
using tlm_signal_opt_target_socket = struct tlm_signal_target_socket<SIG, TYPES, N, sc_core::SC_ZERO_OR_MORE_BOUND>;


template<typename SIG=bool, typename TYPES = tlm_signal_baseprotocol_types<SIG>, int N = 32>
struct tlm_signal:
public sc_core::sc_module,
public tlm_signal_fw_transport_if<SIG, TYPES>,
public tlm_signal_bw_transport_if<SIG, TYPES>
{
using tlm_signal_type = SIG;
using protocol_types = TYPES;
using payload_type = typename TYPES::tlm_payload_type;
using phase_type = typename TYPES::tlm_phase_type;

SC_HAS_PROCESS(tlm_signal);

tlm_signal_opt_target_socket<tlm_signal_type, protocol_types, N> in;

tlm_signal_opt_initiator_socket<tlm_signal_type, protocol_types, N> out;

tlm_signal(sc_core::sc_module_name nm)
: sc_core::sc_module(nm)
, in(sc_core::sc_gen_unique_name("in"))
, out(sc_core::sc_gen_unique_name("out"))
{
in.bind(*(tlm_signal_fw_transport_if<tlm_signal_type, protocol_types>*)this);
out.bind(*(tlm_signal_bw_transport_if<tlm_signal_type, protocol_types>*)this);
SC_METHOD(que_cb);
sensitive<<que.event();
}

void trace( sc_core::sc_trace_file* tf ) const override;

const char* kind() const override { return "tlm_signal"; }

tlm_sync_enum nb_transport_fw(payload_type&, phase_type&, sc_core::sc_time&) override;

tlm_sync_enum nb_transport_bw(payload_type&, phase_type&, sc_core::sc_time&) override;

private:
void que_cb();
scc::peq<tlm_signal_type> que;
tlm_signal_type value;
};

template<typename SIG , typename TYPES, int N>
void tlm_signal<SIG, TYPES, N>::trace(sc_core::sc_trace_file* tf) const {
sc_trace(tf, value, name());
}


template<typename SIG, typename TYPES, int N>
tlm_sync_enum tlm::tlm_signal<SIG, TYPES, N>::nb_transport_fw(payload_type& gp, phase_type& phase, sc_core::sc_time& delay) {
que.notify(gp.get_value(), delay);
auto& p = out.get_base_port();
for(size_t i=0; i<p.size(); ++i){
p.get_interface(i)->nb_transport_fw(gp, phase, delay);
}
}

template<typename SIG, typename TYPES, int N>
tlm_sync_enum tlm::tlm_signal<SIG, TYPES, N>::nb_transport_bw(payload_type& gp, phase_type& phase, sc_core::sc_time& delay) {
auto& p = in.get_base_port();
for(size_t i=0; i<p.size(); ++i){
p.get_interface(i)->nb_transport_bw(gp, phase, delay);
}
}

template<typename SIG, typename TYPES, int N>
void tlm::tlm_signal<SIG, TYPES, N>::que_cb(){
while(auto oi = que.get_next())
value=oi.value();
}

}

#endif /* _TLM_TLM_SIGNAL_SOCKETS_H_ */

0 comments on commit 0e5cf3f

Please sign in to comment.