INPUTS: RESTART USERREADY xLastBar yLastBar traceLast yEQx latentFoundBar dependent indepFoundBar candJump overflow; OUTPUTS: DONE WRITETOMEM setY setTrace enableX enableY enableTrace setHead setCandidate setReorderReg reverseY writeDep storeY muxCont0 muxCont1 setJumpAddress; RESET ON RESTART TO Done (DONE); SearchLatent: CASE(latentFoundBar xLastBar) ? 0 => Done (DONE enableX); 0 1 => StoreHead (setY); ENDCASE => LOOP (enableX); StoreHead: GOTO CheckY (setTrace setHead muxCont1); CheckY: IF NOT yLastBar THEN SearchLatent(enableX) ELSE StoreCandidate (enableTrace muxCont0); StoreCandidate: GOTO CheckDep (setCandidate muxCont0); CheckDep: CASE(traceLast dependent) 1 ? => WaitingForIndep (enableY storeY muxCont1); 0 0 => LOOP (enableTrace muxCont0); ENDCASE => LOOP (writeDep enableTrace muxCont0); WaitingForIndep: GOTO CheckCandidateDep (muxCont1); CheckCandidateDep: IF NOT indepFoundBar THEN CheckCandidateType (muxCont1) ELSE StoreHead (muxCont1); CheckCandidateType: IF candJump THEN OverflowCheck (muxCont1 muxCont0) ELSE ReorderInst (muxCont1 reverseY); OverflowCheck: IF overflow THEN StoreHead (muxCont1) ELSE ReorderInst (muxCont1 setJumpAddress reverseY); ReorderInst: IF yEQx THEN FinishWrite2Mem (enableX WRITETOMEM muxCont1 muxCont0) ELSE SetReorder (setReorderReg muxCont1 muxCont0); SetReorder: GOTO SetInstYReg (WRITETOMEM muxCont1 muxCont0); SetInstYReg: GOTO SetYReg2Y (storeY muxCont1); SetYReg2Y: GOTO ReorderInst (reverseY muxCont1); FinishWrite2Mem: GOTO SearchLatent; Done: IF USERREADY THEN SearchLatent ELSE LOOP (DONE);