ruby: change slicc to allow for constructor args

The patch adds support to slicc for recognizing arguments that should be
passed to the constructor of a class. I did not like the fact that an explicit
check was being carried on the type 'TBETable' to figure out the arguments to
be passed to the constructor.
The patch also moves some of the member variables that are declared for all
the controllers to the base class AbstractController.
This commit is contained in:
Nilay Vaish 2012-12-11 10:05:55 -06:00
parent 93e283abb3
commit 9b72a0f627
18 changed files with 46 additions and 81 deletions

View file

@ -126,7 +126,7 @@ machine(L1Cache, "MESI Directory L1 Cache CMP")
bool isPresent(Address); bool isPresent(Address);
} }
TBETable L1_TBEs, template="<L1Cache_TBE>"; TBETable L1_TBEs, template="<L1Cache_TBE>", constructor="m_number_of_TBEs";
MessageBuffer mandatoryQueue, ordered="false"; MessageBuffer mandatoryQueue, ordered="false";

View file

@ -151,7 +151,7 @@ machine(L2Cache, "MESI Directory L2 Cache CMP")
bool isPresent(Address); bool isPresent(Address);
} }
TBETable L2_TBEs, template="<L2Cache_TBE>"; TBETable L2_TBEs, template="<L2Cache_TBE>", constructor="m_number_of_TBEs";
void set_cache_entry(AbstractCacheEntry a); void set_cache_entry(AbstractCacheEntry a);
void unset_cache_entry(); void unset_cache_entry();

View file

@ -105,7 +105,7 @@ machine(Directory, "MESI_CMP_filter_directory protocol")
// ** OBJECTS ** // ** OBJECTS **
TBETable TBEs, template="<Directory_TBE>"; TBETable TBEs, template="<Directory_TBE>", constructor="m_number_of_TBEs";
void set_tbe(TBE tbe); void set_tbe(TBE tbe);
void unset_tbe(); void unset_tbe();

View file

@ -98,7 +98,7 @@ machine(L1Cache, "MI Example L1 Cache")
// STRUCTURES // STRUCTURES
TBETable TBEs, template="<L1Cache_TBE>"; TBETable TBEs, template="<L1Cache_TBE>", constructor="m_number_of_TBEs";
// PROTOTYPES // PROTOTYPES
void set_cache_entry(AbstractCacheEntry a); void set_cache_entry(AbstractCacheEntry a);

View file

@ -102,7 +102,7 @@ machine(Directory, "Directory protocol")
} }
// ** OBJECTS ** // ** OBJECTS **
TBETable TBEs, template="<Directory_TBE>"; TBETable TBEs, template="<Directory_TBE>", constructor="m_number_of_TBEs";
void set_tbe(TBE b); void set_tbe(TBE b);
void unset_tbe(); void unset_tbe();

View file

@ -142,7 +142,7 @@ machine(L1Cache, "Directory protocol")
MessageBuffer mandatoryQueue, ordered="false", abstract_chip_ptr="true"; MessageBuffer mandatoryQueue, ordered="false", abstract_chip_ptr="true";
TBETable TBEs, template="<L1Cache_TBE>"; TBETable TBEs, template="<L1Cache_TBE>", constructor="m_number_of_TBEs";
TimerTable useTimerTable; TimerTable useTimerTable;
int l2_select_low_bit, default="RubySystem::getBlockSizeBits()"; int l2_select_low_bit, default="RubySystem::getBlockSizeBits()";

View file

@ -224,8 +224,7 @@ machine(L2Cache, "Token protocol")
bool isTagPresent(Address); bool isTagPresent(Address);
} }
TBETable TBEs, template="<L2Cache_TBE>", constructor="m_number_of_TBEs";
TBETable TBEs, template="<L2Cache_TBE>";
PerfectCacheMemory localDirectory, template="<L2Cache_DirEntry>"; PerfectCacheMemory localDirectory, template="<L2Cache_DirEntry>";
void set_cache_entry(AbstractCacheEntry b); void set_cache_entry(AbstractCacheEntry b);

View file

