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;
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)
{
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;
}
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;
//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
#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
#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