Ruby: Add support for functional accesses
[gem5.git] / src / mem / protocol / MI_example-dir.sm
index d4ba3829d1f443b5cf78881dc59ddab935c76c7c..2bd3afa44da0fda55e53f40d83fd23fd68789d19 100644 (file)
@@ -5,12 +5,12 @@ machine(Directory, "Directory protocol")
   int directory_latency = 12
 {
 
-  MessageBuffer forwardFromDir, network="To", virtual_network="3", ordered="false";
-  MessageBuffer responseFromDir, network="To", virtual_network="4", ordered="false";
-  MessageBuffer dmaResponseFromDir, network="To", virtual_network="1", ordered="true";
+  MessageBuffer forwardFromDir, network="To", virtual_network="3", ordered="false", vnet_type="forward";
+  MessageBuffer responseFromDir, network="To", virtual_network="4", ordered="false", vnet_type="response";
+  MessageBuffer dmaResponseFromDir, network="To", virtual_network="1", ordered="true", vnet_type="response";
 
-  MessageBuffer requestToDir, network="From", virtual_network="2", ordered="true";
-  MessageBuffer dmaRequestToDir, network="From", virtual_network="0", ordered="true";
+  MessageBuffer requestToDir, network="From", virtual_network="2", ordered="true", vnet_type="request";
+  MessageBuffer dmaRequestToDir, network="From", virtual_network="0", ordered="true", vnet_type="request";
 
   // STATES
   state_declaration(State, desc="Directory states", default="Directory_State_I") {
@@ -66,7 +66,7 @@ machine(Directory, "Directory protocol")
     MachineID DmaRequestor, desc="DMA requestor";
   }
 
-  external_type(TBETable) {
+  structure(TBETable, external="yes") {
     TBE lookup(Address);
     void allocate(Address);
     void deallocate(Address);
@@ -116,6 +116,29 @@ machine(Directory, "Directory protocol")
     }
   }
 
+  AccessPermission getAccessPermission(Address addr) {
+    TBE tbe := TBEs[addr];
+    if(is_valid(tbe)) {
+      return Directory_State_to_permission(tbe.TBEState);
+    }
+
+    if(directory.isPresent(addr)) {
+      return Directory_State_to_permission(getDirectoryEntry(addr).DirectoryState);
+    }
+
+    return AccessPermission:NotPresent;
+  }
+
+  void setAccessPermission(Address addr, State state) {
+    if (directory.isPresent(addr)) {
+      getDirectoryEntry(addr).changePermission(Directory_State_to_permission(state));
+    }
+  }
+
+  DataBlock getDataBlock(Address addr), return_by_ref="yes" {
+    return getDirectoryEntry(addr).DataBlk;
+  }
+
   // ** OUT_PORTS **
   out_port(forwardNetwork_out, RequestMsg, forwardFromDir);
   out_port(responseNetwork_out, ResponseMsg, responseFromDir);