@ -1,4 +1,3 @@
/* /*
* Copyright (c) 1999-2005 Mark D. Hill and David A. Wood * Copyright (c) 1999-2005 Mark D. Hill and David A. Wood
* All rights reserved. * All rights reserved.
@ -119,7 +118,7 @@ machine(Directory, "Directory protocol")
} }
// ** OBJECTS ** // ** OBJECTS **
TBETable TBEs, template="<Directory_TBE>"; TBETable TBEs, template="<Directory_TBE>", constructor="m_number_of_TBEs";
void set_tbe(TBE b); void set_tbe(TBE b);
void unset_tbe(); void unset_tbe();

View file

@ -44,7 +44,7 @@ machine(DMA, "DMA Controller")
MessageBuffer mandatoryQueue, ordered="false"; MessageBuffer mandatoryQueue, ordered="false";
MessageBuffer triggerQueue, ordered="true"; MessageBuffer triggerQueue, ordered="true";
TBETable TBEs, template="<DMA_TBE>"; TBETable TBEs, template="<DMA_TBE>", constructor="m_number_of_TBEs";
State cur_state; State cur_state;
void set_tbe(TBE b); void set_tbe(TBE b);

View file

@ -180,7 +180,7 @@ machine(L1Cache, "Token protocol")
void wakeUpAllBuffers(); void wakeUpAllBuffers();
void wakeUpBuffers(Address a); void wakeUpBuffers(Address a);
TBETable L1_TBEs, template="<L1Cache_TBE>"; TBETable L1_TBEs, template="<L1Cache_TBE>", constructor="m_number_of_TBEs";
MessageBuffer mandatoryQueue, ordered="false", abstract_chip_ptr="true"; MessageBuffer mandatoryQueue, ordered="false", abstract_chip_ptr="true";

View file

@ -157,7 +157,7 @@ machine(Directory, "Token protocol")
PersistentTable persistentTable; PersistentTable persistentTable;
TimerTable reissueTimerTable; TimerTable reissueTimerTable;
TBETable TBEs, template="<Directory_TBE>"; TBETable TBEs, template="<Directory_TBE>", constructor="m_number_of_TBEs";
bool starving, default="false"; bool starving, default="false";
int l2_select_low_bit, default="RubySystem::getBlockSizeBits()"; int l2_select_low_bit, default="RubySystem::getBlockSizeBits()";

View file

@ -173,7 +173,7 @@ machine(L1Cache, "AMD Hammer-like protocol")
bool isPresent(Address); bool isPresent(Address);
} }
TBETable TBEs, template="<L1Cache_TBE>"; TBETable TBEs, template="<L1Cache_TBE>", constructor="m_number_of_TBEs";
void set_cache_entry(AbstractCacheEntry b); void set_cache_entry(AbstractCacheEntry b);
void unset_cache_entry(); void unset_cache_entry();

View file

@ -184,7 +184,7 @@ machine(Directory, "AMD Hammer-like protocol")
Set fwd_set; Set fwd_set;
TBETable TBEs, template="<Directory_TBE>"; TBETable TBEs, template="<Directory_TBE>", constructor="m_number_of_TBEs";
Entry getDirectoryEntry(Address addr), return_by_pointer="yes" { Entry getDirectoryEntry(Address addr), return_by_pointer="yes" {
Entry dir_entry := static_cast(Entry, "pointer", directory[addr]); Entry dir_entry := static_cast(Entry, "pointer", directory[addr]);

View file

@ -66,25 +66,6 @@ machine(L1Cache, "Network_test L1 Cache")
DataBlock DataBlk, desc="Data in the block"; DataBlock DataBlk, desc="Data in the block";
} }
// TBE fields
structure(TBE, desc="...") {
State TBEState, desc="Transient state";
DataBlock DataBlk, desc="data for the block, required for concurrent writebacks";
}
structure(TBETable, external="yes") {
TBE lookup(Address);
void allocate(Address);
void deallocate(Address);
bool isPresent(Address);
}
// STRUCTURES
TBETable TBEs, template="<L1Cache_TBE>";
// FUNCTIONS // FUNCTIONS
// cpu/testers/networktest/networktest.cc generates packets of the type // cpu/testers/networktest/networktest.cc generates packets of the type
@ -112,11 +93,11 @@ machine(L1Cache, "Network_test L1 Cache")
} }
State getState(TBE tbe, Entry cache_entry, Address addr) { State getState(Entry cache_entry, Address addr) {
return State:I; return State:I;
} }
void setState(TBE tbe, Entry cache_entry, Address addr, State state) { void setState(Entry cache_entry, Address addr, State state) {
} }
@ -146,9 +127,7 @@ machine(L1Cache, "Network_test L1 Cache")
if (mandatoryQueue_in.isReady()) { if (mandatoryQueue_in.isReady()) {
peek(mandatoryQueue_in, RubyRequest) { peek(mandatoryQueue_in, RubyRequest) {
trigger(mandatory_request_type_to_event(in_msg.Type), trigger(mandatory_request_type_to_event(in_msg.Type),
in_msg.LineAddress, in_msg.LineAddress, getCacheEntry(in_msg.LineAddress));
getCacheEntry(in_msg.LineAddress),
TBEs[in_msg.LineAddress]);
} }
} }
} }

View file

@ -31,6 +31,7 @@
external_type(int, primitive="yes", default="0"); external_type(int, primitive="yes", default="0");
external_type(bool, primitive="yes", default="false"); external_type(bool, primitive="yes", default="false");
external_type(std::string, primitive="yes"); external_type(std::string, primitive="yes");
external_type(uint32_t, primitive="yes");
external_type(uint64, primitive="yes"); external_type(uint64, primitive="yes");
external_type(Time, primitive="yes", default="0"); external_type(Time, primitive="yes", default="0");
external_type(PacketPtr, primitive="yes"); external_type(PacketPtr, primitive="yes");

View file

@ -32,5 +32,11 @@
AbstractController::AbstractController(const Params *p) AbstractController::AbstractController(const Params *p)
: SimObject(p), Consumer(this) : SimObject(p), Consumer(this)
{ {
p->ruby_system->registerAbstractController(this); m_version = p->version;
m_transitions_per_cycle = p->transitions_per_cycle;
m_buffer_size = p->buffer_size;
m_recycle_latency = p->recycle_latency;
m_number_of_TBEs = p->number_of_TBEs;
m_is_blocking = false;
p->ruby_system->registerAbstractController(this);
} }

View file

@ -32,13 +32,14 @@
#include <iostream> #include <iostream>
#include <string> #include <string>
#include "mem/packet.hh"
#include "mem/protocol/AccessPermission.hh" #include "mem/protocol/AccessPermission.hh"
#include "mem/ruby/common/Address.hh" #include "mem/ruby/common/Address.hh"
#include "mem/ruby/common/Consumer.hh" #include "mem/ruby/common/Consumer.hh"
#include "mem/ruby/common/DataBlock.hh" #include "mem/ruby/common/DataBlock.hh"
#include "mem/ruby/network/Network.hh" #include "mem/ruby/network/Network.hh"
#include "mem/ruby/recorder/CacheRecorder.hh" #include "mem/ruby/recorder/CacheRecorder.hh"
#include "mem/ruby/system/MachineID.hh"
#include "mem/packet.hh"
#include "params/RubyController.hh" #include "params/RubyController.hh"
#include "sim/sim_object.hh" #include "sim/sim_object.hh"
@ -82,6 +83,24 @@ class AbstractController : public SimObject, public Consumer
//! Function for enqueuing a prefetch request //! Function for enqueuing a prefetch request
virtual void enqueuePrefetch(const Address&, const RubyRequestType&) virtual void enqueuePrefetch(const Address&, const RubyRequestType&)
{ fatal("Prefetches not implemented!");} { fatal("Prefetches not implemented!");}
protected:
int m_transitions_per_cycle;
int m_buffer_size;
int m_recycle_latency;
std::string m_name;
std::map<std::string, std::string> m_cfg;
NodeID m_version;
Network* m_net_ptr;
MachineID m_machineID;
bool m_is_blocking;
std::map<Address, MessageBuffer*> m_block_map;
typedef std::vector<MessageBuffer*> MsgVecType;
typedef std::map< Address, MsgVecType* > WaitingBufType;
WaitingBufType m_waiting_buffers;
int m_max_in_port_rank;
int m_cur_in_port_rank;
int m_number_of_TBEs;
}; };
#endif // __MEM_RUBY_SLICC_INTERFACE_ABSTRACTCONTROLLER_HH__ #endif // __MEM_RUBY_SLICC_INTERFACE_ABSTRACTCONTROLLER_HH__

View file

@ -33,6 +33,7 @@ import slicc.generate.html as html
import re import re
python_class_map = {"int": "Int", python_class_map = {"int": "Int",
"uint32_t" : "UInt32",
"std::string": "String", "std::string": "String",
"bool": "Bool", "bool": "Bool",
"CacheMemory": "RubyCache", "CacheMemory": "RubyCache",
@ -261,7 +262,6 @@ class $c_ident : public AbstractController
void wakeUpAllBuffers(); void wakeUpAllBuffers();
void initNetworkPtr(Network* net_ptr) { m_net_ptr = net_ptr; } void initNetworkPtr(Network* net_ptr) { m_net_ptr = net_ptr; }
void print(std::ostream& out) const; void print(std::ostream& out) const;
void printConfig(std::ostream& out) const;
void wakeup(); void wakeup();
void printStats(std::ostream& out) const; void printStats(std::ostream& out) const;
void clearStats(); void clearStats();
@ -285,8 +285,6 @@ private:
code('${{param.type_ast.type}} m_${{param.ident}};') code('${{param.type_ast.type}} m_${{param.ident}};')
code(''' code('''
int m_number_of_TBEs;
TransitionResult doTransition(${ident}_Event event, TransitionResult doTransition(${ident}_Event event,
''') ''')
@ -319,21 +317,6 @@ TransitionResult doTransitionWorker(${ident}_Event event,
code(''' code('''
const Address& addr); const Address& addr);
std::string m_name;
int m_transitions_per_cycle;
int m_buffer_size;
int m_recycle_latency;
std::map<std::string, std::string> m_cfg;
NodeID m_version;
Network* m_net_ptr;
MachineID m_machineID;
bool m_is_blocking;
std::map<Address, MessageBuffer*> m_block_map;
typedef std::vector<MessageBuffer*> MsgVecType;
typedef std::map< Address, MsgVecType* > WaitingBufType;
WaitingBufType m_waiting_buffers;
int m_max_in_port_rank;
int m_cur_in_port_rank;
static ${ident}_ProfileDumper s_profileDumper; static ${ident}_ProfileDumper s_profileDumper;
${ident}_Profiler m_profiler; ${ident}_Profiler m_profiler;
static int m_num_controllers; static int m_num_controllers;
@ -465,12 +448,6 @@ stringstream ${ident}_transitionComment;
$c_ident::$c_ident(const Params *p) $c_ident::$c_ident(const Params *p)
: AbstractController(p) : AbstractController(p)
{ {
m_version = p->version;
m_transitions_per_cycle = p->transitions_per_cycle;
m_buffer_size = p->buffer_size;
m_recycle_latency = p->recycle_latency;
m_number_of_TBEs = p->number_of_TBEs;
m_is_blocking = false;
m_name = "${ident}"; m_name = "${ident}";
''') ''')
# #
@ -574,14 +551,9 @@ $c_ident::init()
elif var.ident.find("mandatoryQueue") < 0: elif var.ident.find("mandatoryQueue") < 0:
th = var.get("template", "") th = var.get("template", "")
expr = "%s = new %s%s" % (vid, vtype.c_ident, th) expr = "%s = new %s%s" % (vid, vtype.c_ident, th)
args = "" args = ""
if "non_obj" not in vtype and not vtype.isEnumeration: if "non_obj" not in vtype and not vtype.isEnumeration:
if expr.find("TBETable") >= 0: args = var.get("constructor", "")
args = "m_number_of_TBEs"
else:
args = var.get("constructor_hack", "")
code('$expr($args);') code('$expr($args);')
code('assert($vid != NULL);') code('assert($vid != NULL);')
@ -825,16 +797,6 @@ $c_ident::print(ostream& out) const
out << "[$c_ident " << m_version << "]"; out << "[$c_ident " << m_version << "]";
} }
void
$c_ident::printConfig(ostream& out) const
{
out << "$c_ident config: " << m_name << endl;
out << " version: " << m_version << endl;
map<string, string>::const_iterator it;
for (it = m_cfg.begin(); it != m_cfg.end(); it++)
out << " " << it->first << ": " << it->second << endl;
}
void void
$c_ident::printStats(ostream& out) const $c_ident::printStats(ostream& out) const
{ {