jProcess.waitFor();
*/
    public static int estimateWork(SIRFilter oldFilter)    {	// if we have an identity filter, just return 0 since these	// aren't mapped onto Raw	if (oldFilter instanceof SIRIdentity || 	    oldFilter instanceof SIRFileWriter ||	    oldFilter instanceof SIRFileReader) {	    return 0;	}	boolean oldDecoupledValue = KjcOptions.decoupled;	boolean oldMagicNetValue = KjcOptions.magic_net;	boolean oldRateMatchValue = KjcOptions.ratematch;	int oldOutputsValue = KjcOptions.outputs;	int work = 0;	//clone the Filter and create a dummy pipeline with just this	//new cloned filter	SIRFilter filter = (SIRFilter)ObjectDeepCloner.deepCopy(oldFilter);	Util.removeIO(filter);	StreamGraph streamGraph = StreamGraph.constructStreamGraph(filter);	StaticStreamGraph ssg = streamGraph.getStaticSubGraphs()[0];	//make a new directory and change the current working dir	String dir = File.separator + "tmp" + File.separator + 	    filter.getName();		File file = new File(dir);	file.mkdir();	// set decouple execution to true	KjcOptions.decoupled = true;	// set magic net to false	KjcOptions.magic_net = false;	//set rate match to false	KjcOptions.ratematch = false;	//turn off output limiting	KjcOptions.outputs = -1;	//VarDecl Raise to move array assignments up	new VarDeclRaiser().raiseVars(filter);		//VarDecl Raise to move peek index up so	//constant prop propagates the peek buffer index	new VarDeclRaiser().raiseVars(filter);	// layout the components (assign filters to tiles)		streamGraph.getLayout().singleFilterAssignment();	//remove print statements in the original app	//if we are running with decoupled	RemovePrintStatements.doIt(ssg.getTopLevel());		//Generate the tile code	RawExecutionCode rawExe = new RawExecutionCode(ssg);	ssg.getTopLevel().accept(rawExe, null, true);	    	if (KjcOptions.removeglobals) {	    RemoveGlobals.doit(ssg.getTopLevel());	}		// make structures header file in this directory	StructureIncludeFile.doit(SpaceDynamicBackend.structures, streamGraph, dir);	SIMULATING_WORK = true;	TileCode.generateCode(streamGraph);	SIMULATING_WORK = false;	MakefileGenerator.createMakefile(streamGraph);	try {	    //copy the files 	    System.out.println("Copy the files ...");	    {		String[] cmdArray = new String[5];		cmdArray[0] = "cp";		cmdArray[1] = "tile0.c";		cmdArray[2] = "Makefile.streamit";		cmdArray[3] = "fileio.bc";		cmdArray[4] = dir;    		Process jProcess = Runtime.getRuntime().exec(cmdArray);		jProcess.waitFor();	    }	    System.out.println("Run the simulator ...");	    //run the simulator	    {		String[] cmdArray = new String[6];		cmdArray[0] = "make";		cmdArray[1] = "-C";		cmdArray[2] = dir;		cmdArray[3] = "-f";		cmdArray[4] = "Makefile.streamit";		cmdArray[5] = "run";		Process jProcess = Runtime.getRuntime().exec(cmdArray);		//dump the output so that the process does not hang on it		InputStream output = jProcess.getInputStream();		try {		    InputStreamReader isr = new InputStreamReader(output);		    BufferedReader br = new BufferedReader(isr);		    String line = null;		    while ((line = br.readLine()) != null) {		    }		}		catch (Exception e) {		    e.printStackTrace();		}		jProcess.waitFor();	    }	    System.out.println("Read the work_est.out ...");	    //open the results file and return the stats	    work = readCycleCount(dir);	    System.out.println("Remove the tmp dir ...");	    //remove the directory 	    { 		String[] cmdArray = new String[3]; 		cmdArray[0] = "rm"; 		cmdArray[1] = "-rf"; 		cmdArray[2] = dir; 		Process jProcess = Runtime.getRuntime().exec(cmdArray); 		jProcess.waitFor(); 	    }	    System.out.println("Done (work = " + work + ").");	}	catch (Exception e) {	    e.printStackTrace();	    Utils.fail("Error running the raw simulator for work estimation");	}		KjcOptions.decoupled = oldDecoupledValue;	KjcOptions.magic_net = oldMagicNetValue;	KjcOptions.ratematch = oldRateMatchValue;	KjcOptions.outputs = oldOutputsValue;	return work;    }