From a512ba590dfa754abb70e17d9728d5661b9fe01a Mon Sep 17 00:00:00 2001 From: miha-q <> Date: Fri, 8 Mar 2024 23:54:53 -0500 Subject: [PATCH] Fri Mar 8 11:54:53 PM EST 2024 --- examples/bombtester.txt | 2 +- examples/decoherence.txt | 2 +- examples/randombyte.txt | 1 - examples/slow.txt | 10 +-- src/QAnsel.c | 164 +++++++++++++++++++++++---------------- src/core.c | 8 +- 6 files changed, 108 insertions(+), 79 deletions(-) diff --git a/examples/bombtester.txt b/examples/bombtester.txt index d40ffc5..e38178b 100644 --- a/examples/bombtester.txt +++ b/examples/bombtester.txt @@ -56,4 +56,4 @@ measure q[1] -> c[1]; // where the bomb is or else it would have been measured, // yet the observer can know for certainty the bomb is // live without interacting with it (allegedly). -sample; +sample c; diff --git a/examples/decoherence.txt b/examples/decoherence.txt index 2d59d95..c4ac0ed 100644 --- a/examples/decoherence.txt +++ b/examples/decoherence.txt @@ -9,4 +9,4 @@ h q[0]; cx q[0], q[1]; h q[0]; measure q[0] -> c[0]; -sample c; +sample; diff --git a/examples/randombyte.txt b/examples/randombyte.txt index e26b2cb..eb16612 100644 --- a/examples/randombyte.txt +++ b/examples/randombyte.txt @@ -9,4 +9,3 @@ h q[0]; measure q[0] -> c[5]; h q[0]; measure q[0] -> c[6]; h q[0]; measure q[0] -> c[7]; print c; - diff --git a/examples/slow.txt b/examples/slow.txt index ecdb1f1..b01c9ad 100644 --- a/examples/slow.txt +++ b/examples/slow.txt @@ -1,5 +1,5 @@ //designed to be slow -qreg q[11]; +qreg q[14]; x q[0]; x q[1]; x q[2]; @@ -11,8 +11,8 @@ x q[7]; x q[8]; x q[9]; x q[10]; -//x q[11]; -//x q[12]; -//x q[13]; +x q[11]; +x q[12]; +x q[13]; -//born; \ No newline at end of file +born q; \ No newline at end of file diff --git a/src/QAnsel.c b/src/QAnsel.c index 9a9ca9e..cb11e3a 100644 --- a/src/QAnsel.c +++ b/src/QAnsel.c @@ -199,7 +199,7 @@ int qansel_parse_float(char* str, float* returnFloat) 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; @@ -328,34 +328,34 @@ int qansel_process_chunk(int index, char* chunk, int line, regmatch_t* regmatche 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; } } @@ -422,10 +422,10 @@ int qansel_process_chunk(int index, char* chunk, int line, regmatch_t* regmatche } } *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 { @@ -472,9 +472,9 @@ int qansel_process_chunk(int index, char* chunk, int line, regmatch_t* regmatche } } *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 { @@ -492,7 +492,9 @@ int qansel_process_chunk(int index, char* chunk, int line, regmatch_t* regmatche 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; @@ -521,19 +523,19 @@ int qansel_process_chunk(int index, char* chunk, int line, regmatch_t* regmatche 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 @@ -576,13 +578,32 @@ int qansel_process_chunk(int index, char* chunk, int line, regmatch_t* regmatche 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; @@ -593,11 +614,12 @@ int qansel_process_chunk(int index, char* chunk, int line, regmatch_t* regmatche 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 { @@ -625,9 +647,9 @@ int qansel_process_chunk(int index, char* chunk, int line, regmatch_t* regmatche } } *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 { @@ -643,8 +665,8 @@ int qansel_process_chunk(int index, char* chunk, int line, regmatch_t* regmatche 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; } @@ -666,15 +688,16 @@ int qansel_process_chunks(char** chunks, int* associatedLines, int count) "^\\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; @@ -686,10 +709,11 @@ int qansel_process_chunks(char** chunks, int* associatedLines, int count) 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) {} @@ -699,7 +723,6 @@ int qansel_process_chunks(char** chunks, int* associatedLines, int count) fprintf(stderr, "QAnsel: %s.\n", errbuf); exit(1); } - regfree(®ex); } if (!status) break; if (!found) @@ -708,11 +731,21 @@ int qansel_process_chunks(char** chunks, int* associatedLines, int count) 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; @@ -733,17 +766,10 @@ void main(int argc, char** argv) 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 diff --git a/src/core.c b/src/core.c index 46c940f..dc32ab2 100644 --- a/src/core.c +++ b/src/core.c @@ -535,6 +535,10 @@ int qansel_get_instruction_bitmax(unsigned char* ptr, int offset, int* bitmax, i *qbitmax = a0 + 1; *bitmax = (a1 - 0x10) + 1; return 1; + case QANSEL_INSTRUCTION_RAND: + case QANSEL_INSTRUCTION_HVAR: + case QANSEL_INSTRUCTION_EXIT: + return 1; } return 0; } @@ -809,7 +813,6 @@ void qansel_crawl(unsigned char* program, int programSize, int* qubitCount, int* while (PC < programSize) { int next = qansel_get_instruction_size(program[PC]); - printf("|%s|\n", qansel_instruction_to_string(program[PC])); if (program[PC] == QANSEL_INSTRUCTION_SAMPLE) { if ((program[PC + 1] < 0x10 || program[PC + 1] > 0x1D) && program[PC + 1] != 0x1F) @@ -830,7 +833,7 @@ void qansel_crawl(unsigned char* program, int programSize, int* qubitCount, int* int success = qansel_get_instruction_bitmax(program, PC, &bitmax, &qbitmax); if (!success) { - fprintf(stderr, "QAnsel (%04X): Invalid index (%s).\n", PC); + fprintf(stderr, "QAnsel (%04X): Invalid index.\n", PC); exit(1); } if (bitmax > *bitCount) *bitCount = bitmax; @@ -1031,6 +1034,7 @@ void qansel_run(unsigned char* program, int programSize, int qubitCount, int bit outputBitVector[i] = bitVector[i]; } } + cpx_mtx_free(&stateVector); } void qansel_execute(unsigned char* buff, int sizeofbuff) -- 2.39.5