|
@@ -7,8 +7,6 @@ import com.oblivm.backend.flexsc.CompEnv;
|
|
|
|
|
|
public class GCLib<T> extends IntegerLib<T> {
|
|
|
|
|
|
- // TODO: take root bucket width into account
|
|
|
-
|
|
|
private int d;
|
|
|
private int w;
|
|
|
private int logD;
|
|
@@ -59,13 +57,7 @@ public class GCLib<T> extends IntegerLib<T> {
|
|
|
return output;
|
|
|
}
|
|
|
|
|
|
- public T[][] findDeepestAndEmpty(int i, T[] pathLabel, T[] E_feBits, T[] C_feBits, T[][] E_tupleLabels,
|
|
|
- T[][] C_tupleLabels) {
|
|
|
- T[] feBits = xor(E_feBits, C_feBits);
|
|
|
- T[][] tupleLabels = env.newTArray(w, 0);
|
|
|
- for (int j = 0; j < w; j++)
|
|
|
- tupleLabels[j] = xor(E_tupleLabels[j], C_tupleLabels[j]);
|
|
|
-
|
|
|
+ public T[][] findDeepestAndEmpty(int i, T[] pathLabel, T[] feBits, T[][] tupleLabels) {
|
|
|
T[] l = padSignal(ones(d - 1 - i), d); // has sign bit
|
|
|
T[] j1 = zeros(logW); // no sign bit
|
|
|
T[] j2 = zeros(logW);
|
|
@@ -97,8 +89,7 @@ public class GCLib<T> extends IntegerLib<T> {
|
|
|
return output;
|
|
|
}
|
|
|
|
|
|
- public T[][][] prepareDeepest(T[] Li, T[][] E_feBits, T[][] C_feBits, T[][][] E_tupleLabels,
|
|
|
- T[][][] C_tupleLabels) {
|
|
|
+ public T[][][] prepareDeepest(T[] Li, T[][] feBits, T[][][] tupleLabels) {
|
|
|
T[] perpD = ones(logD + 1);
|
|
|
T[][][] output = env.newTArray(4, d, 0);
|
|
|
|
|
@@ -112,7 +103,7 @@ public class GCLib<T> extends IntegerLib<T> {
|
|
|
T[] index = toSignals(i, logD + 1);
|
|
|
deepest[i] = mux(deepest[i], src, geq(goal, index));
|
|
|
|
|
|
- T[][] dae = findDeepestAndEmpty(i, Li, E_feBits[i], C_feBits[i], E_tupleLabels[i], C_tupleLabels[i]);
|
|
|
+ T[][] dae = findDeepestAndEmpty(i, Li, feBits[i], tupleLabels[i]);
|
|
|
T[] l = dae[0];
|
|
|
output[1][i] = dae[1];
|
|
|
output[2][i] = dae[2];
|
|
@@ -127,7 +118,7 @@ public class GCLib<T> extends IntegerLib<T> {
|
|
|
return output;
|
|
|
}
|
|
|
|
|
|
- public T[][][] prepareTarget(T[][] deepest, T[][] j1, T[][] j2, T[][] et) {
|
|
|
+ public T[][][] prepareTargetAndIndex(T[][] deepest, T[][] j1, T[][] j2, T[][] et, T[][] delta) {
|
|
|
T[] ft = toSignals(w, logW + 1);
|
|
|
T[] perpD = ones(logD + 1);
|
|
|
T[] perpW = ones(logW + 1);
|
|
@@ -181,6 +172,8 @@ public class GCLib<T> extends IntegerLib<T> {
|
|
|
|
|
|
T nBotEqPerp = eq(nBot, perpD);
|
|
|
nBot = mux(nBot, index, and(fEqPerp, nBotEqPerp));
|
|
|
+
|
|
|
+ f[i] = xor(f[i], padSignal(delta[i], logW + 1));
|
|
|
}
|
|
|
|
|
|
output[0] = target;
|
|
@@ -192,12 +185,6 @@ public class GCLib<T> extends IntegerLib<T> {
|
|
|
return output;
|
|
|
}
|
|
|
|
|
|
- public T[][][] combineDeepestAndTarget(T[] Li, T[][] E_feBits, T[][] C_feBits, T[][][] E_tupleLabels,
|
|
|
- T[][][] C_tupleLabels) {
|
|
|
- T[][][] out = prepareDeepest(Li, E_feBits, C_feBits, E_tupleLabels, C_tupleLabels);
|
|
|
- return prepareTarget(out[0], out[1], out[2], out[3]);
|
|
|
- }
|
|
|
-
|
|
|
public T[][] makeCycle(T[][] target, T[] nTop, T[] nBot, T[] eTop, T[] eBot) {
|
|
|
T[] perpD = ones(logD + 1);
|
|
|
T[] nPrev = perpD;
|
|
@@ -227,9 +214,112 @@ public class GCLib<T> extends IntegerLib<T> {
|
|
|
return target;
|
|
|
}
|
|
|
|
|
|
- public T[][][] combineDeepestTargetCycle(T[] Li, T[][] E_feBits, T[][] C_feBits, T[][][] E_tupleLabels,
|
|
|
+ public T[][][] routing(T[] Li, T[][] E_feBits, T[][] C_feBits, T[][][] E_tupleLabels, T[][][] C_tupleLabels,
|
|
|
+ T[][] delta) {
|
|
|
+ T[][] feBits = env.newTArray(d, 0);
|
|
|
+ T[][][] tupleLabels = env.newTArray(d, w, 0);
|
|
|
+ for (int i = 0; i < d; i++) {
|
|
|
+ feBits[i] = xor(E_feBits[i], C_feBits[i]);
|
|
|
+ for (int j = 0; j < w; j++) {
|
|
|
+ tupleLabels[i][j] = xor(E_tupleLabels[i][j], C_tupleLabels[i][j]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ T[][][] pd = prepareDeepest(Li, feBits, tupleLabels);
|
|
|
+ T[][][] ptai = prepareTargetAndIndex(pd[0], pd[1], pd[2], pd[3], delta);
|
|
|
+ T[][] target = makeCycle(ptai[0], ptai[2][0], ptai[2][1], ptai[2][2], ptai[2][3]);
|
|
|
+
|
|
|
+ T[][][] output = env.newTArray(2, 0, 0);
|
|
|
+ output[0] = target;
|
|
|
+ output[1] = ptai[1];
|
|
|
+ return output;
|
|
|
+ }
|
|
|
+
|
|
|
+ //////////////////////////////////////////////////////////////////
|
|
|
+ //////////////////////////////////////////////////////////////////
|
|
|
+ //////////////////////////////////////////////////////////////////
|
|
|
+ ///////////////////// belows are for testing /////////////////////
|
|
|
+ //////////////////////////////////////////////////////////////////
|
|
|
+ //////////////////////////////////////////////////////////////////
|
|
|
+ //////////////////////////////////////////////////////////////////
|
|
|
+
|
|
|
+ public T[][] findDeepestAndEmpty(int i, T[] pathLabel, T[] E_feBits, T[] C_feBits, T[][] E_tupleLabels,
|
|
|
+ T[][] C_tupleLabels) {
|
|
|
+ T[] feBits = xor(E_feBits, C_feBits);
|
|
|
+ T[][] tupleLabels = env.newTArray(w, 0);
|
|
|
+ for (int j = 0; j < w; j++)
|
|
|
+ tupleLabels[j] = xor(E_tupleLabels[j], C_tupleLabels[j]);
|
|
|
+
|
|
|
+ T[] l = padSignal(ones(d - 1 - i), d); // has sign bit
|
|
|
+ T[] j1 = zeros(logW); // no sign bit
|
|
|
+ T[] j2 = zeros(logW);
|
|
|
+ T[] et = zeros(1);
|
|
|
+
|
|
|
+ for (int j = 0; j < w; j++) {
|
|
|
+ T[] tupleIndex = toSignals(j, logW);
|
|
|
+ T[] lz = xor(pathLabel, tupleLabels[j]);
|
|
|
+ zerosFollowedByOnes(lz);
|
|
|
+ lz = padSignal(lz, d); // add sign bit
|
|
|
+
|
|
|
+ T firstIf = and(feBits[j], less(lz, l));
|
|
|
+ l = mux(l, lz, firstIf);
|
|
|
+ j1 = mux(j1, tupleIndex, firstIf);
|
|
|
+
|
|
|
+ et = mux(ones(1), et, feBits[j]);
|
|
|
+ j2 = mux(tupleIndex, j2, feBits[j]);
|
|
|
+ }
|
|
|
+
|
|
|
+ T[] l_p = numberOfOnes(not(Arrays.copyOfRange(l, 0, d - 1))); // has
|
|
|
+ // sign
|
|
|
+ // bit
|
|
|
+
|
|
|
+ T[][] output = env.newTArray(4, 0);
|
|
|
+ output[0] = l_p;
|
|
|
+ output[1] = padSignal(j1, logW + 1); // add sign bit
|
|
|
+ output[2] = padSignal(j2, logW + 1);
|
|
|
+ output[3] = et;
|
|
|
+ return output;
|
|
|
+ }
|
|
|
+
|
|
|
+ public T[][][] prepareDeepest(T[] Li, T[][] E_feBits, T[][] C_feBits, T[][][] E_tupleLabels,
|
|
|
T[][][] C_tupleLabels) {
|
|
|
- T[][][] out = combineDeepestAndTarget(Li, E_feBits, C_feBits, E_tupleLabels, C_tupleLabels);
|
|
|
+ T[] perpD = ones(logD + 1);
|
|
|
+ T[][][] output = env.newTArray(4, d, 0);
|
|
|
+
|
|
|
+ T[][] deepest = env.newTArray(d, 0);
|
|
|
+ for (int j = 0; j < d; j++)
|
|
|
+ deepest[j] = perpD;
|
|
|
+ T[] src = perpD;
|
|
|
+ T[] goal = perpD; // \perp = -1 in 2's complement form
|
|
|
+
|
|
|
+ for (int i = 0; i < d; i++) {
|
|
|
+ T[] index = toSignals(i, logD + 1);
|
|
|
+ deepest[i] = mux(deepest[i], src, geq(goal, index));
|
|
|
+
|
|
|
+ T[][] dae = findDeepestAndEmpty(i, Li, E_feBits[i], C_feBits[i], E_tupleLabels[i], C_tupleLabels[i]);
|
|
|
+ T[] l = dae[0];
|
|
|
+ output[1][i] = dae[1];
|
|
|
+ output[2][i] = dae[2];
|
|
|
+ output[3][i] = dae[3];
|
|
|
+
|
|
|
+ T lGreaterGoal = greater(l, goal);
|
|
|
+ goal = mux(goal, l, lGreaterGoal);
|
|
|
+ src = mux(src, index, lGreaterGoal);
|
|
|
+ }
|
|
|
+
|
|
|
+ output[0] = deepest;
|
|
|
+ return output;
|
|
|
+ }
|
|
|
+
|
|
|
+ public T[][][] combineDeepestAndTarget(T[] Li, T[][] E_feBits, T[][] C_feBits, T[][][] E_tupleLabels,
|
|
|
+ T[][][] C_tupleLabels, T[][] delta) {
|
|
|
+ T[][][] out = prepareDeepest(Li, E_feBits, C_feBits, E_tupleLabels, C_tupleLabels);
|
|
|
+ return prepareTargetAndIndex(out[0], out[1], out[2], out[3], delta);
|
|
|
+ }
|
|
|
+
|
|
|
+ public T[][][] combineDeepestTargetCycle(T[] Li, T[][] E_feBits, T[][] C_feBits, T[][][] E_tupleLabels,
|
|
|
+ T[][][] C_tupleLabels, T[][] delta) {
|
|
|
+ T[][][] out = combineDeepestAndTarget(Li, E_feBits, C_feBits, E_tupleLabels, C_tupleLabels, delta);
|
|
|
makeCycle(out[0], out[2][0], out[2][1], out[2][2], out[2][3]);
|
|
|
|
|
|
T[][][] output = env.newTArray(2, 0, 0);
|