4141#include " iss_factory.h"
4242#include " tlm/scc/quantum_keeper.h"
4343#include " sysc/memspace_extension.h"
44+ #include " util/range_lut.h"
4445#include < memory>
4546#include < sstream>
4647#include < sysc/kernel/sc_simcontext.h>
@@ -179,10 +180,7 @@ void core_complex<BUSWIDTH, QK>::create_cpu(std::string const& type, std::string
179180#ifndef CWR_SYSTEMC
180181template <unsigned int BUSWIDTH, typename QK>
181182core_complex<BUSWIDTH, QK>::core_complex(sc_module_name const & name)
182- : sc_module(name)
183- , fetch_lut(tlm_dmi_ext())
184- , read_lut(tlm_dmi_ext())
185- , write_lut(tlm_dmi_ext()) {
183+ : sc_module(name) {
186184 init ();
187185}
188186#endif
@@ -195,13 +193,17 @@ template <unsigned int BUSWIDTH, typename QK> void core_complex<BUSWIDTH, QK>::i
195193 }
196194 });
197195 dbus.register_invalidate_direct_mem_ptr ([this ](uint64_t start, uint64_t end) -> void {
198- auto lut_entry = read_lut.getEntry (start);
199- if (lut_entry.get_granted_access () != tlm::tlm_dmi::DMI_ACCESS_NONE && end <= lut_entry.get_end_address () + 1 ) {
200- read_lut.removeEntry (lut_entry);
196+ for (auto & read_lut : dmi_read_luts) {
197+ auto lut_entry = read_lut.getEntry (start);
198+ if (lut_entry.get_granted_access () != tlm::tlm_dmi::DMI_ACCESS_NONE && end <= lut_entry.get_end_address () + 1 ) {
199+ read_lut.removeEntry (lut_entry);
200+ }
201201 }
202- lut_entry = write_lut.getEntry (start);
203- if (lut_entry.get_granted_access () != tlm::tlm_dmi::DMI_ACCESS_NONE && end <= lut_entry.get_end_address () + 1 ) {
204- write_lut.removeEntry (lut_entry);
202+ for (auto & write_lut : dmi_write_luts) {
203+ auto lut_entry = write_lut.getEntry (start);
204+ if (lut_entry.get_granted_access () != tlm::tlm_dmi::DMI_ACCESS_NONE && end <= lut_entry.get_end_address () + 1 ) {
205+ write_lut.removeEntry (lut_entry);
206+ }
205207 }
206208 });
207209
@@ -401,9 +403,8 @@ template <unsigned int BUSWIDTH, typename QK> void core_complex<BUSWIDTH, QK>::r
401403template <unsigned int BUSWIDTH, typename QK>
402404bool core_complex<BUSWIDTH, QK>::read_mem(const addr_t & addr, unsigned length, uint8_t * const data) {
403405 // basically checking for mem_type_e in CORENAME.h
404-
405406 bool is_fetch = addr.space == std::numeric_limits<decltype (addr.space )>::max () ? true : false ;
406- auto & dmi_lut = is_fetch ? fetch_lut : read_lut ;
407+ auto & dmi_lut = is_fetch ? fetch_lut : get_read_lut (addr. space ) ;
407408 auto lut_entry = dmi_lut.getEntry (addr.val );
408409 if (lut_entry.get_granted_access () != tlm::tlm_dmi::DMI_ACCESS_NONE && (addr.val + length) <= (lut_entry.get_end_address () + 1 )) {
409410 auto offset = addr.val - lut_entry.get_start_address ();
@@ -463,7 +464,7 @@ bool core_complex<BUSWIDTH, QK>::read_mem(const addr_t& addr, unsigned length, u
463464
464465template <unsigned int BUSWIDTH, typename QK>
465466bool core_complex<BUSWIDTH, QK>::write_mem(const addr_t & addr, unsigned length, const uint8_t * const data) {
466- auto lut_entry = write_lut .getEntry (addr.val );
467+ auto lut_entry = get_write_lut (addr. space ) .getEntry (addr.val );
467468 if (lut_entry.get_granted_access () != tlm::tlm_dmi::DMI_ACCESS_NONE && (addr.val + length) <= (lut_entry.get_end_address () + 1 )) {
468469 auto offset = addr.val - lut_entry.get_start_address ();
469470 std::copy (data, data + length, lut_entry.get_dmi_ptr () + offset);
@@ -506,8 +507,8 @@ bool core_complex<BUSWIDTH, QK>::write_mem(const addr_t& addr, unsigned length,
506507 tlm_dmi_ext dmi_data;
507508 if (exec_get_direct_mem_ptr (gp, dmi_data)) {
508509 if (dmi_data.is_write_allowed () && (addr.val + length - 1 ) <= dmi_data.get_end_address ())
509- write_lut. addEntry (dmi_data, dmi_data. get_start_address (),
510- dmi_data.get_end_address () - dmi_data.get_start_address () + 1 );
510+ get_write_lut (addr. space )
511+ . addEntry (dmi_data, dmi_data. get_start_address (), dmi_data.get_end_address () - dmi_data.get_start_address () + 1 );
511512 }
512513 }
513514 return true ;
@@ -539,6 +540,22 @@ bool core_complex<BUSWIDTH, QK>::write_mem_dbg(const addr_t& addr, unsigned leng
539540 gp.set_extension (new sysc::memspace::tlm_memspace_extension<>(static_cast <memspace::common>(addr.space )));
540541 return dbus->transport_dbg (gp) == length;
541542}
543+ template <unsigned int BUSWIDTH, typename QK> util::range_lut<tlm_dmi_ext>& core_complex<BUSWIDTH, QK>::get_read_lut(unsigned space) {
544+ return get_lut (dmi_read_luts, space);
545+ };
546+ template <unsigned int BUSWIDTH, typename QK> util::range_lut<tlm_dmi_ext>& core_complex<BUSWIDTH, QK>::get_write_lut(unsigned space) {
547+ return get_lut (dmi_write_luts, space);
548+ };
549+ template <unsigned int BUSWIDTH, typename QK>
550+ util::range_lut<tlm_dmi_ext>& core_complex<BUSWIDTH, QK>::get_lut(lut_vec_t & luts, unsigned space) {
551+ if (space >= luts.size ()) {
552+ luts.reserve (space + 1 );
553+ // cannot use resize as assignment and move assignment operator are not supported by range_luts with tlm_dmi_ext as defaults
554+ while (space >= luts.size ())
555+ luts.emplace_back (tlm_dmi_ext ());
556+ }
557+ return luts[space];
558+ };
542559
543560template class core_complex <scc::LT>;
544561template class core_complex <32 >;
0 commit comments