56template <
class owner_t>
class tlm_target_bfs_base {
58 sc_core::sc_in<bool> rst_in_{
"reset_in"};
59 std::unique_ptr<std::vector<sc_core::sc_out<bool>>> irq_out_{
nullptr};
61 tlm_target_bfs_base(tlm_target_bfs_params_t&& params, owner_t* owner =
nullptr)
62 : params_{std::move(params)}
64 irq_out_ = util::make_unique<std::vector<sc_core::sc_out<bool>>>(params_.num_irqs);
66 virtual ~tlm_target_bfs_base() =
default;
68 const owner_t* getOwner()
const {
return owner_; }
70 void bindIRQ(
size_t num, sc_core::sc_signal<bool>* sig) {
71 if(num >= irq_out_->size()) {
72 SC_REPORT_FATAL(ID_SCC_TLM_TARGET_BFS,
"not enough IRQs in Per::connectIRQ()");
75 (*irq_out_)[num].bind(*sig);
79 const tlm_target_bfs_params_t params_{};
80 owner_t*
const owner_{
nullptr};
91class tlm_target_bfs :
public sc_core::sc_module,
public tlm_target_bfs_base<owner_t>,
public scc::tlm_target<> {
92 SC_HAS_PROCESS(tlm_target_bfs);
95 class socket_accessor {
99 socket_accessor(
const socket_accessor&) =
delete;
100 socket_accessor& operator=(
const socket_accessor&) =
delete;
102 tlm::tlm_target_socket<LT>* get()
noexcept {
return &parent.socket; }
108 using tlm_target_bfs_base<owner_t>::rst_in_;
110 tlm_target_bfs(sc_core::sc_module_name name, tlm_target_bfs_params_t&& params, owner_t* owner =
nullptr)
111 : sc_core::sc_module{name}
112 , tlm_target_bfs_base<owner_t>{std::move(params), owner}
114 , NAMEDD(regs, regs_t) {
115 regs->registerResources(*
this);
117 sensitive << rst_in_;
128 std::unique_ptr<regs_t> regs;
129 sc_core::sc_time clk;