GCUpdateRoot.java 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package gc;
  2. import com.oblivm.backend.circuits.arithmetic.IntegerLib;
  3. import com.oblivm.backend.flexsc.CompEnv;
  4. public class GCUpdateRoot<T> extends IntegerLib<T> {
  5. private int d;
  6. private int sw;
  7. private int logSW;
  8. // d: tree depth
  9. // sw: root bucket width
  10. public GCUpdateRoot(CompEnv<T> e, int d, int sw) {
  11. super(e);
  12. this.d = d;
  13. this.sw = sw;
  14. logSW = (int) Math.ceil(Math.log(sw) / Math.log(2));
  15. }
  16. private void zerosFollowedByOnes(T[] input) {
  17. for (int i = input.length - 2; i >= 0; i--) {
  18. input[i] = or(input[i], input[i + 1]);
  19. }
  20. }
  21. public T[][] rootFindDeepestAndEmpty(T[] j1, T[] pathLabel, T[] E_feBits, T[] C_feBits, T[][] E_tupleLabels,
  22. T[][] C_tupleLabels) {
  23. T[] feBits = xor(E_feBits, C_feBits);
  24. T[][] tupleLabels = env.newTArray(sw, 0);
  25. for (int j = 0; j < sw; j++)
  26. tupleLabels[j] = xor(E_tupleLabels[j], C_tupleLabels[j]);
  27. T[] l = padSignal(ones(d - 1), d); // has sign bit
  28. T[] j2 = zeros(logSW); // no sign bit
  29. for (int j = 0; j < sw; j++) {
  30. T[] tupleIndex = toSignals(j, logSW);
  31. T[] lz = xor(pathLabel, tupleLabels[j]);
  32. zerosFollowedByOnes(lz);
  33. lz = padSignal(lz, d); // add sign bit
  34. T firstIf = and(feBits[j], less(lz, l));
  35. l = mux(l, lz, firstIf);
  36. j1 = mux(j1, tupleIndex, firstIf);
  37. j2 = mux(tupleIndex, j2, feBits[j]);
  38. }
  39. T[][] output = env.newTArray(2, 0);
  40. output[0] = j1;
  41. output[1] = j2;
  42. return output;
  43. }
  44. }