Ruby: Remove libruby
authorNilay Vaish <nilay@cs.wisc.edu>
Fri, 25 Feb 2011 23:54:56 +0000 (17:54 -0600)
committerNilay Vaish <nilay@cs.wisc.edu>
Fri, 25 Feb 2011 23:54:56 +0000 (17:54 -0600)
This patch removes libruby_internal.hh, libruby.hh and libruby.cc. It moves
the contents to libruby.hh to RubyRequest.hh and RubyRequest.cc files.

15 files changed:
src/mem/ruby/SConscript
src/mem/ruby/libruby.cc [deleted file]
src/mem/ruby/libruby.hh [deleted file]
src/mem/ruby/libruby_internal.hh [deleted file]
src/mem/ruby/profiler/Profiler.hh
src/mem/ruby/recorder/CacheRecorder.hh
src/mem/ruby/recorder/TraceRecord.hh
src/mem/ruby/recorder/Tracer.hh
src/mem/ruby/slicc_interface/RubyRequest.cc [new file with mode: 0644]
src/mem/ruby/slicc_interface/RubyRequest.hh [new file with mode: 0644]
src/mem/ruby/slicc_interface/SConscript
src/mem/ruby/storebuffer/storebuffer.cc
src/mem/ruby/storebuffer/storebuffer.hh
src/mem/ruby/system/RubyPort.hh
src/mem/ruby/system/Sequencer.cc

index 339787a222027797c8293a2ae72391401e4100d2..4d8c82cf8afa431984d96fcb4e8e9f815182f523 100644 (file)
@@ -43,8 +43,6 @@ if env['TARGET_ISA'] == 'no':
 if not env['RUBY']:
     Return()
 
