diff --git a/src/mem/ruby/structures/TBETable.hh b/src/mem/ruby/structures/TBETable.hh index 72770ce42f..8c93c7dc09 100644 --- a/src/mem/ruby/structures/TBETable.hh +++ b/src/mem/ruby/structures/TBETable.hh @@ -45,6 +45,7 @@ #include #include "mem/ruby/common/Address.hh" +#include "mem/ruby/system/RubySystem.hh" namespace gem5 { @@ -70,7 +71,7 @@ class TBETable return (m_number_of_TBEs - m_map.size()) >= n; } - void setBlockSize(const int block_size) { m_block_size = block_size; } + void setRubySystem(RubySystem* rs); ENTRY *getNullEntry(); ENTRY *lookup(Addr address); @@ -89,6 +90,10 @@ class TBETable private: int m_number_of_TBEs = 0; int m_block_size = 0; + RubySystem* m_ruby_system = nullptr; + + static constexpr bool entryRequiresRubySystem = + std::is_member_function_pointer_v; }; template @@ -100,6 +105,14 @@ operator<<(std::ostream& out, const TBETable& obj) return out; } +template +inline +void TBETable::setRubySystem(RubySystem* rs) +{ + m_ruby_system = rs; + m_block_size = rs->getBlockSizeBytes(); +} + template inline bool TBETable::isPresent(Addr address) const @@ -116,7 +129,9 @@ TBETable::allocate(Addr address) assert(!isPresent(address)); assert(m_map.size() < m_number_of_TBEs); assert(m_block_size > 0); - m_map.emplace(address, ENTRY(m_block_size)); + ENTRY new_entry = ENTRY(m_block_size); + new_entry.setRubySystem(m_ruby_system); + m_map.emplace(address, new_entry); } template diff --git a/src/mem/slicc/symbols/StateMachine.py b/src/mem/slicc/symbols/StateMachine.py index c1052086bf..d7b94c24b1 100644 --- a/src/mem/slicc/symbols/StateMachine.py +++ b/src/mem/slicc/symbols/StateMachine.py @@ -831,13 +831,13 @@ $c_ident::init() comment = f"Type {vtype.ident} default" code('*$vid = ${{vtype["default"]}}; // $comment') - # For objects that require knowing the cache line size, + # For objects that require a pointer to RubySystem, # set the value here. - if vtype.c_ident in ("TBETable"): - block_size_func = "m_ruby_system->getBlockSizeBytes()" - code(f"(*{vid}).setBlockSize({block_size_func});") - - if vtype.c_ident in ("NetDest", "PerfectCacheMemory"): + if vtype.c_ident in ( + "NetDest", + "PerfectCacheMemory", + "TBETable", + ): code(f"(*{vid}).setRubySystem(m_ruby_system);") for param in self.config_parameters: @@ -1271,7 +1271,6 @@ void $c_ident::set_tbe(${{self.TBEType.c_ident}}*& m_tbe_ptr, ${{self.TBEType.c_ident}}* m_new_tbe) { m_tbe_ptr = m_new_tbe; - m_tbe_ptr->setRubySystem(m_ruby_system); } void