{
switch (instr)
{
- case QANSEL_INSTRUCTION_X: return "QANSEL_INSTRUCTION_X";
- case QANSEL_INSTRUCTION_Y: return "QANSEL_INSTRUCTION_Y";
- case QANSEL_INSTRUCTION_Z: return "QANSEL_INSTRUCTION_Z";
- case QANSEL_INSTRUCTION_H: return "QANSEL_INSTRUCTION_H";
- case QANSEL_INSTRUCTION_S: return "QANSEL_INSTRUCTION_S";
- case QANSEL_INSTRUCTION_T: return "QANSEL_INSTRUCTION_T";
- case QANSEL_INSTRUCTION_RX: return "QANSEL_INSTRUCTION_RX";
- case QANSEL_INSTRUCTION_RY: return "QANSEL_INSTRUCTION_RY";
- case QANSEL_INSTRUCTION_RZ: return "QANSEL_INSTRUCTION_RZ";
- case QANSEL_INSTRUCTION_U1: return "QANSEL_INSTRUCTION_U1";
- case QANSEL_INSTRUCTION_U2: return "QANSEL_INSTRUCTION_U2";
- case QANSEL_INSTRUCTION_U3: return "QANSEL_INSTRUCTION_U3";
- case QANSEL_INSTRUCTION_CX: return "QANSEL_INSTRUCTION_CX";
- case QANSEL_INSTRUCTION_SWAP: return "QANSEL_INSTRUCTION_SWAP";
- case QANSEL_INSTRUCTION_CCX: return "QANSEL_INSTRUCTION_CCX";
- case QANSEL_INSTRUCTION_CSWAP: return "QANSEL_INSTRUCTION_CSWAP";
- case QANSEL_INSTRUCTION_MEASURE: return "QANSEL_INSTRUCTION_MEASURE";
- case QANSEL_INSTRUCTION_DENSITY: return "QANSEL_INSTRUCTION_DENSITY";
- case QANSEL_INSTRUCTION_BORN: return "QANSEL_INSTRUCTION_BORN";
- case QANSEL_INSTRUCTION_IF_E: return "QANSEL_INSTRUCTION_JUMP_E";
- case QANSEL_INSTRUCTION_IF_NE: return "QANSEL_INSTRUCTION_JUMP_NE";
- case QANSEL_INSTRUCTION_IF_G: return "QANSEL_INSTRUCTION_JUMP_G";
- case QANSEL_INSTRUCTION_IF_GE: return "QANSEL_INSTRUCTION_JUMP_GE";
- case QANSEL_INSTRUCTION_IF_L: return "QANSEL_INSTRUCTION_JUMP_L";
- case QANSEL_INSTRUCTION_IF_LE: return "QANSEL_INSTRUCTION_JUMP_LE";
- case QANSEL_INSTRUCTION_PRINT: return "QANSEL_INSTRUCTION_PRINT";
- case QANSEL_INSTRUCTION_RESET: return "QANSEL_INSTRUCTION_RESET";
- case QANSEL_INSTRUCTION_BARRIER: return "QANSEL_INSTRUCTION_BARRIER";
- case QANSEL_INSTRUCTION_EXIT: return "QANSEL_INSTRUCTION_EXIT";
+ case QANSEL_INSTRUCTION_X: return "x";
+ case QANSEL_INSTRUCTION_Y: return "y";
+ case QANSEL_INSTRUCTION_Z: return "z";
+ case QANSEL_INSTRUCTION_H: return "h";
+ case QANSEL_INSTRUCTION_S: return "s";
+ case QANSEL_INSTRUCTION_T: return "t";
+ case QANSEL_INSTRUCTION_RX: return "rx";
+ case QANSEL_INSTRUCTION_RY: return "ry";
+ case QANSEL_INSTRUCTION_RZ: return "rz";
+ case QANSEL_INSTRUCTION_U1: return "u1";
+ case QANSEL_INSTRUCTION_U2: return "u2";
+ case QANSEL_INSTRUCTION_U3: return "u3";
+ case QANSEL_INSTRUCTION_CX: return "cx";
+ case QANSEL_INSTRUCTION_SWAP: return "swap";
+ case QANSEL_INSTRUCTION_CCX: return "ccx";
+ case QANSEL_INSTRUCTION_CSWAP: return "cswap";
+ case QANSEL_INSTRUCTION_MEASURE: return "measure";
+ case QANSEL_INSTRUCTION_DENSITY: return "density";
+ case QANSEL_INSTRUCTION_BORN: return "born";
+ case QANSEL_INSTRUCTION_IF_E: return "if==";
+ case QANSEL_INSTRUCTION_IF_NE: return "if!=";
+ case QANSEL_INSTRUCTION_IF_G: return "if>";
+ case QANSEL_INSTRUCTION_IF_GE: return "if>=";
+ case QANSEL_INSTRUCTION_IF_L: return "if<";
+ case QANSEL_INSTRUCTION_IF_LE: return "if<=";
+ case QANSEL_INSTRUCTION_PRINT: return "print";
+ case QANSEL_INSTRUCTION_RESET: return "reset";
+ case QANSEL_INSTRUCTION_BARRIER: return "barrier";
+ case QANSEL_INSTRUCTION_EXIT: return "exit";
}
return "Unknown";
}
case QANSEL_INSTRUCTION_U1:
case QANSEL_INSTRUCTION_U2:
case QANSEL_INSTRUCTION_U3:
- case QANSEL_INSTRUCTION_BARRIER:
case QANSEL_INSTRUCTION_DENSITY:
+ a0 = ptr[offset + 1];
+ if (a0 > QANSEL_QBOUND_UPPER) return 0;
+ *qbitmax = a0 + 1;
+ return 1;
+ case QANSEL_INSTRUCTION_BARRIER:
case QANSEL_INSTRUCTION_BORN:
a0 = ptr[offset + 1];
if (a0 > QANSEL_QBOUND_UPPER && a0 != QANSEL_ALL_QUANTUM) return 0;
case QANSEL_INSTRUCTION_RESET:
case QANSEL_INSTRUCTION_PRINT:
a0 = ptr[offset + 1];
- if (a0 == QANSEL_ALL) return 1;
- if (a0 < QANSEL_CBOUND_LOWER)
+ if (a0 == QANSEL_ALL || a0 == QANSEL_ALL_QUANTUM || a0 == QANSEL_ALL_CLASSIC) return 1;
+ if (a0 <= QANSEL_QBOUND_UPPER)
{
- if (a0 > QANSEL_QBOUND_UPPER && a0 != QANSEL_ALL_QUANTUM) return 0;
- if (a0 != QANSEL_ALL_QUANTUM) *qbitmax = a0 + 1;
+ *qbitmax = a0 + 1;
return 1;
}
- else
+ else if (a0 >= QANSEL_CBOUND_LOWER && a0 <= QANSEL_CBOUND_UPPER)
{
- if ((a0 > QANSEL_CBOUND_UPPER || a0 < QANSEL_CBOUND_LOWER) && a0 != QANSEL_ALL_CLASSIC) return 0;
- if (a0 != QANSEL_ALL_CLASSIC) *bitmax = (a0 - QANSEL_CBOUND_LOWER) + 1;
+ *bitmax = (a0 - QANSEL_CBOUND_LOWER) + 1;
return 1;
}
return 0;
copyloc += next;
}
}
-
+
if (ctx->verbose)
{
if (best > efficiency)
printf("Could not increase efficiency.\n");
}
}
+
+ free(ramInstr);
}
void qansel_run(QAnselContext* ctx, unsigned char* program, int programSize, int qubitCount, int bitCount, unsigned char* outputBitVector)
}
}
+ if (ctx->verbose)
+ {
+ printf("%08X: %s\n", PC, qansel_instruction_to_string(instr));
+ }
switch (instr)
{
case QANSEL_INSTRUCTION_X:
else
{
a0 = QANSEL_ALL_QUANTUM;
- if (instr == QANSEL_INSTRUCTION_DENSITY)
+ switch (instr)
{
- fprintf(stderr, "QAnsel on line %i: Density matrices can only be produced for individual qubits.\n", line, a0);
- return 0;
+ case QANSEL_INSTRUCTION_DENSITY:
+ case QANSEL_INSTRUCTION_RX:
+ case QANSEL_INSTRUCTION_RY:
+ case QANSEL_INSTRUCTION_RZ:
+ case QANSEL_INSTRUCTION_U1:
+ case QANSEL_INSTRUCTION_U2:
+ case QANSEL_INSTRUCTION_U3:
+ case QANSEL_INSTRUCTION_X:
+ case QANSEL_INSTRUCTION_Y:
+ case QANSEL_INSTRUCTION_Z:
+ case QANSEL_INSTRUCTION_H:
+ case QANSEL_INSTRUCTION_S:
+ case QANSEL_INSTRUCTION_T:
+ fprintf(stderr, "QAnsel on line %i: Invalid syntax.\n", line, a0);
+ return 0;
}
}
}
int qanselBuildFromSource(char* source, unsigned char** binary, int* binarySize, QAnselContext* ctx)
{
+ size_t source_len = strlen(source);
+ if (source_len > (INT_MAX/2))
+ {
+ fprintf(stderr, "QAnsel: Source file truncated.\n");
+ source[INT_MAX/2] = 0;
+ }
if (!qanselContextValidate(ctx)) return 0;
char** chunks;
int* chunksAssociatedLines;