COSTA: COSt and Termination Analyzer for Java Bytecode
    
    package x10;


class FRASimpleDist {

    //static long POLY = 0x0000000000000007L; // DZ
    //static long PERIOD = 1317624576693539401L; // DZ

    static int HPCC_starts(int n) {
	return n;
        //int i; // DZ
	//int j;
        //long m2[] = {}; // = Rail.make[long](64);
        //while (n < 0) n += PERIOD;
        //while (n > PERIOD) n -= PERIOD;
	//
        //if (n == 0) return 0x1L;
        //long temp = 0x1;
        //for (i=0; i<64; i++) {
        //    m2[i] = temp;
        //    temp = (temp << 1) ^ (temp < 0 ? POLY : 0L);
        //    temp = (temp << 1) ^ (temp < 0 ? POLY : 0L);
        //}
        //for (i=62; i>=0; i--) if (((n >> i) & 1) != 0) break;
        //long ran = 0x2;
        //while (i > 0) {
        //    temp = 0;
        //    for (j=0; j<64; j++) if (((ran >> j) & 1) != 0) temp ^= m2[j];
        //    ran = temp;
        //    i -= 1;
        //    if (((n >> i) & 1) != 0)
        //        ran = (ran << 1) ^ (ran < 0 ? POLY : 0);
        //}
        //return ran;
    }

    static void randomAccessUpdate(int num_updates,
				   int logLocalTableSize,
				   int MAX_PLACES) {
	Conc.finish_begin();
	randomAccessUpdate_1(num_updates,logLocalTableSize,MAX_PLACES);
	Conc.finish_end();
    }
    
    static void randomAccessUpdate_1(int num_updates,
				     int logLocalTableSize,
				     int MAX_PLACES) {
	for (int p=0; p<MAX_PLACES; p++) {
            int valp = p;
	    Conc.async_begin();
	    randomAccessUpdate_2(num_updates,logLocalTableSize,MAX_PLACES,p,valp);
	    Conc.async_end();
	}
    }

    static void randomAccessUpdate_2(int num_updates,
				     int logLocalTableSize,
				     int MAX_PLACES,
				     int p,
				     int valp) {
	//int ran = HPCC_starts(valp*(num_updates/MAX_PLACES)); // DZ
	for (int i=0; i<num_updates/*/MAX_PLACES // DZ*/; i++) {
	    Conc.async_begin();
	    randomAccessUpdate_3();
	    Conc.async_end();
	}
    }

    static void randomAccessUpdate_3() {}   

    public static void main(String args[]) {
	int MAX_PLACES = 16; //must be a power of 2

        int logLocalTableSize = args.length; //> 1 && args[0].equals("-m") ? Integer.parseInt(args[1]) : 12; // DZ
        int localTableSize = logLocalTableSize; //1<<logLocalTableSize; // DZ
        int tableSize = localTableSize*MAX_PLACES;
        int num_updates = 4*tableSize;

        randomAccessUpdate(num_updates,logLocalTableSize,MAX_PLACES);

        // repeat for testing.
        randomAccessUpdate(num_updates,logLocalTableSize,MAX_PLACES);
        for (int i=0; i<MAX_PLACES; i++) {
	    Conc.async_begin();
	    main_1();
	    Conc.async_end();
	}
    }

    static void main_1() {
	//val table = tables(); // DZ
	//int err = 0; // DZ
	//for (int j=0; j<table.a.length; j++) // DZ
	//    if (table.a(j) != j) err++; // DZ
	//} // DZ
    }
    
}