-Source('libruby.cc')
-
 def do_embed_text(target, source, env):
     """convert a text file into a file that can be embedded in C
     using an #include statement, that defines a \"const char *\" pointing
@@ -95,6 +93,7 @@ MakeInclude('slicc_interface/AbstractCacheEntry.hh')
 MakeInclude('slicc_interface/AbstractProtocol.hh')
 MakeInclude('slicc_interface/Message.hh')
 MakeInclude('slicc_interface/NetworkMessage.hh')
+MakeInclude('slicc_interface/RubyRequest.hh')
 
 # External types
 MakeInclude('buffers/MessageBuffer.hh')
diff --git a/src/mem/ruby/libruby.cc b/src/mem/ruby/libruby.cc
deleted file mode 100644 (file)
index 11700b7..0000000
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- * Copyright (c) 2009 Mark D. Hill and David A. Wood
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <sys/wait.h>
-#include <algorithm>
-
-#include "config/gems_root.hh"
-#include "mem/ruby/common/Address.hh"
-#include "mem/ruby/eventqueue/RubyEventQueue.hh"
-#include "mem/ruby/libruby_internal.hh"
-#include "mem/ruby/recorder/Tracer.hh"
-#include "mem/ruby/system/MemoryVector.hh"
-#include "mem/ruby/system/RubyPort.hh"
-#include "mem/ruby/system/System.hh"
-
-using namespace std;
-
-string
-RubyRequestType_to_string(const RubyRequestType& obj)
-{
-    switch(obj) {
-      case RubyRequestType_IFETCH:
-        return "IFETCH";
-      case RubyRequestType_LD:
-        return "LD";
-      case RubyRequestType_ST:
-        return "ST";
-      case RubyRequestType_Load_Linked:
-        return "Load_Linked";
-      case RubyRequestType_Store_Conditional:
-        return "Store_Conditional";
-      case RubyRequestType_RMW_Read:
-        return "RMW_Read";
-      case RubyRequestType_RMW_Write:
-        return "RMW_Write";
-      case RubyRequestType_Locked_RMW_Read:
-        return "Locked_RMW_Read";
-      case RubyRequestType_Locked_RMW_Write:
-        return "Locked_RMW_Write";
-      case RubyRequestType_NULL:
-      default:
-        assert(0);
-        return "";
-    }
-}
-
-RubyRequestType
-string_to_RubyRequestType(string str)
-{
-    if (str == "IFETCH")
-        return RubyRequestType_IFETCH;
-    else if (str == "LD")
-        return RubyRequestType_LD;
-    else if (str == "ST")
-        return RubyRequestType_ST;
-    else if (str == "Locked_Read")
-        return RubyRequestType_Load_Linked;
-    else if (str == "Locked_Write")
-        return RubyRequestType_Store_Conditional;
-    else if (str == "RMW_Read")
-        return RubyRequestType_RMW_Read;
-    else if (str == "RMW_Write")
-        return RubyRequestType_RMW_Write;
-    else if (str == "Locked_RMW_Read")
-        return RubyRequestType_Locked_RMW_Read;
-    else if (str == "Locked_RMW_Write")
-        return RubyRequestType_Locked_RMW_Write;
-    else
-        assert(0);
-    return RubyRequestType_NULL;
-}
-
-ostream&
-operator<<(ostream& out, const RubyRequestType& obj)
-{
-    out << RubyRequestType_to_string(obj);
-    out << flush;
-    return out;
-}
-
-ostream&
-operator<<(ostream& out, const RubyRequest& obj)
-{
-    out << hex << "0x" << obj.paddr << " data: 0x" << flush;
-    for (int i = 0; i < obj.len; i++) {
-        out << (int)obj.data[i];
-    }
-    out << dec << " type: " << RubyRequestType_to_string(obj.type) << endl;
-    return out;
-}
-
-vector<string>
-tokenizeString(string str, string delims)
-{
-    vector<string> tokens;
-    char* pch;
-    char* tmp;
-    const char* c_delims = delims.c_str();
-    tmp = new char[str.length()+1];
-    strcpy(tmp, str.c_str());
-    pch = strtok(tmp, c_delims);
-    while (pch != NULL) {
-        string tmp_str(pch);
-        if (tmp_str == "null") tmp_str = "";
-        tokens.push_back(tmp_str);
-
-        pch = strtok(NULL, c_delims);
-    }
-    delete [] tmp;
-    return tokens;
-}
-
-/*
- * The current state of M5/Ruby integration breaks the libruby
- * interface.  This code is ifdef'd out for now so that we can move
- * forward with the integration process for non-libruby uses.  We'll
- * have to go back and resolve the libruby compatibility issue at a
- * later date.
- */
-#if 0
-void
-libruby_init(const char* cfg_filename)
-{
-    ifstream cfg_output(cfg_filename);
-
-    vector<RubyObjConf> * sys_conf = new vector<RubyObjConf>;
-
-    string line;
-    getline(cfg_output, line) ;
-    while ( !cfg_output.eof() ) {
-        vector<string> tokens = tokenizeString(line, " ");
-        assert(tokens.size() >= 2);
-        vector<string> argv;
-        for (size_t i=2; i<tokens.size(); i++) {
-            replace(tokens[i].begin(), tokens[i].end(), '%', ' ');
-            replace(tokens[i].begin(), tokens[i].end(), '#', '\n');
-            argv.push_back(tokens[i]);
-        }
-        sys_conf->push_back(RubyObjConf(tokens[0], tokens[1], argv));
-        tokens.clear();
-        argv.clear();
-        getline(cfg_output, line);
-    }
-
-    RubySystem::create(*sys_conf);
-    delete sys_conf;
-}
-#endif
-
-RubyPortHandle
-libruby_get_port(const char* port_name,
-                 void (*hit_callback)(int64_t access_id))
-{
-    //
-    // Fix me: Hit callback is now a non-static member function pointer of
-    // RubyPort and cannot be set to an arbitrary global function
-    //
-    return NULL;//static_cast<RubyPortHandle>(RubySystem::getPort(port_name, hit_callback));
-}
-
-RubyPortHandle libruby_get_port_by_name(const char* port_name)
-{
-    //
-    // Fix me: Ports should now be initialized using the python configuration
-    // system
-    //
-    return NULL;//static_cast<RubyPortHandle>(RubySystem::getPortOnly(port_name));
-}
-
-void
-libruby_write_ram(uint64_t paddr, uint8_t* data, int len)
-{
-    RubySystem::getMemoryVector()->write(Address(paddr), data, len);
-}
-
-void
-libruby_read_ram(uint64_t paddr, uint8_t* data, int len)
-{
-    RubySystem::getMemoryVector()->read(Address(paddr), data, len);
-}
-
-int64_t
-libruby_issue_request(RubyPortHandle p, struct RubyRequest request)
-{
-    //
-    // Fix me: Ports should now be accessed using the python configuration
-    // system
-    //
-    return 0;//return static_cast<RubyPort*>(p)->makeRequest(request);
-}
-
-int
-libruby_tick(int n)
-{
-    RubyEventQueue *eventq = RubySystem::getEventQueue();
-    eventq->triggerEvents(eventq->getTime() + n);
-    return 0;
-}
-
-void
-libruby_destroy()
-{
-}
-
-const char*
-libruby_last_error()
-{
-    return "";
-}
-
-void
-libruby_print_config(ostream & out)
-{
-    RubySystem::printConfig(out);
-}
-
-void
-libruby_print_stats(ostream & out)
-{
-    RubySystem::printStats(out);
-}
-void
-libruby_playback_trace(char * trace_filename)
-{
-    RubySystem::getTracer()->playbackTrace(trace_filename);
-}
-
-void
-libruby_start_tracing(char * record_filename)
-{
-    // start the trace
-    RubySystem::getTracer()->startTrace(record_filename);
-}
-
-void
-libruby_stop_tracing()
-{
-    // start the trace
-    RubySystem::getTracer()->stopTrace();
-}
-
-uint64_t
-libruby_get_time()
-{
-    return RubySystem::getCycleCount(0);
-}
diff --git a/src/mem/ruby/libruby.hh b/src/mem/ruby/libruby.hh
deleted file mode 100644 (file)
index 6dd3015..0000000
+++ /dev/null
@@ -1,180 +0,0 @@
-/*
- * Copyright (c) 2009 Mark D. Hill and David A. Wood
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __MEM_RUBY_LIBRUBY_HH__
-#define __MEM_RUBY_LIBRUBY_HH__
-
-#include <ostream>
-
-#include "base/types.hh"
-#include "mem/packet.hh"
-
-typedef void* RubyPortHandle;
-enum RubyRequestType {
-  RubyRequestType_NULL,
-  RubyRequestType_IFETCH,
-  RubyRequestType_LD,
-  RubyRequestType_ST,
-  RubyRequestType_Load_Linked,
-  RubyRequestType_Store_Conditional,
-  RubyRequestType_RMW_Read,
-  RubyRequestType_RMW_Write,
-  RubyRequestType_Locked_RMW_Read,
-  RubyRequestType_Locked_RMW_Write,
-  RubyRequestType_NUM
-};
-
-enum RubyAccessMode {
-  RubyAccessMode_User,
-  RubyAccessMode_Supervisor,
-  RubyAccessMode_Device
-};
-
-struct RubyRequest
-{
-    uint64_t paddr;
-    uint8_t* data;
-    int len;
-    uint64_t pc;
-    RubyRequestType type;
-    RubyAccessMode access_mode;
-    PacketPtr pkt;
-    unsigned proc_id;
-
-    RubyRequest() {}
-    RubyRequest(uint64_t _paddr,
-                uint8_t* _data,
-                int _len,
-                uint64_t _pc,
-                RubyRequestType _type,
-                RubyAccessMode _access_mode,
-                PacketPtr _pkt,
-                unsigned _proc_id = 100)
-        : paddr(_paddr),
-          data(_data),
-          len(_len),
-          pc(_pc),
-          type(_type),
-          access_mode(_access_mode),
-          pkt(_pkt),
-          proc_id(_proc_id)
-    {}
-};
-
-std::ostream& operator<<(std::ostream& out, const RubyRequest& obj);
-std::ostream& operator<<(std::ostream& out, const RubyRequestType& obj);
-
-/**
- * Initialize the system.  cfg_file is a Ruby-lang configuration script
- */
-void libruby_init(const char* cfg_file);
-
-/**
- * Tear down a configured system.  Must be invoked after a call to
- * libruby_init.
- */
-void libruby_destroy();
-
-/**
- * Print the last error encountered by ruby.  Currently unimplemented.
- */
-const char* libruby_last_error();
-
-/**
- *  Retrieve a handle to a RubyPort object, identified by name in the
- *  configuration.  You also pass in the callback function you want
- *  this port to use when a request completes.  Only one handle to a
- *  port is allowed at a time.
- */
-RubyPortHandle libruby_get_port(const char* name,
-                                void (*hit_callback)(int64_t access_id));
-
-/**
- *  Retrieve a handle to a RubyPort object, identified by name in the
- *  configuration.
- */
-RubyPortHandle libruby_get_port_by_name(const char* name);
-
-/**
- * issue_request returns a unique access_id to identify the ruby
- * transaction. This access_id is later returned to the caller via
- * hit_callback (passed to libruby_get_port)
- */
-int64_t libruby_issue_request(RubyPortHandle p, struct RubyRequest request);
-
-/**
- * writes data directly into Ruby's data array.  Note that this
- * ignores caches, and should be considered incoherent after
- * simulation starts.
- */
-void libruby_write_ram(uint64_t paddr, uint8_t *data, int len);
-
-/**
- * reads data directory from Ruby's data array.  Note that this
- * ignores caches, and should be considered incoherent after
- * simulation starts
- */
-void libruby_read_ram(uint64_t paddr, uint8_t *data, int len);
-
-/**
- * tick the system n cycles.  Eventually, will return the number of
- * cycles until the next event, but for now it always returns 0
- */
-int libruby_tick(int n);
-
-/**
- *  self explainitory
- */
-void libruby_print_config(std::ostream &out);
-
-/**
- * self explainitory
- */
-void libruby_print_stats(std::ostream &out);
-
-/**
- * does not return until done
- */
-void libruby_playback_trace(char *trace_filename);
-
-/*
- * enables the tracer and opens the trace file
- */
-void libruby_start_tracing(char *record_filename);
-
-/*
- * closes the trace file
- */
-void libruby_stop_tracing();
-
-/**
- * get time
- */
-uint64_t libruby_get_time();
-
-#endif // __MEM_RUBY_LIBRUBY_HH__
diff --git a/src/mem/ruby/libruby_internal.hh b/src/mem/ruby/libruby_internal.hh
deleted file mode 100644 (file)
index c648140..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (c) 2009 Mark D. Hill and David A. Wood
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met: redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer;
- * redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution;
- * neither the name of the copyright holders nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef __MEM_RUBY_LIBRUBY_INTERNAL_HH__
-#define __MEM_RUBY_LIBRUBY_INTERNAL_HH__
-
-#include <ostream>
-#include <string>
-
-#include "mem/ruby/libruby.hh"
-
-std::string RubyRequestType_to_string(const RubyRequestType& obj);
-RubyRequestType string_to_RubyRequestType(std::string);
-std::ostream& operator<<(std::ostream& out, const RubyRequestType& obj);
-
-#endif // __MEM_RUBY_LIBRUBY_INTERNAL_HH__
index 26b5b466d67de5f9bbab7998aa04964800a6734e..c0cee1d7d292b55b7fd075180f7369069b19f7d9 100644 (file)
@@ -62,7 +62,6 @@
 #include "mem/ruby/common/Global.hh"
 #include "mem/ruby/common/Histogram.hh"
 #include "mem/ruby/common/Set.hh"
-#include "mem/ruby/libruby.hh"
 #include "mem/ruby/system/MachineID.hh"
 #include "mem/ruby/system/MemoryControl.hh"
 #include "mem/ruby/system/NodeID.hh"
index 14066c387326ff3c5c92d0dd468371a0ad60f871..08a38695c6cc492cdd9f9a65cbf46c167aed3bcf 100644 (file)
@@ -40,7 +40,6 @@
 
 #include "mem/protocol/CacheRequestType.hh"
 #include "mem/ruby/common/Global.hh"
-#include "mem/ruby/libruby_internal.hh"
 #include "mem/ruby/system/NodeID.hh"
 #include "mem/ruby/recorder/TraceRecord.hh"
 
index ed066debbef849eb12f0c501adcaf2ede95ca022..9ec2bdb9993212fa3678c548639e2958c01f4784 100644 (file)
@@ -38,7 +38,6 @@
 
 #include "mem/ruby/common/Address.hh"
 #include "mem/ruby/common/Global.hh"
-#include "mem/ruby/libruby_internal.hh"
 #include "mem/ruby/system/NodeID.hh"
 #include "mem/ruby/system/Sequencer.hh"
 
index 4b81d6121ea4bf0b0e6d054364d9d34c58f8d0da..2de4ef1640cc0675ac718056f35df844385e5283 100644 (file)
@@ -41,7 +41,6 @@
 
 #include "mem/protocol/CacheRequestType.hh"
 #include "mem/ruby/common/Global.hh"
-#include "mem/ruby/libruby_internal.hh"
 #include "mem/ruby/system/NodeID.hh"
 #include "params/RubyTracer.hh"
 #include "sim/sim_object.hh"
diff --git a/src/mem/ruby/slicc_interface/RubyRequest.cc b/src/mem/ruby/slicc_interface/RubyRequest.cc
new file mode 100644 (file)
index 0000000..9189bfa
--- /dev/null
@@ -0,0 +1,100 @@
+#include <iostream>
+
+#include "mem/ruby/slicc_interface/RubyRequest.hh"
+
+using namespace std;
+
+string
+RubyRequestType_to_string(const RubyRequestType& obj)
+{
+    switch(obj) {
+      case RubyRequestType_IFETCH:
+        return "IFETCH";
+      case RubyRequestType_LD:
+        return "LD";
+      case RubyRequestType_ST:
+        return "ST";
+      case RubyRequestType_Load_Linked:
+        return "Load_Linked";
+      case RubyRequestType_Store_Conditional:
+        return "Store_Conditional";
+      case RubyRequestType_RMW_Read:
+        return "RMW_Read";
+      case RubyRequestType_RMW_Write:
+        return "RMW_Write";
+      case RubyRequestType_Locked_RMW_Read:
+        return "Locked_RMW_Read";
+      case RubyRequestType_Locked_RMW_Write:
+        return "Locked_RMW_Write";
+      case RubyRequestType_NULL:
+      default:
+        assert(0);
+        return "";
+    }
+}
+
+RubyRequestType
+string_to_RubyRequestType(string str)
+{
+    if (str == "IFETCH")
+        return RubyRequestType_IFETCH;
+    else if (str == "LD")
+        return RubyRequestType_LD;
+    else if (str == "ST")
+        return RubyRequestType_ST;
+    else if (str == "Locked_Read")
+        return RubyRequestType_Load_Linked;
+    else if (str == "Locked_Write")
+        return RubyRequestType_Store_Conditional;
+    else if (str == "RMW_Read")
+        return RubyRequestType_RMW_Read;
+    else if (str == "RMW_Write")
+        return RubyRequestType_RMW_Write;
+    else if (str == "Locked_RMW_Read")
+        return RubyRequestType_Locked_RMW_Read;
+    else if (str == "Locked_RMW_Write")
+        return RubyRequestType_Locked_RMW_Write;
+    else
+        assert(0);
+    return RubyRequestType_NULL;
+}
+
+ostream&
+operator<<(ostream& out, const RubyRequestType& obj)
+{
+    out << RubyRequestType_to_string(obj);
+    out << flush;
+    return out;
+}
+
+ostream&
+operator<<(ostream& out, const RubyRequest& obj)
+{
+    out << hex << "0x" << obj.paddr << " data: 0x" << flush;
+    for (int i = 0; i < obj.len; i++) {
+        out << (int)obj.data[i];
+    }
+    out << dec << " type: " << RubyRequestType_to_string(obj.type) << endl;
+    return out;
+}
+
+vector<string>
+tokenizeString(string str, string delims)
+{
+    vector<string> tokens;
+    char* pch;
+    char* tmp;
+    const char* c_delims = delims.c_str();
+    tmp = new char[str.length()+1];
+    strcpy(tmp, str.c_str());
+    pch = strtok(tmp, c_delims);
+    while (pch != NULL) {
+        string tmp_str(pch);
+        if (tmp_str == "null") tmp_str = "";
+        tokens.push_back(tmp_str);
+
+        pch = strtok(NULL, c_delims);
+    }
+    delete [] tmp;
+    return tokens;
+}
diff --git a/src/mem/ruby/slicc_interface/RubyRequest.hh b/src/mem/ruby/slicc_interface/RubyRequest.hh
new file mode 100644 (file)
index 0000000..b97e8cb
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 2009 Mark D. Hill and David A. Wood
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __MEM_RUBY_SLICC_INTERFACE_RUBY_REQUEST_HH__
+#define __MEM_RUBY_SLICC_INTERFACE_RUBY_REQUEST_HH__
+
+#include <ostream>
+
+#include "mem/packet.hh"
+#include "mem/protocol/AccessModeType.hh"
+#include "mem/protocol/CacheRequestType.hh"
+#include "mem/protocol/Message.hh"
+#include "mem/protocol/PrefetchBit.hh"
+#include "mem/ruby/common/Address.hh"
+
+typedef void* RubyPortHandle;
+enum RubyRequestType {
+  RubyRequestType_NULL,
+  RubyRequestType_IFETCH,
+  RubyRequestType_LD,
+  RubyRequestType_ST,
+  RubyRequestType_Load_Linked,
+  RubyRequestType_Store_Conditional,
+  RubyRequestType_RMW_Read,
+  RubyRequestType_RMW_Write,
+  RubyRequestType_Locked_RMW_Read,
+  RubyRequestType_Locked_RMW_Write,
+  RubyRequestType_NUM
+};
+
+enum RubyAccessMode {
+  RubyAccessMode_User,
+  RubyAccessMode_Supervisor,
+  RubyAccessMode_Device
+};
+
+class RubyRequest
+{
+  public:
+    uint64_t paddr;
+    uint8_t* data;
+    int len;
+    uint64_t pc;
+    RubyRequestType type;
+    RubyAccessMode access_mode;
+    PacketPtr pkt;
+    unsigned proc_id;
+
+    RubyRequest() {}
+    RubyRequest(uint64_t _paddr,
+                uint8_t* _data,
+                int _len,
+                uint64_t _pc,
+                RubyRequestType _type,
+                RubyAccessMode _access_mode,
+                PacketPtr _pkt,
+                unsigned _proc_id = 100)
+        : paddr(_paddr),
+          data(_data),
+          len(_len),
+          pc(_pc),
+          type(_type),
+          access_mode(_access_mode),
+          pkt(_pkt),
+          proc_id(_proc_id)
+    {}
+
+    void print(std::ostream& out) const;
+};
+
+std::string RubyRequestType_to_string(const RubyRequestType& obj);
+RubyRequestType string_to_RubyRequestType(std::string);
+std::ostream& operator<<(std::ostream& out, const RubyRequestType& obj);
+std::ostream& operator<<(std::ostream& out, const RubyRequest& obj);
+
+#endif
index 1118595590683479ea2208155924b0b8b70972c3..256f8e64ec87b7970811ce11131d7f9d92f57f64 100644 (file)
@@ -37,5 +37,6 @@ SimObject('Controller.py')
 
 Source('AbstractEntry.cc')
 Source('AbstractCacheEntry.cc')
+Source('RubyRequest.cc')
 Source('RubySlicc_Profiler_interface.cc')
 Source('RubySlicc_ComponentMapping.cc')
index 0486c6510390c723ea8a1fc9a919b38f9e3d0006..0accf138d485da82796f41e7ab28c77b8fb75a2e 100644 (file)
@@ -59,7 +59,6 @@ StoreBuffer::StoreBuffer(uint32 id, uint32 block_bits, int storebuffer_size)
     char name [] = "Sequencer_";
     char port_name [13];
     sprintf(port_name, "%s%d", name, id);
-    m_port = libruby_get_port(port_name, hit);
     m_hit_callback = NULL;
     assert(storebuffer_size >= 0);
     m_storebuffer_size = storebuffer_size;
@@ -67,13 +66,9 @@ StoreBuffer::StoreBuffer(uint32 id, uint32 block_bits, int storebuffer_size)
     m_block_size = 1 << block_bits;
     m_block_mask = ~(m_block_size - 1);
     m_buffer_size = 0;
-    m_use_storebuffer = false;
     m_storebuffer_full = false;
     m_storebuffer_flushing = false;
     m_stalled_issue = true;
-    if (m_storebuffer_size > 0){
-        m_use_storebuffer = true;
-    }
 }
 
 StoreBuffer::~StoreBuffer()
@@ -91,19 +86,6 @@ StoreBuffer::registerHitCallback(void (*hit_callback)(int64_t request_id))
 void
 StoreBuffer::addToStoreBuffer(RubyRequest request)
 {
-    if (!m_use_storebuffer) {
-        // make request to libruby
-        uint64_t id = libruby_issue_request(m_port, request);
-        if (request_map.find(id) != request_map.end()) {
-            panic("Request ID: %d is already in the map\n", id);
-        } else {
-            request_map.insert(make_pair(id, this));
-            outstanding_requests.insert(make_pair(id, request));
-        }
-        return;
-    }
-
-
     buffer.push_front(SBEntry(request, NULL));
 
     m_buffer_size++;
@@ -128,28 +110,12 @@ StoreBuffer::addToStoreBuffer(RubyRequest request)
 int64_t
 StoreBuffer::handleLoad(RubyRequest request)
 {
-    if (!m_use_storebuffer) {
-        // make a request to ruby
-        return libruby_issue_request(m_port, request);
-    }
-
     load_match match = checkForLoadHit(request);
     if (match == FULL_MATCH) {
         // fill data
         returnMatchedData(request);
         iseq++;
         return -2;
-    } else if (match == NO_MATCH) {
-        // make request to libruby and return the id
-        uint64_t id = libruby_issue_request(m_port, request);
-        if (request_map.find(id) != request_map.end()) {
-            panic("Request ID: %d is already in the map\n", id);
-        } else {
-            request_map.insert(make_pair(id, this));
-            outstanding_requests.insert(make_pair(id, request));
-        }
-        iseq++;
-        return id;
     } else { // partial match
         return -3;
     }
@@ -159,12 +125,6 @@ StoreBuffer::handleLoad(RubyRequest request)
 load_match
 StoreBuffer::checkForLoadHit(RubyRequest request)
 {
-    if (!m_use_storebuffer) {
-        // this function should never be called if we are not using a
-        // store buffer
-        panic("checkForLoadHit called while write buffer is not in use\n");
-    }
-
     physical_address_t physical_address = request.paddr;
     int len = request.len;
 
@@ -270,14 +230,6 @@ StoreBuffer::flushStoreBuffer()
 void
 StoreBuffer::issueNextStore()
 {
-    SBEntry request = buffer.back();
-    uint64_t id = libruby_issue_request(m_port, request.m_request);
-    if (request_map.find(id) != request_map.end()) {
-        assert(0);
-    } else {
-        request_map.insert(make_pair(id, this));
-        outstanding_requests.insert(make_pair(id, request.m_request));
-    }
 }
 
 void
index 6d476706b506a57776ee24f643dc099514ce4d1e..b2b8483fdd0080f08b3cb69ca2515f8e5dbcad9c 100644 (file)
@@ -33,7 +33,7 @@
 #include <map>
 
 #include "mem/ruby/common/TypeDefines.hh"
-#include "mem/ruby/libruby.hh"
+#include "mem/ruby/slicc_interface/RubyRequest.hh"
 
 /**
  *  Status for write buffer accesses. The Write buffer can hit in
index 2125d6027221aff77a58756bbeeb58bf114c2310..82ddc682a04b5912eafca4602ac3c90a247a829d 100644 (file)
@@ -35,7 +35,7 @@
 #include "mem/mem_object.hh"
 #include "mem/physical.hh"
 #include "mem/protocol/RequestStatus.hh"
-#include "mem/ruby/libruby.hh"
+#include "mem/ruby/slicc_interface/RubyRequest.hh"
 #include "mem/ruby/system/System.hh"
 #include "mem/tport.hh"
 #include "params/RubyPort.hh"
index 8de46e4af4f17fc11253a01fae874d4c3e87e5e5..800352eed299ffb9e7ffc9d34ff20e451840cfe7 100644 (file)
@@ -35,7 +35,7 @@
 #include "mem/ruby/buffers/MessageBuffer.hh"
 #include "mem/ruby/common/Global.hh"
 #include "mem/ruby/common/SubBlock.hh"
-#include "mem/ruby/libruby.hh"
+#include "mem/ruby/slicc_interface/RubyRequest.hh"
 #include "mem/ruby/profiler/Profiler.hh"
 #include "mem/ruby/recorder/Tracer.hh"
 #include "mem/ruby/slicc_interface/AbstractController.hh"