]> foleosoft.com Git - QAnsel.git/commitdiff
Thu Aug 15 06:27:46 PM EDT 2024
authormiha-q <>
Thu, 15 Aug 2024 22:27:46 +0000 (18:27 -0400)
committermiha-q <>
Thu, 15 Aug 2024 22:27:46 +0000 (18:27 -0400)
src/bytecode.c
src/context.c
src/context.h
src/hardware.c
src/hardware.h
src/qansel.h

index 8ed1edb99b9971872a61fdb4b097eb8dab9d68c1..1ae2df9f7232431c6b43cfa59ecbcd7ee0680699 100644 (file)
@@ -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;
index 60ff181f49a2e4d31c7a5ed5a40e10465633ab17..241c84d452b8dbe9b96c6d5cf1a906b27bb98568 100644 (file)
@@ -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;
 }
index 39d1da21252f4a6bb893c160b7c2dd6b2992b1a9..a15b9f29fa82f38b550cc7298f84c29429507e39 100644 (file)
@@ -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;
 
index c15869a57461c593306deb4e24611a416a56902d..ab3c5ab5e258743d2e31ecbe52f171402a71109a 100644 (file)
@@ -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
index 1d7e17bc5ca56314ddf74ae0b6f8de8bfc95fd82..31e0a8a61524bf2e184fac0c0585174691f43b1f 100644 (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
index dc62aeb8662a86c216f1d528ceaa536d7a0ca914..a72eba2578ed11f29cc8d8a5baa835bb30980ab3 100644 (file)
@@ -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