commit f9d07df75fb361af7e6fb0c3734faac0c877fde1
parent 15f260c0eab9b264cd5567ee09abd70fb0c1663e
Author: Sylvia Ivory <git@sivory.net>
Date: Wed, 4 Feb 2026 19:49:03 -0800
Remove old fake-pi
Diffstat:
18 files changed, 0 insertions(+), 861 deletions(-)
diff --git a/.gitmodules b/.gitmodules
@@ -1,3 +0,0 @@
-[submodule "submodules/cs140e"]
- path = submodules/cs140e
- url = https://github.com/dddrrreee/cs140e-26win.git
diff --git a/.rgignore b/.rgignore
@@ -1 +0,0 @@
-/submodules
diff --git a/fake-pi/device.zig b/fake-pi/device.zig
@@ -1,5 +0,0 @@
-pub const Error = error{
- InvalidAddress,
- IllegalWrite,
- IllegalRead,
-};
diff --git a/fake-pi/devices/gpio.zig b/fake-pi/devices/gpio.zig
@@ -1,92 +0,0 @@
-const std = @import("std");
-
-const device = @import("../device.zig");
-const c = @cImport({
- @cInclude("fake-random.h");
-});
-
-// TODO; these constants should come from src/devices/gpio.zig
-pub const START_OFFSET: usize = 0x0020_0000;
-pub const END_OFFSET: usize = 0x0020_00B0;
-
-const GPFSEL0_OFFSET: usize = START_OFFSET + 0x0000;
-const GPSET0_OFFSET: usize = START_OFFSET + 0x001C;
-const GPCLR0_OFFSET: usize = START_OFFSET + 0x0028;
-const GPLEV0_OFFSET: usize = START_OFFSET + 0x0034;
-var base_address: u32 = 0;
-
-var gpfsel0 = @as(u32, 0);
-var gpfsel1 = @as(u32, 0);
-var gpfsel2 = @as(u32, 0);
-var gpfsel3 = @as(u32, 0);
-var gpfsel4 = ~@as(u32, 0);
-var gpfsel5 = ~@as(u32, 0);
-
-var gpset0: u32 = 0;
-var gpset1: u32 = 0;
-
-var gpclr0: u32 = 0;
-var gpclr1: u32 = 0;
-
-var gplev0: u32 = 0;
-var gplev1: u32 = 0;
-
-pub const Error = error{
- ReadGPFSEL,
- ReadGPCLR,
- WriteGPLEV,
-} || device.Error;
-
-pub fn initialize(base_addr: u32) void {
- base_address = base_addr;
-
- gpfsel0 = c.fake_random();
- gpfsel1 = c.fake_random();
- gpfsel2 = c.fake_random();
- gpfsel3 = c.fake_random();
- gpfsel4 = ~@as(u32, 0); // Extend bits
- gpfsel5 = ~@as(u32, 0);
-
- gpset0 = c.fake_random();
- gpset1 = ~@as(u32, 0);
-
- gpclr0 = c.fake_random();
- gpclr1 = ~@as(u32, 0);
-}
-
-pub fn read_u32(address: *u32) Error!u32 {
- switch (@intFromPtr(address) - base_address) {
- GPFSEL0_OFFSET + @sizeOf(u32) * 0 => return gpfsel0,
- GPFSEL0_OFFSET + @sizeOf(u32) * 1 => return gpfsel1,
- GPFSEL0_OFFSET + @sizeOf(u32) * 2 => return gpfsel2,
- GPFSEL0_OFFSET + @sizeOf(u32) * 3 => return gpfsel3,
- GPFSEL0_OFFSET + @sizeOf(u32) * 4 => return gpfsel4,
- GPFSEL0_OFFSET + @sizeOf(u32) * 5 => return gpfsel5,
-
- GPSET0_OFFSET...(GPSET0_OFFSET + @sizeOf(u32)) => return Error.ReadGPFSEL,
- GPCLR0_OFFSET...(GPCLR0_OFFSET + @sizeOf(u32)) => return Error.ReadGPCLR,
-
- GPLEV0_OFFSET...(GPLEV0_OFFSET + @sizeOf(u32)) => return c.fake_random(),
- else => return Error.IllegalRead,
- }
-}
-
-pub fn put_u32(address: *u32, value: u32) Error!void {
- switch (@intFromPtr(address) - base_address) {
- GPFSEL0_OFFSET + @sizeOf(u32) * 0 => gpfsel0 = value,
- GPFSEL0_OFFSET + @sizeOf(u32) * 1 => gpfsel1 = value,
- GPFSEL0_OFFSET + @sizeOf(u32) * 2 => gpfsel2 = value,
- GPFSEL0_OFFSET + @sizeOf(u32) * 3 => gpfsel3 = value,
- GPFSEL0_OFFSET + @sizeOf(u32) * 4 => gpfsel4 = value,
- GPFSEL0_OFFSET + @sizeOf(u32) * 5 => gpfsel5 = value,
-
- GPSET0_OFFSET => gpset0 = value,
- GPSET0_OFFSET + @sizeOf(u32) => gpset0 = value,
-
- GPCLR0_OFFSET => gpclr0 = value,
- GPCLR0_OFFSET + @sizeOf(u32) => gpclr1 = value,
-
- GPLEV0_OFFSET...(GPLEV0_OFFSET + @sizeOf(u32)) => return Error.WriteGPLEV,
- else => return Error.IllegalWrite,
- }
-}
diff --git a/fake-pi/main.zig b/fake-pi/main.zig
@@ -1,10 +0,0 @@
-const std = @import("std");
-const boot = @import("boot");
-
-const root = @import("root.zig");
-
-pub fn main() void {
- root.initialize();
- boot.kmain();
- root.finalize();
-}
diff --git a/fake-pi/pi.zig b/fake-pi/pi.zig
@@ -1,29 +0,0 @@
-pub const mem = struct {
- pub const BASE_ADDRESS: usize = 0x2000_0000;
-
- const Operation = enum {
- Read,
- Write,
- General,
- };
-
- pub inline fn barrier(op: Operation) void {
- _ = op;
- }
-
- pub extern fn put_u32(address: *u32, value: u32) void;
- pub inline fn put_u32_barrier(address: *u32, value: u32) void {
- return put_u32(address, value);
- }
-
- pub extern fn get_u32(address: *u32) u32;
- pub inline fn get_u32_barrier(address: *u32) u32 {
- return get_u32(address);
- }
-};
-
-// Stubs
-pub fn cycle_counter_init() void {}
-pub fn cycle_counter_get() u32 {
- return 0;
-}
diff --git a/fake-pi/root.zig b/fake-pi/root.zig
@@ -1,94 +0,0 @@
-const std = @import("std");
-
-const gpio = @import("devices/gpio.zig");
-const c = @cImport({
- @cInclude("fake-random.h");
-});
-
-const BASE_ADDRESS: u32 = 0x2000_0000;
-const MAX_TRACE: usize = 128;
-
-var trace_count: usize = 0;
-
-var stdout_buffer: [0]u8 = undefined;
-var stdout = std.fs.File.stdout().writer(&stdout_buffer);
-const writer = &stdout.interface;
-
-fn trace_no_count(comptime format: []const u8, args: anytype) void {
- writer.print("TRACE: " ++ format, args) catch {};
- writer.flush() catch {};
-}
-
-fn trace(comptime format: []const u8, args: anytype) void {
- writer.print("TRACE:{}: ", .{trace_count}) catch {};
- writer.print(format, args) catch {};
- writer.flush() catch {};
-
- trace_count += 1;
-
- if (trace_count >= MAX_TRACE) {
- trace_no_count("exiting after {} trace statements\n", .{trace_count});
- trace_no_count("pi exited cleanly: {} calls to random\n", .{c.fake_random_calls()});
- std.process.exit(0);
- }
-}
-
-pub fn initialize() void {
- c.fake_random_init();
-
- trace("calling pi code\n", .{});
-}
-
-pub fn finalize() void {
- trace_no_count("pi exited cleanly: {} calls to random\n", .{c.fake_random_calls()});
-}
-
-export fn get_u32(address: *u32) u32 {
- switch (@intFromPtr(address)) {
- (BASE_ADDRESS + gpio.START_OFFSET)...(BASE_ADDRESS + gpio.END_OFFSET) => {
- const value = gpio.read_u32(address) catch |e| {
- std.log.err("read_u32 gpio error: {t}", .{e});
- return c.fake_random();
- };
-
- trace("GET32(0x{x}) = 0x{x}\n", .{ @intFromPtr(address), value });
- return value;
- },
- else => {
- std.log.err("read_u32: illegal read", .{});
- return c.fake_random();
- },
- }
-}
-
-export fn put_u32(address: *u32, value: u32) void {
- trace("PUT32(0x{x}) = 0x{x}\n", .{ @intFromPtr(address), value });
- switch (@intFromPtr(address)) {
- (BASE_ADDRESS + gpio.START_OFFSET)...(BASE_ADDRESS + gpio.END_OFFSET) => {
- gpio.put_u32(address, value) catch |e| {
- std.log.err("put_u32 gpio error: {t}", .{e});
- };
- },
- else => {
- std.log.err("put_u32: illegal write", .{});
- },
- }
-}
-
-export fn delay_cycles(cycles: u32) void {
- trace("delaying {} cycles\n", .{cycles});
-}
-
-export fn gpio_panic_pin(pin: u32) void {
- writer.print("GPIO_PANIC:illegal pin={}\n", .{pin}) catch {};
- writer.flush() catch {};
-}
-
-export fn gpio_panic_func(func: u32) void {
- writer.print("GPIO_PANIC:illegal func={x}\n", .{func}) catch {};
- writer.flush() catch {};
-}
-
-export fn gpio_bad_pin(pin: u32, func: u32) void {
- trace_no_count("about to set bad fn: pin={}, func={}\n", .{ pin, func });
-}
diff --git a/include/fake-pi.h b/include/fake-pi.h
@@ -1 +0,0 @@
-#include "fake-random.h"
diff --git a/include/fake-random.c b/include/fake-random.c
@@ -1,46 +0,0 @@
-// wrapper for the our local random() implementation (in pi-random.c).
-#include <string.h>
-#include <assert.h>
-#include <stdlib.h>
-
-#include "fake-random.h"
-#include "pi-random.h"
-
-
-
-#define STATESIZE 128
-static int seed = 0;
-static char statebuf[STATESIZE];
-static struct pi_random_data r;
-static int init_p = 0;
-
-void fake_random_seed(unsigned x) {
- init_p = 1;
- memset(&r, 0, sizeof r);
- if(pi_initstate_r(seed, statebuf, STATESIZE, &r))
- assert(0);
- if(pi_srandom_r(seed, &r))
- assert(0);
-}
-
-// make sure that everyone has the same random.
-void fake_random_init(void) {
- fake_random_seed(0x140e);
- unsigned u = fake_random();
- assert(0x6b8b4567 == u);
-}
-
-static unsigned nrandom_calls;
-unsigned fake_random_calls(void) {
- return nrandom_calls;
-}
-
-unsigned (fake_random)(void) {
- assert(init_p);
-
- nrandom_calls++;
- int x;
- if(pi_random_r(&r, &x))
- assert(0);
- return x;
-}
diff --git a/include/fake-random.h b/include/fake-random.h
@@ -1,22 +0,0 @@
-#ifndef __FAKE_PI_H__
-#define __FAKE_PI_H__
-
-#define random() "do not call random() directly"
-
-// prototypes for our fake_random implementation
-
-// must call this first: used to check that everyone
-// has the same seed.
-void fake_random_init(void);
-
-// call to change seed.
-void fake_random_seed(unsigned x);
-
-// total number of random calls (can be used to debug
-// your fake implementation).
-unsigned fake_random_calls(void);
-
-// call this to get a 32-bit pseudo-random number.
-unsigned fake_random(void);
-
-#endif
diff --git a/include/pi-random.c b/include/pi-random.c
@@ -1,390 +0,0 @@
-/*
- * Copyright (c) 1983 Regents of the University of California.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms are permitted
- * provided that the above copyright notice and this paragraph are
- * duplicated in all such forms and that any documentation,
- * advertising materials, and other materials related to such
- * distribution and use acknowledge that the software was developed
- * by the University of California, Berkeley. The name of the
- * University may not be used to endorse or promote products derived
- * from this software without specific prior written permission.
- * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
- * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
- * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- */
-
-/*
- * This is derived from the Berkeley source:
- * @(#)random.c 5.5 (Berkeley) 7/6/88
- * It was reworked for the GNU C Library by Roland McGrath.
- * Rewritten to be reentrant by Ulrich Drepper, 1995
- */
-
-#include <stddef.h>
-#include "pi-random.h"
-
-
-/* An improved random number generation package. In addition to the standard
- rand()/srand() like interface, this package also has a special state info
- interface. The initstate() routine is called with a seed, an array of
- bytes, and a count of how many bytes are being passed in; this array is
- then initialized to contain information for random number generation with
- that much state information. Good sizes for the amount of state
- information are 32, 64, 128, and 256 bytes. The state can be switched by
- calling the setstate() function with the same array as was initialized
- with initstate(). By default, the package runs with 128 bytes of state
- information and generates far better random numbers than a linear
- congruential generator. If the amount of state information is less than
- 32 bytes, a simple linear congruential R.N.G. is used. Internally, the
- state information is treated as an array of longs; the zeroth element of
- the array is the type of R.N.G. being used (small integer); the remainder
- of the array is the state information for the R.N.G. Thus, 32 bytes of
- state information will give 7 longs worth of state information, which will
- allow a degree seven polynomial. (Note: The zeroth word of state
- information also has some other information stored in it; see setstate
- for details). The random number generation technique is a linear feedback
- shift register approach, employing trinomials (since there are fewer terms
- to sum up that way). In this approach, the least significant bit of all
- the numbers in the state table will act as a linear feedback shift register,
- and will have period 2^deg - 1 (where deg is the degree of the polynomial
- being used, assuming that the polynomial is irreducible and primitive).
- The higher order bits will have longer periods, since their values are
- also influenced by pseudo-random carries out of the lower bits. The
- total period of the generator is approximately deg*(2**deg - 1); thus
- doubling the amount of state information has a vast influence on the
- period of the generator. Note: The deg*(2**deg - 1) is an approximation
- only good for large deg, when the period of the shift register is the
- dominant factor. With deg equal to seven, the period is actually much
- longer than the 7*(2**7 - 1) predicted by this formula. */
-
-
-
-/* For each of the currently supported random number generators, we have a
- break value on the amount of state information (you need at least this many
- bytes of state info to support this random number generator), a degree for
- the polynomial (actually a trinomial) that the R.N.G. is based on, and
- separation between the two lower order coefficients of the trinomial. */
-
-/* Linear congruential. */
-#define TYPE_0 0
-#define BREAK_0 8
-#define DEG_0 0
-#define SEP_0 0
-
-/* x**7 + x**3 + 1. */
-#define TYPE_1 1
-#define BREAK_1 32
-#define DEG_1 7
-#define SEP_1 3
-
-/* x**15 + x + 1. */
-#define TYPE_2 2
-#define BREAK_2 64
-#define DEG_2 15
-#define SEP_2 1
-
-/* x**31 + x**3 + 1. */
-#define TYPE_3 3
-#define BREAK_3 128
-#define DEG_3 31
-#define SEP_3 3
-
-/* x**63 + x + 1. */
-#define TYPE_4 4
-#define BREAK_4 256
-#define DEG_4 63
-#define SEP_4 1
-
-
-/* Array versions of the above information to make code run faster.
- Relies on fact that TYPE_i == i. */
-
-#define MAX_TYPES 5 /* Max number of types above. */
-
-struct random_poly_info
-{
- int seps[MAX_TYPES];
- int degrees[MAX_TYPES];
-};
-
-static const struct random_poly_info random_poly_info =
-{
- { SEP_0, SEP_1, SEP_2, SEP_3, SEP_4 },
- { DEG_0, DEG_1, DEG_2, DEG_3, DEG_4 }
-};
-
-
-
-
-/* If we are using the trivial TYPE_0 R.N.G., just do the old linear
- congruential bit. Otherwise, we do our fancy trinomial stuff, which is the
- same in all the other cases due to all the global variables that have been
- set up. The basic operation is to add the number at the rear pointer into
- the one at the front pointer. Then both pointers are advanced to the next
- location cyclically in the table. The value returned is the sum generated,
- reduced to 31 bits by throwing away the "least random" low bit.
- Note: The code takes advantage of the fact that both the front and
- rear pointers can't wrap on the same call by not testing the rear
- pointer if the front one has wrapped. Returns a 31-bit random number. */
-int pi_random_r(struct pi_random_data *buf, int32_t *result)
-{
- int32_t *state;
-
- if (buf == NULL || result == NULL)
- goto fail;
-
- state = buf->state;
-
- if (buf->rand_type == TYPE_0)
- {
- int32_t val = state[0];
- val = ((state[0] * 1103515245) + 12345) & 0x7fffffff;
- state[0] = val;
- *result = val;
- }
- else
- {
- int32_t *fptr = buf->fptr;
- int32_t *rptr = buf->rptr;
- int32_t *end_ptr = buf->end_ptr;
- int32_t val;
-
- val = *fptr += *rptr;
- /* Chucking least random bit. */
- *result = (val >> 1) & 0x7fffffff;
- ++fptr;
- if (fptr >= end_ptr)
- {
- fptr = state;
- ++rptr;
- }
- else
- {
- ++rptr;
- if (rptr >= end_ptr)
- rptr = state;
- }
- buf->fptr = fptr;
- buf->rptr = rptr;
- }
- return 0;
-
-fail:
- return -1;
-}
-
-/* Initialize the random number generator based on the given seed. If the
- type is the trivial no-state-information type, just remember the seed.
- Otherwise, initializes state[] based on the given "seed" via a linear
- congruential generator. Then, the pointers are set to known locations
- that are exactly rand_sep places apart. Lastly, it cycles the state
- information a given number of times to get rid of any initial dependencies
- introduced by the L.C.R.N.G. Note that the initialization of randtbl[]
- for default usage relies on values produced by this routine. */
-int pi_srandom_r (unsigned int seed, struct pi_random_data *buf) {
- int type;
- int32_t *state;
- long int i;
- long int word;
- int32_t *dst;
- int kc;
-
- if (buf == NULL)
- goto fail;
- type = buf->rand_type;
- if ((unsigned int) type >= MAX_TYPES)
- goto fail;
-
- state = buf->state;
- /* We must make sure the seed is not 0. Take arbitrarily 1 in this case. */
- if (seed == 0)
- seed = 1;
- state[0] = seed;
- if (type == TYPE_0)
- goto done;
-
- dst = state;
- word = seed;
- kc = buf->rand_deg;
- for (i = 1; i < kc; ++i)
- {
- /* This does:
- state[i] = (16807 * state[i - 1]) % 2147483647;
- but avoids overflowing 31 bits. */
- long int hi = word / 127773;
- long int lo = word % 127773;
- word = 16807 * lo - 2836 * hi;
- if (word < 0)
- word += 2147483647;
- *++dst = word;
- }
-
- buf->fptr = &state[buf->rand_sep];
- buf->rptr = &state[0];
- kc *= 10;
- while (--kc >= 0)
- {
- int32_t discard;
- (void) pi_random_r (buf, &discard);
- }
-
-done:
- return 0;
-
-fail:
- return -1;
-}
-
-/* Initialize the state information in the given array of N bytes for
- future random number generation. Based on the number of bytes we
- are given, and the break values for the different R.N.G.'s, we choose
- the best (largest) one we can and set things up for it. srandom is
- then called to initialize the state information. Note that on return
- from srandom, we set state[-1] to be the type multiplexed with the current
- value of the rear pointer; this is so successive calls to initstate won't
- lose this information and will be able to restart with setstate.
- Note: The first thing we do is save the current state, if any, just like
- setstate so that it doesn't matter when initstate is called.
- Returns a pointer to the old state. */
-int pi_initstate_r (unsigned int seed, char *arg_state, size_t n, struct pi_random_data *buf)
-{
- int type;
- int degree;
- int separation;
- int32_t *state;
-
- if (buf == NULL)
- goto fail;
-
- if (n >= BREAK_3)
- type = n < BREAK_4 ? TYPE_3 : TYPE_4;
- else if (n < BREAK_1)
- {
- if (n < BREAK_0)
- {
- goto fail;
- }
- type = TYPE_0;
- }
- else
- type = n < BREAK_2 ? TYPE_1 : TYPE_2;
-
- degree = random_poly_info.degrees[type];
- separation = random_poly_info.seps[type];
-
- buf->rand_type = type;
- buf->rand_sep = separation;
- buf->rand_deg = degree;
- state = &((int32_t *) arg_state)[1]; /* First location. */
- /* Must set END_PTR before srandom. */
- buf->end_ptr = &state[degree];
-
- buf->state = state;
-
- pi_srandom_r (seed, buf);
-
- state[-1] = TYPE_0;
- if (type != TYPE_0)
- state[-1] = (buf->rptr - state) * MAX_TYPES + type;
-
- return 0;
-
-fail:
- return -1;
-}
-
-/* Restore the state from the given state array.
- Note: It is important that we also remember the locations of the pointers
- in the current state information, and restore the locations of the pointers
- from the old state information. This is done by multiplexing the pointer
- location into the zeroth word of the state information. Note that due
- to the order in which things are done, it is OK to call setstate with the
- same state as the current state
- Returns a pointer to the old state information. */
-int pi_setstate_r (char *arg_state, struct pi_random_data *buf)
-{
- int32_t *new_state = 1 + (int32_t *) arg_state;
- int type;
- int old_type;
- int32_t *old_state;
- int degree;
- int separation;
-
- if (arg_state == NULL || buf == NULL)
- goto fail;
-
- old_type = buf->rand_type;
- old_state = buf->state;
- if (old_type == TYPE_0)
- old_state[-1] = TYPE_0;
- else
- old_state[-1] = (MAX_TYPES * (buf->rptr - old_state)) + old_type;
-
- type = new_state[-1] % MAX_TYPES;
- if (type < TYPE_0 || type > TYPE_4)
- goto fail;
-
- buf->rand_deg = degree = random_poly_info.degrees[type];
- buf->rand_sep = separation = random_poly_info.seps[type];
- buf->rand_type = type;
-
- if (type != TYPE_0)
- {
- int rear = new_state[-1] / MAX_TYPES;
- buf->rptr = &new_state[rear];
- buf->fptr = &new_state[(rear + separation) % degree];
- }
- buf->state = new_state;
- /* Set end_ptr too. */
- buf->end_ptr = &new_state[degree];
-
- return 0;
-
-fail:
- return -1;
-}
-
-
-#ifdef TEST
-
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include <time.h>
-#include <assert.h>
-
-#define STATESIZE 128
-
-// we are not guaranteed that the libc implement of random is the same.
-// we provide our own.
-
-static void print_random(struct pi_random_data *r, unsigned n) {
- for(int i = 0; i < n; i++) {
- int x;
- if(pi_random_r(r, &x))
- assert(0);
- printf("x=%x, %d\n", x,x%1024);
- }
-}
-
-int main() {
- int seed = 0;
- char statebuf[STATESIZE];
- struct pi_random_data r;
-
- memset(&r, 0, sizeof r);
- if(pi_initstate_r(seed, statebuf, STATESIZE, &r))
- assert(0);
- if(pi_srandom_r(seed, &r))
- assert(0);
-
- // should be same.
- print_random(&r, 8);
- pi_srandom_r(seed, &r);
- print_random(&r, 8);
-
- return 0;
-}
-#endif
diff --git a/include/pi-random.h b/include/pi-random.h
@@ -1,23 +0,0 @@
-#ifndef __PI_RANDOM_H__
-#define __PI_RANDOM_H__
-
-#include <stdint.h>
-#include <stddef.h>
-
-struct pi_random_data
- {
- int32_t *fptr; /* Front pointer. */
- int32_t *rptr; /* Rear pointer. */
- int32_t *state; /* Array of state values. */
- int rand_type; /* Type of random number generator. */
- int rand_deg; /* Degree of random number generator. */
- int rand_sep; /* Distance between front and rear. */
- int32_t *end_ptr; /* Pointer behind state table. */
- };
-
-int pi_random_r(struct pi_random_data *buf, int32_t *result);
-int pi_srandom_r (unsigned int seed, struct pi_random_data *buf);
-int pi_initstate_r (unsigned int seed, char *arg_state, size_t n, struct pi_random_data *buf);
-int pi_setstate_r (char *arg_state, struct pi_random_data *buf);
-
-#endif
diff --git a/include/rpi.h b/include/rpi.h
@@ -1,16 +0,0 @@
-void gpio_set_input(unsigned pin);
-void gpio_set_output(unsigned pin);
-
-void gpio_write(unsigned pin, unsigned val);
-int gpio_read(unsigned pin);
-
-void gpio_set_on(unsigned pin);
-void gpio_set_off(unsigned pin);
-
-void gpio_set_function(unsigned pin, unsigned function);
-
-int output(const char *format, ...);
-int panic(const char *format, ...);
-void delay_cycles(unsigned ticks);
-
-void notmain(void);
diff --git a/include/test-helper.h b/include/test-helper.h
@@ -1,28 +0,0 @@
-#include "rpi.h"
-#include "pi-random.h"
-
-// run <fp>:
-// 1. on the values [0..32)
-// 2. with random input <ntrials> times.
-static inline void
-run_test(const char *name, void (*fp)(unsigned), int ntrials) {
- // test pins 0..32, then a bunch of random.
- for(int i = 0; i < 32; i++)
- fp(i);
- for(int i = 0; i < ntrials; i++)
- fp(fake_random());
-}
-
-// run the different tests <ntrials> times.
-static inline void test_gpio_set_output(int ntrials) {
- run_test(__FUNCTION__, gpio_set_output, ntrials);
-}
-static inline void test_gpio_set_input(int ntrials) {
- run_test(__FUNCTION__, gpio_set_input, ntrials);
-}
-static inline void test_gpio_set_on(int ntrials) {
- run_test(__FUNCTION__, gpio_set_on, ntrials);
-}
-static inline void test_gpio_set_off(int ntrials) {
- run_test(__FUNCTION__, gpio_set_off, ntrials);
-}
diff --git a/submodules/cs140e b/submodules/cs140e
@@ -1 +0,0 @@
-Subproject commit ffed91069b4db267abbbd3dff3a952d7368a3c0a
diff --git a/tests/gpio b/tests/gpio
@@ -1 +0,0 @@
-../submodules/cs140e/labs/3-cross-checking/1-fake-pi/tests/
-\ No newline at end of file
diff --git a/tests/gpio.zig b/tests/gpio.zig
@@ -1,59 +0,0 @@
-const std = @import("std");
-
-pub fn build(b: *std.Build) !void {
- const relative_path = b.path("tests/gpio");
- const path = try relative_path.getPath3(b, null).toString(b.allocator);
- defer b.allocator.free(path);
-
- var dir = try std.fs.openDirAbsolute(path, .{ .access_sub_paths = false, .iterate = true });
- defer dir.close();
-
- var iter = dir.iterate();
- while (try iter.next()) |entry| {
- if (entry.kind != .file) continue;
- if (!std.mem.endsWith(u8, entry.name, ".c")) continue;
-
- const pi = b.createModule(.{
- .root_source_file = b.path("fake-pi/pi.zig"),
- .target = b.graph.host,
- .optimize = .ReleaseSafe,
- });
-
- // C files
- const runner = b.createModule(.{
- .root_source_file = b.path("src/test-runner.zig"),
- .target = b.graph.host,
- .optimize = .ReleaseSafe,
- .link_libc = true,
- });
- runner.addCSourceFile(.{ .file = b.path(b.pathJoin(&.{ "tests/gpio", entry.name })) });
- runner.addIncludePath(b.path("include/"));
- runner.addImport("pi", pi);
-
- // TODO; this is duplicated code
- const fake_pi = b.createModule(.{
- .root_source_file = b.path("fake-pi/main.zig"),
- .target = b.graph.host,
- .optimize = .ReleaseFast,
- });
-
- fake_pi.addImport("boot", runner);
-
- // TODO; C should get its own module so we can have fake-pi be in debug for faster comp
- const CFlags = &.{"-O2"};
- fake_pi.addCSourceFile(.{ .file = b.path("include/fake-random.c"), .flags = CFlags });
- fake_pi.addCSourceFile(.{ .file = b.path("include/pi-random.c"), .flags = CFlags });
- fake_pi.addIncludePath(b.path("include/"));
-
- const exe_name = try std.fmt.allocPrint(b.allocator, "{s}-test", .{entry.name});
- defer b.allocator.free(exe_name);
-
- const exe = b.addExecutable(.{
- .name = exe_name,
- .linkage = .dynamic,
- .root_module = fake_pi,
- });
-
- b.installArtifact(exe);
- }
-}
diff --git a/tests/runner b/tests/runner
@@ -1,39 +0,0 @@
-#!/usr/bin/env bash
-
-# Compile tests
-zig build -Dtest="$1"
-
-# Quick Check
-echo -n "running smoke check: "
-for ref in tests/$1/*.ref; do
- name=$(basename $ref)
- tmp_name=$(mktemp)
-
- if [ "${name%.*}" = "5-set-function-N" ]; then
- continue
- fi
-
- ./zig-out/bin/${name%.*}.c-test > ${tmp_name}
- if ! cmp -s ${tmp_name} ${ref}; then
- echo "failed ${name%.*}"
- diff ${tmp_name} ${ref}
- exit
- fi
-done
-
-echo -e "success\n"
-
-# Final checksum
-tmp_name=$(mktemp -d)
-for test in tests/$1/*.c; do
- name=$(basename $test)
-
- ./zig-out/bin/${name}-test | grep 'TRACE:\|ERROR:\|PANIC:' > ${tmp_name}/${name}.out
-done
-
-cd ${tmp_name} && find -type f | sort | xargs cksum
-
-echo -e "\nTotal files: $(ls ${tmp_name} | wc -l)\n"
-
-echo "=== USE THIS VALUE FOR CHECKOFF ==="
-cd ${tmp_name} && find -type f | sort | xargs cksum | cksum