From: miha-q <> Date: Thu, 15 Aug 2024 22:27:46 +0000 (-0400) Subject: Thu Aug 15 06:27:46 PM EDT 2024 X-Git-Url: http://www.foleosoft.com/?a=commitdiff_plain;h=595d5640ae8a92f03b29a7fc22415e7738047ef9;p=QAnsel.git Thu Aug 15 06:27:46 PM EDT 2024 --- diff --git a/src/bytecode.c b/src/bytecode.c index 8ed1edb..1ae2df9 100644 --- a/src/bytecode.c +++ b/src/bytecode.c @@ -61,15 +61,16 @@ float qansel_rand_t(QAnselContext* ctx) unsigned char r = 0; switch (ctx->hardware_rng) { - case QANSEL_HARDWARE_TRUERNG: - r = fgetc(ctx->random_file); - ctx->buffer_pos += 1; - if (ctx->buffer_pos >= ctx->buffer_size) + case QANSEL_HARDWARE_TRUERNG: r = fgetc(ctx->random_file); break; + case QANSEL_HARDWARE_QUANTIS: + r = ctx->chunk[ctx->pointer]; + ctx->pointer += 1; + if (ctx->pointer >= QANSEL_QUANTIS_CHUNK) { - fclose(ctx->random_file); - ctx->random_file = fopen(ctx->random_path, "r"); + qansel_quantis_chunk(ctx->chunk); + ctx->pointer = 0; } - break; + break; case QANSEL_HARDWARE_RDSEED: r = qansel_hardware_rand(); break; } num = (num << 8) | r; diff --git a/src/context.c b/src/context.c index 60ff181..241c84d 100644 --- a/src/context.c +++ b/src/context.c @@ -90,16 +90,14 @@ int qanselContextBegin(QAnselContext* ctx) if (ctx->verbose) printf("QAnsel: Hardware `TrueRNG` selected.\n"); strcpy(ctx->random_path, "/dev/TrueRNG0"); ctx->hardware_rng = QANSEL_HARDWARE_TRUERNG; - ctx->buffer_size = -1; } } else { if (ctx->verbose) printf("QAnsel: Hardware `Quantis` selected.\n"); - strcpy(ctx->random_path, "/dev/qrandom0"); - ctx->hardware_rng = QANSEL_HARDWARE_TRUERNG; - ctx->buffer_size = 65535; - ctx->buffer_pos = 0; + ctx->hardware_rng = QANSEL_HARDWARE_QUANTIS; + ctx->pointer = 0; + qansel_quantis_chunk(ctx->chunk); } } if (ctx->optimization_level & QANSEL_MODE_METAL) @@ -123,5 +121,6 @@ int qanselContextEnd(QAnselContext* ctx) { if (ctx->random_file != NULL) fclose(ctx->random_file); if (ctx->optimization_level & QANSEL_MODE_METAL) cpx_mtx_clean(); + if (ctx->hardware_rng == QANSEL_HARDWARE_QUANTIS) free(ctx->chunk); return 1; } diff --git a/src/context.h b/src/context.h index 39d1da2..a15b9f2 100644 --- a/src/context.h +++ b/src/context.h @@ -19,9 +19,9 @@ typedef struct int bsampling_shots; int qubit_count; int bit_count; - int buffer_size; - int buffer_pos; - char random_path[256]; + int pointer; + char* chunk; + char random_path[32]; FILE* random_file; } QAnselContext; diff --git a/src/hardware.c b/src/hardware.c index c15869a..ab3c5ab 100644 --- a/src/hardware.c +++ b/src/hardware.c @@ -123,5 +123,18 @@ float qansel_hardware_getseed() //clock_gettime(CLOCK_MONOTONIC, &ts); //float seed = (float)((unsigned long)ts.tv_sec * 1000000000LL + ts.tv_nsec); //return seed; - } + +void qansel_quantis_chunk(unsigned char* chunk) +{ + chunk = malloc(QUANTIS_CHUNK_SIZE); + FILE* f = fopen("/dev/qrandom0", "r"); + unsigned char c = fgetc(f); + while (c == 0x00) c = fgetc(f); + chunk[0] = c; + for (int i = 0; i < QUANTIS_CHUNK_SIZE - 1; i++) + { + chunk[i + 1] = fgetc(f); + } + fclose(f); +} \ No newline at end of file diff --git a/src/hardware.h b/src/hardware.h index 1d7e17b..31e0a8a 100644 --- a/src/hardware.h +++ b/src/hardware.h @@ -13,11 +13,14 @@ #error "Unknown platform" #endif +#define QUANTIS_CHUNK_SIZE 4096 + int qansel___get_core_count(); int qansel_get_core_count(); unsigned long int qansel_get_time(); int qansel_hardware_rand_supported(); unsigned char qansel_hardware_rand(); float qansel_hardware_getseed(); +void qansel_quantis_chunk(unsigned char* chunk); #endif diff --git a/src/qansel.h b/src/qansel.h index dc62aeb..a72eba2 100644 --- a/src/qansel.h +++ b/src/qansel.h @@ -15,6 +15,8 @@ #define QANSEL_HARDWARE_AUTO 1 #define QANSEL_HARDWARE_TRUERNG 2 #define QANSEL_HARDWARE_RDSEED 3 +#define QANSEL_HARDWARE_QUANTIS 4 +#define QANSEL_QUANTIS_CHUNK 4096 #define QANSEL_INSTRUCTION_X 0x10 #define QANSEL_INSTRUCTION_Y 0x11 #define QANSEL_INSTRUCTION_Z 0x12