 +         TestPort(const std::string& _name, Ramulator& _mem): SlavePort(_name, &_mem), mem(_mem) {}
 +     protected:
 +         Tick recvAtomic(PacketPtr pkt) {
-+             assert(false && "only accepts functional or timing pakects"); }
++             // modified to perform a fixed latency return for atomic packets to enable fast forwarding
++             // assert(false && "only accepts functional or timing packets");
++             return mem.recvAtomic(pkt);
++         }
 +         
 +         void recvFunctional(PacketPtr pkt) {
 +             mem.recvFunctional(pkt);

+ 
+ unsigned int Ramulator::drain(DrainManager* dm) {
+     DPRINTF(Ramulator, "Requested to drain\n");
+     if (resp_queue.size()) {
+         setDrainState(Drainable::Draining);
+         drain_manager = dm;
+         return 1;

+ from m5.params import *
+ from AbstractMemory import *
+ 
+ # A wrapper for Ramulator multi-channel memory controller
+ class Ramulator(AbstractMemory):
+     type = 'Ramulator'
+     cxx_header = "mem/ramulator.hh"
