void MemXBar::doDisp(MemRequest *mreq) /* disp (down) {{{1 */ { uint32_t pos = addrHash(mreq->getAddr(),LineSize, Modfactor,numLowerLevelBanks); router->scheduleDispPos(pos, mreq); // I(0); // FIXME: use dinst->getPE() to decide who to send up if GPU mode }
void MemXBar::doReq(MemRequest *mreq) /* read if splitter above L1 (down) {{{1 */ { if(mreq->getAddr() == 0) { mreq->ack(); return; } uint32_t pos = addrHash(mreq->getAddr(),LineSize,Modfactor,numLowerLevelBanks); XBar_rw_req[pos]->inc(mreq->getStatsFlag()); router->scheduleReqPos(pos, mreq); }
void SstGlobalSym::Put( ExeMaker& eMaker, const uint cSeg ) /***************************************************************/ { if ( _symbolInfo.isEmpty() ) { eMaker.DumpToExe( (unsigned_16) 0 ); eMaker.DumpToExe( (unsigned_16) 0 ); eMaker.DumpToExe( (unsigned_32) 0 ); eMaker.DumpToExe( (unsigned_32) 0 ); eMaker.DumpToExe( (unsigned_32) 0 ); return; } unsigned_32 currentOffset = 0; /* cerr << "entered SstGlobalSym::Put()\n"; cerr << "creating nameHash for "; cerr << _symbolInfo.entries(); cerr << " symbols.\n"; cerr.flush(); */ eMaker.DumpToExe( (unsigned_16) DEFAULT_NAME_HASH ); eMaker.DumpToExe( (unsigned_16) DEFAULT_ADDR_HASH ); streampos pos = eMaker.TellPos(); eMaker.Reserve(3*LONG_WORD); NameHashTable nameHash(_symbolInfo.entries()); /* cerr << "NameHashTable complete\n"; cerr.flush(); */ AddrHashTable addrHash(cSeg); /* cerr << "AddrHashTable complete\n"; cerr.flush(); */ //WCPtrConstSListIter<SymbolStruct> iter(_symbolInfo); SymbolStruct* currentPtr = NULL; long cnt=0, mcnt; mcnt = _symbolInfo.entries(); /* cerr << "_symbolInfo has "; cerr << mcnt; cerr << " entries.\n"; cerr.flush(); */ //while ( ++iter ) { while ( cnt++ < mcnt) { /* cerr << "global Symbol count: "; cerr << cnt; cerr << "\n"; cerr.flush(); */ //currentPtr = iter.current(); currentPtr = _symbolInfo.get(cnt); //cerr << "OK\n"; //cerr.flush(); currentPtr -> SetOffset(currentOffset); if ( currentPtr -> cSum() == NO_CHKSUM ) { if ( addrHash.TryToInsert(currentPtr) ) { currentOffset += SymbolSubsection::PageAlign(eMaker,currentPtr->Length(),currentOffset); currentOffset += currentPtr -> Length(); currentPtr -> Put(eMaker); } } else if ( nameHash.TryToInsert(currentPtr) ) { currentOffset += SymbolSubsection::PageAlign(eMaker,currentPtr->Length(),currentOffset); currentOffset += currentPtr -> Length(); currentPtr -> Put(eMaker); addrHash.TryToInsert(currentPtr); } } currentOffset += SymbolSubsection::DumpPageAlign(eMaker,LONG_WORD,0xff); unsigned_32 preNameHasPos = eMaker.TellPos(); nameHash.Put(eMaker); unsigned_32 suNameHasPos = eMaker.TellPos(); addrHash.Put(eMaker); unsigned_32 currentPos = eMaker.TellPos(); eMaker.SeekTo(pos); eMaker.DumpToExe(currentOffset); eMaker.DumpToExe(suNameHasPos - preNameHasPos); eMaker.DumpToExe(currentPos - suNameHasPos); eMaker.SeekTo(currentPos); }
TimeDelta_t MemXBar::ffwrite(AddrType addr) /* fast forward writes {{{1 */ { uint32_t pos = addrHash(addr,LineSize, Modfactor,numLowerLevelBanks); return router->ffwritePos(pos, addr); }
bool MemXBar::isBusy(AddrType addr) const /* always can accept writes {{{1 */ { uint32_t pos = addrHash(addr,LineSize,Modfactor,numLowerLevelBanks); return router->isBusyPos(pos, addr); }