public void simulate() throws IOException{
        
        System.out.format("### %s ###\n",heuristic.type.toString());
        boolean moreLinesToRead = true;
        
        if (debug_f)
            print_debug_header();   
        
        while (true) {
            commit();
            
            issue();
            
            moreLinesToRead = fetch_and_rename();
            
            currCycle = currCycle + 1;
            decrementScoreboard();
            
            if (totalUops >= uopLimit)
            {
                System.out.format("Reached insn limit of %d @ cycle %d. Ending Simulation...\n", uopLimit, currCycle);
                break;
            }
            else if (!moreLinesToRead && ROB.isEmpty())
            {
                System.out.format("Reached to the end of trace totalUops %d @ cycle %d. Ending Simulation...\n", totalUops, currCycle);
                break;
            }
            
        }
        
        endStats();
        
        if (printStats_f)
            printProgramStats();//print the program stats to help debugging
        
        System.out.format("##############################\n");
    }