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") {
MachineID DmaRequestor, desc="DMA requestor";
}
- external_type(TBETable) {
+ structure(TBETable, external="yes") {
TBE lookup(Address);
void allocate(Address);
void deallocate(Address);
}
}
+ 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);