Sequencer.cc (6145:15cca6ab723a) | Sequencer.cc (6151:bc6b84108443) |
---|---|
1 2/* 3 * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are 8 * met: redistributions of source code must retain the above copyright --- 599 unchanged lines hidden (view full) --- 608 g_system_ptr->getProfiler()->swPrefetchLatency(miss_latency, type, respondingMach); 609 return; // Ignore the software prefetch, don't callback the driver 610 } 611 612 // Profile the miss latency for all non-zero demand misses 613 if (miss_latency != 0) { 614 g_system_ptr->getProfiler()->missLatency(miss_latency, type, respondingMach); 615 | 1 2/* 3 * Copyright (c) 1999-2008 Mark D. Hill and David A. Wood 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions are 8 * met: redistributions of source code must retain the above copyright --- 599 unchanged lines hidden (view full) --- 608 g_system_ptr->getProfiler()->swPrefetchLatency(miss_latency, type, respondingMach); 609 return; // Ignore the software prefetch, don't callback the driver 610 } 611 612 // Profile the miss latency for all non-zero demand misses 613 if (miss_latency != 0) { 614 g_system_ptr->getProfiler()->missLatency(miss_latency, type, respondingMach); 615 |
616 #if 0 617 uinteger_t tick = SIMICS_read_control_register(m_version, SIMICS_get_register_number(m_version, "tick")); 618 uinteger_t tick_cmpr = SIMICS_read_control_register(m_version, SIMICS_get_register_number(m_version, "tick_cmpr")); 619 uinteger_t stick = SIMICS_read_control_register(m_version, SIMICS_get_register_number(m_version, "stick")); 620 uinteger_t stick_cmpr = SIMICS_read_control_register(m_version, SIMICS_get_register_number(m_version, "stick_cmpr")); 621 cout << "END PROC " << m_version << hex << " tick = " << tick << " tick_cmpr = " << tick_cmpr << " stick = " << stick << " stick_cmpr = " << stick_cmpr << " cycle = "<< g_eventQueue_ptr->getTime() << dec << endl; 622 #endif | 616#if 0 617 uinteger_t tick = SIMICS_read_control_register(m_version, SIMICS_get_register_number(m_version, "tick")); 618 uinteger_t tick_cmpr = SIMICS_read_control_register(m_version, SIMICS_get_register_number(m_version, "tick_cmpr")); 619 uinteger_t stick = SIMICS_read_control_register(m_version, SIMICS_get_register_number(m_version, "stick")); 620 uinteger_t stick_cmpr = SIMICS_read_control_register(m_version, SIMICS_get_register_number(m_version, "stick_cmpr")); 621 cout << "END PROC " << m_version << hex << " tick = " << tick << " tick_cmpr = " << tick_cmpr << " stick = " << stick << " stick_cmpr = " << stick_cmpr << " cycle = "<< g_eventQueue_ptr->getTime() << dec << endl; 622#endif |
623 624 } 625 626 bool write = 627 (type == CacheRequestType_ST) || 628 (type == CacheRequestType_ST_XACT) || 629 (type == CacheRequestType_LDX_XACT) || 630 (type == CacheRequestType_ATOMIC); --- 148 unchanged lines hidden (view full) --- 779} 780 781void Sequencer::printDebug(){ 782 //notify driver of debug 783 g_system_ptr->getDriver()->printDebug(); 784} 785 786// Returns true if the sequencer already has a load or store outstanding | 623 624 } 625 626 bool write = 627 (type == CacheRequestType_ST) || 628 (type == CacheRequestType_ST_XACT) || 629 (type == CacheRequestType_LDX_XACT) || 630 (type == CacheRequestType_ATOMIC); --- 148 unchanged lines hidden (view full) --- 779} 780 781void Sequencer::printDebug(){ 782 //notify driver of debug 783 g_system_ptr->getDriver()->printDebug(); 784} 785 786// Returns true if the sequencer already has a load or store outstanding |
787bool Sequencer::isReady(const CacheMsg& request) const { | 787bool 788Sequencer::isReady(const Packet* pkt) const 789{ |
788 | 790 |
791 int cpu_number = pkt->req->contextId(); 792 la_t logical_addr = pkt->req->getVaddr(); 793 pa_t physical_addr = pkt->req->getPaddr(); 794 CacheRequestType type_of_request; 795 if ( pkt->req->isInstFetch() ) { 796 type_of_request = CacheRequestType_IFETCH; 797 } else if ( pkt->req->isLocked() || pkt->req->isSwap() ) { 798 type_of_request = CacheRequestType_ATOMIC; 799 } else if ( pkt->isRead() ) { 800 type_of_request = CacheRequestType_LD; 801 } else if ( pkt->isWrite() ) { 802 type_of_request = CacheRequestType_ST; 803 } else { 804 assert(false); 805 } 806 int thread = pkt->req->threadId(); 807 808 CacheMsg request(Address( physical_addr ), 809 Address( physical_addr ), 810 type_of_request, 811 Address(0), 812 AccessModeType_UserMode, // User/supervisor mode 813 0, // Size in bytes of request 814 PrefetchBit_No, // Not a prefetch 815 0, // Version number 816 Address(logical_addr), // Virtual Address 817 thread, // SMT thread 818 0, // TM specific - timestamp of memory request 819 false // TM specific - whether request is part of escape action 820 ); 821 isReady(request); 822} 823 824bool 825Sequencer::isReady(const CacheMsg& request) const 826{ |
|
789 if (m_outstanding_count >= g_SEQUENCER_OUTSTANDING_REQUESTS) { 790 //cout << "TOO MANY OUTSTANDING: " << m_outstanding_count << " " << g_SEQUENCER_OUTSTANDING_REQUESTS << " VER " << m_version << endl; 791 //printProgress(cout); 792 return false; 793 } | 827 if (m_outstanding_count >= g_SEQUENCER_OUTSTANDING_REQUESTS) { 828 //cout << "TOO MANY OUTSTANDING: " << m_outstanding_count << " " << g_SEQUENCER_OUTSTANDING_REQUESTS << " VER " << m_version << endl; 829 //printProgress(cout); 830 return false; 831 } |
794 int thread = request.getThreadID(); | |
795 796 // This code allows reads to be performed even when we have a write 797 // request outstanding for the line 798 bool write = 799 (request.getType() == CacheRequestType_ST) || 800 (request.getType() == CacheRequestType_ST_XACT) || 801 (request.getType() == CacheRequestType_LDX_XACT) || 802 (request.getType() == CacheRequestType_ATOMIC); --- 12 unchanged lines hidden (view full) --- 815 816 if (TSO) { 817 return m_chip_ptr->m_L1Cache_storeBuffer_vec[m_version]->isReady(); 818 } 819 return true; 820} 821 822// Called by Driver (Simics or Tester). | 832 833 // This code allows reads to be performed even when we have a write 834 // request outstanding for the line 835 bool write = 836 (request.getType() == CacheRequestType_ST) || 837 (request.getType() == CacheRequestType_ST_XACT) || 838 (request.getType() == CacheRequestType_LDX_XACT) || 839 (request.getType() == CacheRequestType_ATOMIC); --- 12 unchanged lines hidden (view full) --- 852 853 if (TSO) { 854 return m_chip_ptr->m_L1Cache_storeBuffer_vec[m_version]->isReady(); 855 } 856 return true; 857} 858 859// Called by Driver (Simics or Tester). |
823void Sequencer::makeRequest(const CacheMsg& request) { 824 //assert(isReady(request)); | 860void 861Sequencer::makeRequest(const Packet* pkt, void* data) 862{ 863 int cpu_number = pkt->req->contextId(); 864 la_t logical_addr = pkt->req->getVaddr(); 865 pa_t physical_addr = pkt->req->getPaddr(); 866 int request_size = pkt->getSize(); 867 CacheRequestType type_of_request; 868 if ( pkt->req->isInstFetch() ) { 869 type_of_request = CacheRequestType_IFETCH; 870 } else if ( pkt->req->isLocked() || pkt->req->isSwap() ) { 871 type_of_request = CacheRequestType_ATOMIC; 872 } else if ( pkt->isRead() ) { 873 type_of_request = CacheRequestType_LD; 874 } else if ( pkt->isWrite() ) { 875 type_of_request = CacheRequestType_ST; 876 } else { 877 assert(false); 878 } 879 la_t virtual_pc = pkt->req->getPC(); 880 int isPriv = false; // TODO: get permission data 881 int thread = pkt->req->threadId(); 882 883 AccessModeType access_mode = AccessModeType_UserMode; // TODO: get actual permission 884 885 CacheMsg request(Address( physical_addr ), 886 Address( physical_addr ), 887 type_of_request, 888 Address(virtual_pc), 889 access_mode, // User/supervisor mode 890 request_size, // Size in bytes of request 891 PrefetchBit_No, // Not a prefetch 892 0, // Version number 893 Address(logical_addr), // Virtual Address 894 thread, // SMT thread 895 0, // TM specific - timestamp of memory request 896 false // TM specific - whether request is part of escape action 897 ); 898 makeRequest(request); 899} 900 901void 902Sequencer::makeRequest(const CacheMsg& request) 903{ |
825 bool write = (request.getType() == CacheRequestType_ST) || 826 (request.getType() == CacheRequestType_ST_XACT) || 827 (request.getType() == CacheRequestType_LDX_XACT) || 828 (request.getType() == CacheRequestType_ATOMIC); 829 830 if (TSO && (request.getPrefetch() == PrefetchBit_No) && write) { 831 assert(m_chip_ptr->m_L1Cache_storeBuffer_vec[m_version]->isReady()); 832 m_chip_ptr->m_L1Cache_storeBuffer_vec[m_version]->insertStore(request); --- 19 unchanged lines hidden (view full) --- 852 data_ptr); 853 854 if (hit && (request.getType() == CacheRequestType_IFETCH || !REMOVE_SINGLE_CYCLE_DCACHE_FAST_PATH) ) { 855 DEBUG_MSG(SEQUENCER_COMP, MedPrio, "Fast path hit"); 856 hitCallback(request, *data_ptr, GenericMachineType_L1Cache, thread); 857 return true; 858 } 859 | 904 bool write = (request.getType() == CacheRequestType_ST) || 905 (request.getType() == CacheRequestType_ST_XACT) || 906 (request.getType() == CacheRequestType_LDX_XACT) || 907 (request.getType() == CacheRequestType_ATOMIC); 908 909 if (TSO && (request.getPrefetch() == PrefetchBit_No) && write) { 910 assert(m_chip_ptr->m_L1Cache_storeBuffer_vec[m_version]->isReady()); 911 m_chip_ptr->m_L1Cache_storeBuffer_vec[m_version]->insertStore(request); --- 19 unchanged lines hidden (view full) --- 931 data_ptr); 932 933 if (hit && (request.getType() == CacheRequestType_IFETCH || !REMOVE_SINGLE_CYCLE_DCACHE_FAST_PATH) ) { 934 DEBUG_MSG(SEQUENCER_COMP, MedPrio, "Fast path hit"); 935 hitCallback(request, *data_ptr, GenericMachineType_L1Cache, thread); 936 return true; 937 } 938 |
860 #if 0 | 939#if 0 |
861 uinteger_t tick = SIMICS_read_control_register(m_version, SIMICS_get_register_number(m_version, "tick")); 862 uinteger_t tick_cmpr = SIMICS_read_control_register(m_version, SIMICS_get_register_number(m_version, "tick_cmpr")); 863 uinteger_t stick = SIMICS_read_control_register(m_version, SIMICS_get_register_number(m_version, "stick")); 864 uinteger_t stick_cmpr = SIMICS_read_control_register(m_version, SIMICS_get_register_number(m_version, "stick_cmpr")); 865 cout << "START PROC " << m_version << hex << " tick = " << tick << " tick_cmpr = " << tick_cmpr << " stick = " << stick << " stick_cmpr = " << stick_cmpr << " cycle = "<< g_eventQueue_ptr->getTime() << dec << endl;; | 940 uinteger_t tick = SIMICS_read_control_register(m_version, SIMICS_get_register_number(m_version, "tick")); 941 uinteger_t tick_cmpr = SIMICS_read_control_register(m_version, SIMICS_get_register_number(m_version, "tick_cmpr")); 942 uinteger_t stick = SIMICS_read_control_register(m_version, SIMICS_get_register_number(m_version, "stick")); 943 uinteger_t stick_cmpr = SIMICS_read_control_register(m_version, SIMICS_get_register_number(m_version, "stick_cmpr")); 944 cout << "START PROC " << m_version << hex << " tick = " << tick << " tick_cmpr = " << tick_cmpr << " stick = " << stick << " stick_cmpr = " << stick_cmpr << " cycle = "<< g_eventQueue_ptr->getTime() << dec << endl;; |
866 #endif | 945#endif |
867 868 if (TSO && (request.getType() == CacheRequestType_LD || request.getType() == CacheRequestType_IFETCH)) { 869 870 // See if we can satisfy the load entirely from the store buffer 871 SubBlock subblock(line_address(request.getAddress()), request.getSize()); 872 if (m_chip_ptr->m_L1Cache_storeBuffer_vec[m_version]->trySubBlock(subblock)) { 873 DataBlock dummy; 874 hitCallback(request, dummy, GenericMachineType_NULL, thread); // Call with an 'empty' datablock, since the data is in the store buffer --- 165 unchanged lines hidden (view full) --- 1040 n->m_L1Cache_L1IcacheMemory_vec[m_version]->getMemoryValue(addr, value, size_in_bytes); 1041 found = true; 1042 } else if (n->m_L1Cache_L1DcacheMemory_vec[m_version]->tryCacheAccess(lineAddr, CacheRequestType_LD, dataPtr)){ 1043 n->m_L1Cache_L1DcacheMemory_vec[m_version]->getMemoryValue(addr, value, size_in_bytes); 1044 found = true; 1045 } else if (Protocol::m_CMP && n->m_L2Cache_L2cacheMemory_vec[l2_ver]->tryCacheAccess(lineAddr, CacheRequestType_LD, dataPtr)){ 1046 n->m_L2Cache_L2cacheMemory_vec[l2_ver]->getMemoryValue(addr, value, size_in_bytes); 1047 found = true; | 946 947 if (TSO && (request.getType() == CacheRequestType_LD || request.getType() == CacheRequestType_IFETCH)) { 948 949 // See if we can satisfy the load entirely from the store buffer 950 SubBlock subblock(line_address(request.getAddress()), request.getSize()); 951 if (m_chip_ptr->m_L1Cache_storeBuffer_vec[m_version]->trySubBlock(subblock)) { 952 DataBlock dummy; 953 hitCallback(request, dummy, GenericMachineType_NULL, thread); // Call with an 'empty' datablock, since the data is in the store buffer --- 165 unchanged lines hidden (view full) --- 1119 n->m_L1Cache_L1IcacheMemory_vec[m_version]->getMemoryValue(addr, value, size_in_bytes); 1120 found = true; 1121 } else if (n->m_L1Cache_L1DcacheMemory_vec[m_version]->tryCacheAccess(lineAddr, CacheRequestType_LD, dataPtr)){ 1122 n->m_L1Cache_L1DcacheMemory_vec[m_version]->getMemoryValue(addr, value, size_in_bytes); 1123 found = true; 1124 } else if (Protocol::m_CMP && n->m_L2Cache_L2cacheMemory_vec[l2_ver]->tryCacheAccess(lineAddr, CacheRequestType_LD, dataPtr)){ 1125 n->m_L2Cache_L2cacheMemory_vec[l2_ver]->getMemoryValue(addr, value, size_in_bytes); 1126 found = true; |
1048 // } else if (n->TBE_TABLE_MEMBER_VARIABLE->isPresent(lineAddr)){ 1049// ASSERT(n->TBE_TABLE_MEMBER_VARIABLE->isPresent(lineAddr)); 1050// L1Cache_TBE tbeEntry = n->TBE_TABLE_MEMBER_VARIABLE->lookup(lineAddr); | 1127 // } else if (n->TBE_TABLE_MEMBER_VARIABLE->isPresent(lineAddr)){ 1128 // ASSERT(n->TBE_TABLE_MEMBER_VARIABLE->isPresent(lineAddr)); 1129 // L1Cache_TBE tbeEntry = n->TBE_TABLE_MEMBER_VARIABLE->lookup(lineAddr); |
1051 | 1130 |
1052// int offset = addr.getOffset(); 1053// for(int i=0; i 1055// } | 1131 // int offset = addr.getOffset(); 1132 // for(int i=0; i<size_in_bytes; ++i){ 1133 // value[i] = tbeEntry.getDataBlk().getByte(offset + i); 1134 // } |
1056 | 1135 |
1057// found = true; | 1136 // found = true; |
1058 } else { 1059 // Address not found 1060 //cout << " " << m_chip_ptr->getID() << " NOT IN CACHE, Value at Directory is: " << (int) value[0] << endl; 1061 n = dynamic_cast<Chip*>(g_system_ptr->getChip(map_Address_to_DirectoryNode(addr)/RubyConfig::numberOfDirectoryPerChip())); 1062 int dir_version = map_Address_to_DirectoryNode(addr)%RubyConfig::numberOfDirectoryPerChip(); 1063 for(unsigned int i=0; i<size_in_bytes; ++i){ 1064 int offset = addr.getOffset(); 1065 value[i] = n->m_Directory_directory_vec[dir_version]->lookup(lineAddr).m_DataBlk.getByte(offset + i); --- 27 unchanged lines hidden (view full) --- 1093 int l2_ver = l2_mach.num%RubyConfig::numberOfL2CachePerChip(); 1094 // LUKE - use variable names instead of macros 1095 //cout << "number of L2caches per chip = " << RubyConfig::numberOfL2CachePerChip(m_version) << endl; 1096 //cout << "L1I cache vec size = " << n->m_L1Cache_L1IcacheMemory_vec.size() << endl; 1097 //cout << "L1D cache vec size = " << n->m_L1Cache_L1DcacheMemory_vec.size() << endl; 1098 //cout << "L1cache_cachememory size = " << n->m_L1Cache_cacheMemory_vec.size() << endl; 1099 //cout << "L1cache_l2cachememory size = " << n->m_L1Cache_L2cacheMemory_vec.size() << endl; 1100 // if (Protocol::m_TwoLevelCache) { | 1137 } else { 1138 // Address not found 1139 //cout << " " << m_chip_ptr->getID() << " NOT IN CACHE, Value at Directory is: " << (int) value[0] << endl; 1140 n = dynamic_cast<Chip*>(g_system_ptr->getChip(map_Address_to_DirectoryNode(addr)/RubyConfig::numberOfDirectoryPerChip())); 1141 int dir_version = map_Address_to_DirectoryNode(addr)%RubyConfig::numberOfDirectoryPerChip(); 1142 for(unsigned int i=0; i<size_in_bytes; ++i){ 1143 int offset = addr.getOffset(); 1144 value[i] = n->m_Directory_directory_vec[dir_version]->lookup(lineAddr).m_DataBlk.getByte(offset + i); --- 27 unchanged lines hidden (view full) --- 1172 int l2_ver = l2_mach.num%RubyConfig::numberOfL2CachePerChip(); 1173 // LUKE - use variable names instead of macros 1174 //cout << "number of L2caches per chip = " << RubyConfig::numberOfL2CachePerChip(m_version) << endl; 1175 //cout << "L1I cache vec size = " << n->m_L1Cache_L1IcacheMemory_vec.size() << endl; 1176 //cout << "L1D cache vec size = " << n->m_L1Cache_L1DcacheMemory_vec.size() << endl; 1177 //cout << "L1cache_cachememory size = " << n->m_L1Cache_cacheMemory_vec.size() << endl; 1178 //cout << "L1cache_l2cachememory size = " << n->m_L1Cache_L2cacheMemory_vec.size() << endl; 1179 // if (Protocol::m_TwoLevelCache) { |
1101// if(Protocol::m_CMP){ 1102// cout << "CMP L2 cache vec size = " << n->m_L2Cache_L2cacheMemory_vec.size() << endl; 1103// } 1104// else{ 1105// cout << "L2 cache vec size = " << n->m_L1Cache_cacheMemory_vec.size() << endl; 1106// } 1107// } | 1180 // if(Protocol::m_CMP){ 1181 // cout << "CMP L2 cache vec size = " << n->m_L2Cache_L2cacheMemory_vec.size() << endl; 1182 // } 1183 // else{ 1184 // cout << "L2 cache vec size = " << n->m_L1Cache_cacheMemory_vec.size() << endl; 1185 // } 1186 // } |
1108 1109 assert(n->m_L1Cache_L1IcacheMemory_vec[m_version] != NULL); 1110 assert(n->m_L1Cache_L1DcacheMemory_vec[m_version] != NULL); 1111 if (Protocol::m_TwoLevelCache) { 1112 if(Protocol::m_CMP){ 1113 assert(n->m_L2Cache_L2cacheMemory_vec[l2_ver] != NULL); 1114 } 1115 else{ --- 5 unchanged lines hidden (view full) --- 1121 n->m_L1Cache_L1IcacheMemory_vec[m_version]->setMemoryValue(addr, value, size_in_bytes); 1122 found = true; 1123 } else if (n->m_L1Cache_L1DcacheMemory_vec[m_version]->tryCacheAccess(lineAddr, CacheRequestType_LD, dataPtr)){ 1124 n->m_L1Cache_L1DcacheMemory_vec[m_version]->setMemoryValue(addr, value, size_in_bytes); 1125 found = true; 1126 } else if (Protocol::m_CMP && n->m_L2Cache_L2cacheMemory_vec[l2_ver]->tryCacheAccess(lineAddr, CacheRequestType_LD, dataPtr)){ 1127 n->m_L2Cache_L2cacheMemory_vec[l2_ver]->setMemoryValue(addr, value, size_in_bytes); 1128 found = true; | 1187 1188 assert(n->m_L1Cache_L1IcacheMemory_vec[m_version] != NULL); 1189 assert(n->m_L1Cache_L1DcacheMemory_vec[m_version] != NULL); 1190 if (Protocol::m_TwoLevelCache) { 1191 if(Protocol::m_CMP){ 1192 assert(n->m_L2Cache_L2cacheMemory_vec[l2_ver] != NULL); 1193 } 1194 else{ --- 5 unchanged lines hidden (view full) --- 1200 n->m_L1Cache_L1IcacheMemory_vec[m_version]->setMemoryValue(addr, value, size_in_bytes); 1201 found = true; 1202 } else if (n->m_L1Cache_L1DcacheMemory_vec[m_version]->tryCacheAccess(lineAddr, CacheRequestType_LD, dataPtr)){ 1203 n->m_L1Cache_L1DcacheMemory_vec[m_version]->setMemoryValue(addr, value, size_in_bytes); 1204 found = true; 1205 } else if (Protocol::m_CMP && n->m_L2Cache_L2cacheMemory_vec[l2_ver]->tryCacheAccess(lineAddr, CacheRequestType_LD, dataPtr)){ 1206 n->m_L2Cache_L2cacheMemory_vec[l2_ver]->setMemoryValue(addr, value, size_in_bytes); 1207 found = true; |
1129 // } else if (n->TBE_TABLE_MEMBER_VARIABLE->isTagPresent(lineAddr)){ 1130// L1Cache_TBE& tbeEntry = n->TBE_TABLE_MEMBER_VARIABLE->lookup(lineAddr); 1131// DataBlock tmpData; 1132// int offset = addr.getOffset(); 1133// for(int i=0; i 1135// } 1136// tbeEntry.setDataBlk(tmpData); 1137// tbeEntry.setDirty(true); | 1208 // } else if (n->TBE_TABLE_MEMBER_VARIABLE->isTagPresent(lineAddr)){ 1209 // L1Cache_TBE& tbeEntry = n->TBE_TABLE_MEMBER_VARIABLE->lookup(lineAddr); 1210 // DataBlock tmpData; 1211 // int offset = addr.getOffset(); 1212 // for(int i=0; i<size_in_bytes; ++i){ 1213 // tmpData.setByte(offset + i, value[i]); 1214 // } 1215 // tbeEntry.setDataBlk(tmpData); 1216 // tbeEntry.setDirty(true); |
1138 } else { 1139 // Address not found 1140 n = dynamic_cast<Chip*>(g_system_ptr->getChip(map_Address_to_DirectoryNode(addr)/RubyConfig::numberOfDirectoryPerChip())); 1141 int dir_version = map_Address_to_DirectoryNode(addr)%RubyConfig::numberOfDirectoryPerChip(); 1142 for(unsigned int i=0; i<size_in_bytes; ++i){ 1143 int offset = addr.getOffset(); 1144 n->m_Directory_directory_vec[dir_version]->lookup(lineAddr).m_DataBlk.setByte(offset + i, value[i]); 1145 } --- 16 unchanged lines hidden --- | 1217 } else { 1218 // Address not found 1219 n = dynamic_cast<Chip*>(g_system_ptr->getChip(map_Address_to_DirectoryNode(addr)/RubyConfig::numberOfDirectoryPerChip())); 1220 int dir_version = map_Address_to_DirectoryNode(addr)%RubyConfig::numberOfDirectoryPerChip(); 1221 for(unsigned int i=0; i<size_in_bytes; ++i){ 1222 int offset = addr.getOffset(); 1223 n->m_Directory_directory_vec[dir_version]->lookup(lineAddr).m_DataBlk.setByte(offset + i, value[i]); 1224 } --- 16 unchanged lines hidden --- |