return 1;
}
-int qansel_process_chunk(int index, char* chunk, int line, regmatch_t* regmatches, int* qubitCount, int* bitCount, unsigned char* binary, int* binarySize)
+int qansel_process_chunk(int index, char* chunk, int line, regmatch_t* regmatches, int* qubitCount, int* bitCount, unsigned char** binary, int* binarySize)
{
unsigned short s0;
float d0, d1, d2;
switch (index)
{
case 2:
- *binarySize += 2 + sizeof(float) * 0;
- binary = realloc(binary, (*binarySize));
- binary[(*binarySize) - 2] = instr;
- binary[(*binarySize) - 1] = a0;
+ *binarySize += 2;
+ *binary = realloc(*binary, (*binarySize));
+ (*binary)[(*binarySize) - 2] = instr;
+ (*binary)[(*binarySize) - 1] = a0;
break;
case 3:
*binarySize += 2 + sizeof(float) * 1;
- binary = realloc(binary, (*binarySize));
- binary[(*binarySize) - 2 - sizeof(float) * 1] = instr;
- binary[(*binarySize) - 1 - sizeof(float) * 1] = a0;
- memcpy(binary + ((*binarySize) - sizeof(float)), &d0, sizeof(float));
+ *binary = realloc(*binary, (*binarySize));
+ (*binary)[(*binarySize) - 2 - sizeof(float) * 1] = instr;
+ (*binary)[(*binarySize) - 1 - sizeof(float) * 1] = a0;
+ memcpy((*binary) + ((*binarySize) - sizeof(float)), &d0, sizeof(float));
break;
case 4:
*binarySize += 2 + sizeof(float) * 2;
- binary = realloc(binary, (*binarySize));
- binary[(*binarySize) - 2 - sizeof(float) * 2] = instr;
- binary[(*binarySize) - 1 - sizeof(float) * 2] = a0;
- memcpy(binary + ((*binarySize) - sizeof(float) * 2), &d0, sizeof(float));
- memcpy(binary + ((*binarySize) - sizeof(float) * 1), &d1, sizeof(float));
+ *binary = realloc(*binary, (*binarySize));
+ (*binary)[(*binarySize) - 2 - sizeof(float) * 2] = instr;
+ (*binary)[(*binarySize) - 1 - sizeof(float) * 2] = a0;
+ memcpy((*binary) + ((*binarySize) - sizeof(float) * 2), &d0, sizeof(float));
+ memcpy((*binary) + ((*binarySize) - sizeof(float) * 1), &d1, sizeof(float));
break;
case 5:
*binarySize += 2 + sizeof(float) * 3;
- binary = realloc(binary, (*binarySize));
- binary[(*binarySize) - 2 - sizeof(float) * 3] = instr;
- binary[(*binarySize) - 1 - sizeof(float) * 3] = a0;
- memcpy(binary + ((*binarySize) - sizeof(float) * 3), &d0, sizeof(float));
- memcpy(binary + ((*binarySize) - sizeof(float) * 2), &d1, sizeof(float));
- memcpy(binary + ((*binarySize) - sizeof(float) * 1), &d2, sizeof(float));
+ *binary = realloc(*binary, (*binarySize));
+ (*binary)[(*binarySize) - 2 - sizeof(float) * 3] = instr;
+ (*binary)[(*binarySize) - 1 - sizeof(float) * 3] = a0;
+ memcpy((*binary) + ((*binarySize) - sizeof(float) * 3), &d0, sizeof(float));
+ memcpy((*binary) + ((*binarySize) - sizeof(float) * 2), &d1, sizeof(float));
+ memcpy((*binary) + ((*binarySize) - sizeof(float) * 1), &d2, sizeof(float));
break;
}
}
}
}
*binarySize += 3;
- binary = realloc(binary, (*binarySize));
- binary[(*binarySize) - 3] = QANSEL_INSTRUCTION_MEASURE;
- binary[(*binarySize) - 2] = a0;
- binary[(*binarySize) - 1] = a1;
+ *binary = realloc(*binary, (*binarySize));
+ (*binary)[(*binarySize) - 3] = QANSEL_INSTRUCTION_MEASURE;
+ (*binary)[(*binarySize) - 2] = a0;
+ (*binary)[(*binarySize) - 1] = a1;
}
else if (index == 7) //classical bit instructions
{
}
}
*binarySize += 2;
- binary = realloc(binary, (*binarySize));
- binary[(*binarySize) - 2] = instr;
- binary[(*binarySize) - 1] = a0;
+ *binary = realloc(*binary, (*binarySize));
+ (*binary)[(*binarySize) - 2] = instr;
+ (*binary)[(*binarySize) - 1] = a0;
}
else if (index == 8 || index == 9) //double qubit instructions
{
memcpy(tmp, chunk + strbeg, strlen);
tmp[strlen] = 0;
if (strcmp(tmp, "cx") == 0) instr = QANSEL_INSTRUCTION_CX;
- if (strcmp(tmp, "cnot") == 0) instr = QANSEL_INSTRUCTION_CCX;
+ if (strcmp(tmp, "cnot") == 0) instr = QANSEL_INSTRUCTION_CX;
+ if (strcmp(tmp, "ccnot") == 0) instr = QANSEL_INSTRUCTION_CCX;
+ if (strcmp(tmp, "ccx") == 0) instr = QANSEL_INSTRUCTION_CCX;
else if (strcmp(tmp, "toffoli") == 0) instr = QANSEL_INSTRUCTION_CCX;
else if (strcmp(tmp, "cswap") == 0) instr = QANSEL_INSTRUCTION_CSWAP;
else if (strcmp(tmp, "fredkin") == 0) instr = QANSEL_INSTRUCTION_CSWAP;
if (index == 8)
{
*binarySize += 3;
- binary = realloc(binary, (*binarySize));
- binary[(*binarySize) - 3] = instr;
- binary[(*binarySize) - 2] = a0;
- binary[(*binarySize) - 1] = a1;
+ *binary = realloc(*binary, (*binarySize));
+ (*binary)[(*binarySize) - 3] = instr;
+ (*binary)[(*binarySize) - 2] = a0;
+ (*binary)[(*binarySize) - 1] = a1;
}
else
{
*binarySize += 4;
- binary = realloc(binary, (*binarySize));
- binary[(*binarySize) - 4] = instr;
- binary[(*binarySize) - 3] = a0;
- binary[(*binarySize) - 2] = a1;
- binary[(*binarySize) - 1] = a2;
+ *binary = realloc(*binary, (*binarySize));
+ (*binary)[(*binarySize) - 4] = instr;
+ (*binary)[(*binarySize) - 3] = a0;
+ (*binary)[(*binarySize) - 2] = a1;
+ (*binary)[(*binarySize) - 1] = a2;
}
}
else if (index == 10) //if instructions
char tmp[strlen + 1];
memcpy(tmp, chunk + strbeg, strlen);
tmp[strlen] = 0;
- if (strcmp(tmp, "==") == 0) instr = QANSEL_INSTRUCTION_IF_E;
- else if (strcmp(tmp, "!=") == 0) instr = QANSEL_INSTRUCTION_IF_NE;
- else if (strcmp(tmp, "<>") == 0) instr = QANSEL_INSTRUCTION_IF_NE;
- else if (strcmp(tmp, ">=") == 0) instr = QANSEL_INSTRUCTION_IF_GE;
- else if (strcmp(tmp, "<=") == 0) instr = QANSEL_INSTRUCTION_IF_LE;
- else if (strcmp(tmp, ">") == 0) instr = QANSEL_INSTRUCTION_IF_G;
- else if (strcmp(tmp, "<") == 0) instr = QANSEL_INSTRUCTION_IF_L;
+ if (strlen == 0)
+ {
+ strbeg = regmatches[rmp].rm_so;
+ strlen = regmatches[rmp].rm_eo - regmatches[rmp].rm_so;
+ rmp++;
+ char tmp[strlen + 1];
+ memcpy(tmp, chunk + strbeg, strlen);
+ tmp[strlen] = 0;
+ if (strcmp(tmp, "==") == 0) instr = QANSEL_INSTRUCTION_IF_E;
+ else if (strcmp(tmp, "!=") == 0) instr = QANSEL_INSTRUCTION_IF_NE;
+ else if (strcmp(tmp, "<>") == 0) instr = QANSEL_INSTRUCTION_IF_NE;
+ else if (strcmp(tmp, ">=") == 0) instr = QANSEL_INSTRUCTION_IF_GE;
+ else if (strcmp(tmp, "<=") == 0) instr = QANSEL_INSTRUCTION_IF_LE;
+ else if (strcmp(tmp, ">") == 0) instr = QANSEL_INSTRUCTION_IF_G;
+ else if (strcmp(tmp, "<") == 0) instr = QANSEL_INSTRUCTION_IF_L;
+ }
+ else
+ {
+ if (strcmp(tmp, "==") == 0) instr = QANSEL_INSTRUCTION_IF_E;
+ else if (strcmp(tmp, "!=") == 0) instr = QANSEL_INSTRUCTION_IF_NE;
+ else if (strcmp(tmp, "<>") == 0) instr = QANSEL_INSTRUCTION_IF_NE;
+ else if (strcmp(tmp, ">=") == 0) instr = QANSEL_INSTRUCTION_IF_GE;
+ else if (strcmp(tmp, "<=") == 0) instr = QANSEL_INSTRUCTION_IF_LE;
+ else if (strcmp(tmp, ">") == 0) instr = QANSEL_INSTRUCTION_IF_G;
+ else if (strcmp(tmp, "<") == 0) instr = QANSEL_INSTRUCTION_IF_L;
+ }
}
{
int strbeg = regmatches[rmp].rm_so;
tmp[strlen] = 0;
s0 = (unsigned short)atoi(tmp);
}
+ //printf("%s(%02x,%i)\n", qansel_instruction_to_string(instr), a0, s0);
*binarySize += 2 + sizeof(unsigned short);
- binary = realloc(binary, (*binarySize));
- binary[(*binarySize) - 2 - sizeof(unsigned short)] = instr;
- binary[(*binarySize) - 1 - sizeof(unsigned short)] = a0;
- memcpy(binary + ((*binarySize) - sizeof(unsigned short)), &s0, sizeof(unsigned short));
+ *binary = realloc(*binary, (*binarySize));
+ (*binary)[(*binarySize) - 2 - sizeof(unsigned short)] = instr;
+ (*binary)[(*binarySize) - 1 - sizeof(unsigned short)] = a0;
+ memcpy((*binary) + ((*binarySize) - sizeof(unsigned short)), &s0, sizeof(unsigned short));
}
else if (index == 11) //floating point settings
{
}
}
*binarySize += 1 + sizeof(float);
- binary = realloc(binary, (*binarySize));
- binary[(*binarySize) - 1 - sizeof(float)] = instr;
- memcpy(binary + ((*binarySize) - sizeof(float)), &d0, sizeof(float));
+ *binary = realloc(*binary, (*binarySize));
+ (*binary)[(*binarySize) - 1 - sizeof(float)] = instr;
+ memcpy((*binary) + ((*binarySize) - sizeof(float)), &d0, sizeof(float));
}
else if (index == 12) //lone instructions
{
else if (strcmp(tmp, "exit") == 0) instr = QANSEL_INSTRUCTION_EXIT;
}
*binarySize += 1;
- binary = realloc(binary, (*binarySize));
- binary[(*binarySize) - 1] = instr;
+ *binary = realloc(*binary, (*binarySize));
+ (*binary)[(*binarySize) - 1] = instr;
}
return 1;
}
"^\\s*(rx|ry|rz|u1)\\(\\s*([-/0-9PI.]*)\\s*\\)\\s*q\\s*(\\[\\s*([0-9][0-9]*)\\s*\\]\\s*|)$",
"^\\s*(u2)\\(\\s*([-/0-9PI.]*)\\s*,\\s*([-/0-9PI.]*)\\s*\\)\\s*q\\s*(\\[\\s*([0-9][0-9]*)\\s*\\]\\s*|)$",
"^\\s*(u|u3)\\(\\s*([-/0-9PI.]*)\\s*,\\s*([-/0-9PI.]*)\\s*,\\s*([-/0-9PI.]*)\\s*\\)\\s*q\\s*(\\[\\s*([0-9][0-9]*)\\s*\\]\\s*|)$",
- "^\\s*measure\\s*q\\s*(\\[\\s*([0-9]*)\\s*\\]\\s*|)\\s*->\\s*c\\c*(\\[\\s*([0-9][0-9]*)\\s*\\]\\s*|)$",
+ "^\\s*measure\\s*q\\s*(\\[\\s*([0-9][0-9]*)\\s*\\]\\s*)\\s*->\\s*c\\c*(\\[\\s*([0-9][0-9]*)\\s*\\]\\s*)$",
+ //"^\\s*measure\\s*q\\s*(\\[\\s*([0-9][0-9]*)\\s*\\]\\s*|)\\s*->\\s*c\\c*(\\[\\s*([0-9][0-9]*)\\s*\\]\\s*|)$",
"^\\s*(sample|reset|print)\\s*c\\s*(\\[\\s*([0-9][0-9]*)\\s*\\]\\s*|)$",
"^\\s*(cx|cnot|swap)\\s*q\\s*\\[\\s*([0-9][0-9]*)\\s*\\]\\s*,\\s*q\\s*\\[\\s*([0-9]*)\\s*\\]\\s*$",
- "^\\s*(ccx|toffoli|cswap|fredkin)\\s*q\\s*\\[\\s*([0-9]*)\\s*\\]\\s*,\\s*q\\s*\\[\\s*([0-9]*)\\s*\\]\\s*,\\s*q\\s*\\[\\s*([0-9][0-9]*)\\s*\\]\\s*$",
+ "^\\s*(ccx|toffoli|cswap|fredkin)\\s*q\\s*\\[\\s*([0-9][0-9]*)\\s*\\]\\s*,\\s*q\\s*\\[\\s*([0-9][0-9]*)\\s*\\]\\s*,\\s*q\\s*\\[\\s*([0-9][0-9]*)\\s*\\]\\s*$",
"^\\s*if\\s*\\(\\s*c\\s*(\\[\\s*([0-9][0-9]*)\\s*\\]|)\\s*(==|!=|<>|>=|<=|>|<)\\s*([0-9][0-9]*)\\s*\\).*\\s*$",
"^\\s*(hvar)\\s*([-/0-9PI.]*)\\s*$",
"^\\s*(rand|exit)\\s*$",
};
- int ret, status, found;
+ int ret, status = 0, found;
for (int i = 0; i < count; i++)
{
found = 0;
exit(1);
}
ret = regexec(®ex, chunks[i], 10, regmatches, 0);
+ regfree(®ex);
if (!ret)
{
found = 1;
- status = qansel_process_chunk(j, chunks[i], associatedLines[i], regmatches, &qubitCount, &bitCount, binary, &binarySize);
+ status = qansel_process_chunk(j, chunks[i], associatedLines[i], regmatches, &qubitCount, &bitCount, &binary, &binarySize);
break;
}
else if (ret == REG_NOMATCH) {}
fprintf(stderr, "QAnsel: %s.\n", errbuf);
exit(1);
}
- regfree(®ex);
}
if (!status) break;
if (!found)
return 0;
}
}
- //qansel_execute(binary, binarySize);
+ qansel_execute(binary, binarySize);
+ free(binary);
}
void main(int argc, char** argv)
{
+ MODE = MODE_METAL_THREADED;
+ unsigned char err = cpx_mtx_begin();
+ if (err == 0 && (MODE == MODE_METAL_THREADED || MODE == MODE_METAL))
+ {
+ MODE = MODE == MODE_METAL_THREADED ? MODE_THREADED : MODE_BARE;
+ }
+ RANDOM_FILE = fopen("/dev/TrueRNG0", "r");
+ if (!RANDOM_FILE) RANDOM_FILE = fopen("/dev/random", "r");
+
char* script = malloc(0);
size_t scriptSize = 0;
int c;
free(chunks);
free(chunksAssociatedLines);
free(script);
- return;
- MODE = MODE_BARE;
- unsigned char err = cpx_mtx_begin();
- if (err == 0 && (MODE == MODE_METAL_THREADED || MODE == MODE_METAL))
- {
- MODE = MODE == MODE_METAL_THREADED ? MODE_THREADED : MODE_BARE;
- }
- RANDOM_FILE = fopen("/dev/TrueRNG0", "r");
- if (!RANDOM_FILE) RANDOM_FILE = fopen("/dev/random", "r");
- //qansel_execute
fclose(RANDOM_FILE);
+
if (MODE_METAL || MODE_METAL_THREADED) cpx_mtx_clean();
+ return;
+
}
\ No newline at end of file