void BackendGen::makeStateConditions( StateAp *state ) { if ( state->stateCondList.length() > 0 ) { long length = state->stateCondList.length(); cgd->initStateCondList( curState, length ); curStateCond = 0; for ( StateCondList::Iter scdi = state->stateCondList; scdi.lte(); scdi++ ) { cgd->addStateCond( curState, scdi->lowKey, scdi->highKey, scdi->condSpace->condSpaceId ); } } }
void RedFsmAp::makeFlat() { for ( RedStateList::Iter st = stateList; st.lte(); st++ ) { if ( st->stateCondList.length() == 0 ) { st->condLowKey = 0; st->condHighKey = 0; } else { st->condLowKey = st->stateCondList.head->lowKey; st->condHighKey = st->stateCondList.tail->highKey; unsigned long long span = keyOps->span( st->condLowKey, st->condHighKey ); st->condList = new CondSpace*[ span ]; memset( st->condList, 0, sizeof(CondSpace*)*span ); for ( StateCondList::Iter sci = st->stateCondList; sci.lte(); sci++ ) { unsigned long long base, trSpan; base = keyOps->span( st->condLowKey, sci->lowKey )-1; trSpan = keyOps->span( sci->lowKey, sci->highKey ); for ( unsigned long long pos = 0; pos < trSpan; pos++ ) st->condList[base+pos] = sci->condSpace; } } if ( st->outRange.length() == 0 ) { st->lowKey = st->highKey = 0; st->transList = 0; } else { st->lowKey = st->outRange[0].lowKey; st->highKey = st->outRange[st->outRange.length()-1].highKey; unsigned long long span = keyOps->span( st->lowKey, st->highKey ); st->transList = new RedTransAp*[ span ]; memset( st->transList, 0, sizeof(RedTransAp*)*span ); for ( RedTransList::Iter trans = st->outRange; trans.lte(); trans++ ) { unsigned long long base, trSpan; base = keyOps->span( st->lowKey, trans->lowKey )-1; trSpan = keyOps->span( trans->lowKey, trans->highKey ); for ( unsigned long long pos = 0; pos < trSpan; pos++ ) st->transList[base+pos] = trans->value; } /* Fill in the gaps with the default transition. */ for ( unsigned long long pos = 0; pos < span; pos++ ) { if ( st->transList[pos] == 0 ) st->transList[pos] = st->defTrans; } } } }
void XMLCodeGen::writeStateConditions( StateAp *state ) { if ( state->stateCondList.length() > 0 ) { out << " <cond_list length=\"" << state->stateCondList.length() << "\">\n"; for ( StateCondList::Iter scdi = state->stateCondList; scdi.lte(); scdi++ ) { out << " <c>"; writeKey( scdi->lowKey ); out << " "; writeKey( scdi->highKey ); out << " "; out << scdi->condSpace->condSpaceId; out << "</c>\n"; } out << " </cond_list>\n"; } }