189,190c189,190
< void started_writes();
< void clear_atomic();
---
> void clear_atomic(Address addr);
> void reset_atomics();
204d203
< bool started_receiving_writes;
304d302
< started_receiving_writes = false;
603,689d600
< pos = output.find("TransitionResult result = doTransition((L1Cache_mandatory_request_type_to_event(((*in_msg_ptr)).m_Type)), L1Cache_getState(addr), addr);")
< assert pos >= 0
< atomics_string = '''
< if ((((*in_msg_ptr)).m_Type) == CacheRequestType_ATOMIC) {
< if (servicing_atomic == 0) {
< if (locked_read_request1 == Address(-1)) {
< assert(read_counter == 0);
< locked_read_request1 = addr;
< assert(read_counter == 0);
< read_counter++;
< }
< else if (addr == locked_read_request1) {
< ; // do nothing
< }
< else {
< assert(0); // should never be here if servicing one request at a time
< }
< }
< else if (!started_receiving_writes) {
< if (servicing_atomic == 1) {
< if (locked_read_request2 == Address(-1)) {
< assert(locked_read_request1 != Address(-1));
< assert(read_counter == 1);
< locked_read_request2 = addr;
< assert(read_counter == 1);
< read_counter++;
< }
< else if (addr == locked_read_request2) {
< ; // do nothing
< }
< else {
< assert(0); // should never be here if servicing one request at a time
< }
< }
< else if (servicing_atomic == 2) {
< if (locked_read_request3 == Address(-1)) {
< assert(locked_read_request1 != Address(-1));
< assert(locked_read_request2 != Address(-1));
< assert(read_counter == 1);
< locked_read_request3 = addr;
< assert(read_counter == 2);
< read_counter++;
< }
< else if (addr == locked_read_request3) {
< ; // do nothing
< }
< else {
< assert(0); // should never be here if servicing one request at a time
< }
< }
< else if (servicing_atomic == 3) {
< if (locked_read_request4 == Address(-1)) {
< assert(locked_read_request1 != Address(-1));
< assert(locked_read_request2 != Address(-1));
< assert(locked_read_request3 != Address(-1));
< assert(read_counter == 1);
< locked_read_request4 = addr;
< assert(read_counter == 3);
< read_counter++;
< }
< else if (addr == locked_read_request4) {
< ; // do nothing
< }
< else {
< assert(0); // should never be here if servicing one request at a time
< }
< }
< else {
< assert(0);
< }
< }
< }
< else {
< if (servicing_atomic > 0) {
< // reset
< servicing_atomic = 0;
< read_counter = 0;
< started_receiving_writes = false;
< locked_read_request1 = Address(-1);
< locked_read_request2 = Address(-1);
< locked_read_request3 = Address(-1);
< locked_read_request4 = Address(-1);
< }
< }
< '''
<
< output = output[:pos] + atomics_string + output[pos:]
698c609
< if str(port).find("forwardRequestNetwork_in") >= 0:
---
> if (str(port).find("forwardRequestNetwork_in") >= 0 or str(port).find("requestNetwork_in") >= 0 or str(port).find("requestIntraChipL1Network_in") >= 0):
704,708c615,616
< if ((((servicing_atomic == 1) && (locked_read_request1 == ((*in_msg_ptr)).m_Address)) ||
< ((servicing_atomic == 2) && (locked_read_request1 == ((*in_msg_ptr)).m_Address || locked_read_request2 == ((*in_msg_ptr)).m_Address)) ||
< ((servicing_atomic == 3) && (locked_read_request1 == ((*in_msg_ptr)).m_Address || locked_read_request2 == ((*in_msg_ptr)).m_Address || locked_read_request3 == ((*in_msg_ptr)).m_Address)) ||
< ((servicing_atomic == 4) && (locked_read_request1 == ((*in_msg_ptr)).m_Address || locked_read_request2 == ((*in_msg_ptr)).m_Address || locked_read_request3 == ((*in_msg_ptr)).m_Address || locked_read_request1 == ((*in_msg_ptr)).m_Address)))) {
< postpone = true;
---
> if ((((servicing_atomic > 0) && (locked_read_request1 == ((*in_msg_ptr)).m_Address || locked_read_request2 == ((*in_msg_ptr)).m_Address || locked_read_request3 == ((*in_msg_ptr)).m_Address || locked_read_request1 == ((*in_msg_ptr)).m_Address)))) {
> postpone = true;
719c627
< if str(port).find("forwardRequestNetwork_in") >= 0:
---
> if (str(port).find("forwardRequestNetwork_in") >= 0 or str(port).find("requestNetwork_in") >= 0 or str(port).find("requestIntraChipL1Network_in") >= 0):
737a646,666
> switch (servicing_atomic) {
> case(1):
> assert(locked_read_request1 == Address(-1));
> locked_read_request1 = addr;
> break;
> case(2):
> assert(locked_read_request2 == Address(-1));
> locked_read_request2 = addr;
> break;
> case(3):
> assert(locked_read_request3 == Address(-1));
> locked_read_request3 = addr;
> break;
> case(4):
> assert(locked_read_request4 == Address(-1));
> locked_read_request4 = addr;
> break;
> default:
> assert(0);
>
> }
740c669
< void ${ident}_Controller::started_writes()
---
> void ${ident}_Controller::clear_atomic(Address addr)
742c671,684
< started_receiving_writes = true;
---
>
> assert(servicing_atomic > 0);
> if (addr == locked_read_request1)
> locked_read_request1 = Address(-1);
> else if (addr == locked_read_request2)
> locked_read_request2 = Address(-1);
> else if (addr == locked_read_request3)
> locked_read_request3 = Address(-1);
> else if (addr == locked_read_request4)
> locked_read_request4 = Address(-1);
> else
> assert(0);
> servicing_atomic--;
>
745c687
< void ${ident}_Controller::clear_atomic()
---
> void ${ident}_Controller::reset_atomics()
747,757c689,695
< assert(servicing_atomic > 0);
< read_counter--;
< servicing_atomic--;
< if (read_counter == 0) {
< servicing_atomic = 0;
< started_receiving_writes = false;
< locked_read_request1 = Address(-1);
< locked_read_request2 = Address(-1);
< locked_read_request3 = Address(-1);
< locked_read_request4 = Address(-1);
< }
---
>
> servicing_atomic = 0;
> locked_read_request1 = Address(-1);
> locked_read_request2 = Address(-1);
> locked_read_request3 = Address(-1);
> locked_read_request4 = Address(-1);
>
758a697
>
762c701
< void ${ident}_Controller::started_writes()
---
> void ${ident}_Controller::reset_atomics()
772c711
< void ${ident}_Controller::clear_atomic()
---
> void ${ident}_Controller::clear_atomic(Address addr)