// Wokwi Custom Chip - For docs and examples see:
// https://docs.wokwi.com/chips-api/getting-started
//
// SPDX-License-Identifier: MIT
// Copyright 2023 Murtaza Tunio
#include "wokwi-api.h"
#include <stdio.h>
#include <stdlib.h>
typedef struct {
// TODO: Put your chip variables here
pin_t clk;
pin_t acc_oe;
pin_t acc_we;
pin_t a_in0;
pin_t a_in1;
pin_t a_in2;
pin_t a_in3;
pin_t a_in4;
pin_t a_in5;
pin_t a_in6;
pin_t a_in7;
pin_t a_out0;
pin_t a_out1;
pin_t a_out2;
pin_t a_out3;
pin_t a_out4;
pin_t a_out5;
pin_t a_out6;
pin_t a_out7;
} chip_state_t;
uint8_t acc[] = {0, 0, 0, 0, 0, 0, 0, 0};
void update_output(chip_state_t *chip) {
if (pin_read(chip->acc_we)) {
acc[0] = pin_read(chip->a_in0);
acc[1] = pin_read(chip->a_in1);
acc[2] = pin_read(chip->a_in2);
acc[3] = pin_read(chip->a_in3);
acc[4] = pin_read(chip->a_in4);
acc[5] = pin_read(chip->a_in5);
acc[6] = pin_read(chip->a_in6);
acc[7] = pin_read(chip->a_in7);
}
if (pin_read(chip->acc_oe)) {
pin_write(chip->a_out0, acc[0]);
pin_write(chip->a_out1, acc[1]);
pin_write(chip->a_out2, acc[2]);
pin_write(chip->a_out3, acc[3]);
pin_write(chip->a_out4, acc[4]);
pin_write(chip->a_out5, acc[5]);
pin_write(chip->a_out6, acc[6]);
pin_write(chip->a_out7, acc[7]);
}
}
void chip_pin_change(void *user_data, pin_t pin, uint32_t value) {
chip_state_t *chip = (chip_state_t *)user_data;
update_output(chip);
}
void chip_init() {
chip_state_t *chip = malloc(sizeof(chip_state_t));
// TODO: Initialize the chip, set up IO pins, create timers, etc.
chip->clk = pin_init("CLK", INPUT);
chip->acc_oe = pin_init("A_OE", INPUT);
chip->acc_we = pin_init("A_WE", INPUT);
chip->a_in0 = pin_init("AIN0", INPUT);
chip->a_in1 = pin_init("AIN1", INPUT);
chip->a_in2 = pin_init("AIN2", INPUT);
chip->a_in3 = pin_init("AIN3", INPUT);
chip->a_in4 = pin_init("AIN4", INPUT);
chip->a_in5 = pin_init("AIN5", INPUT);
chip->a_in6 = pin_init("AIN6", INPUT);
chip->a_in7 = pin_init("AIN7", INPUT);
chip->a_out0 = pin_init("AOUT0", OUTPUT);
chip->a_out1 = pin_init("AOUT1", OUTPUT);
chip->a_out2 = pin_init("AOUT2", OUTPUT);
chip->a_out3 = pin_init("AOUT3", OUTPUT);
chip->a_out4 = pin_init("AOUT4", OUTPUT);
chip->a_out5 = pin_init("AOUT5", OUTPUT);
chip->a_out6 = pin_init("AOUT6", OUTPUT);
chip->a_out7 = pin_init("AOUT7", OUTPUT);
const pin_watch_config_t watch_config = {
.edge = RISING,
.pin_change = chip_pin_change,
.user_data = chip,
};
pin_watch(chip->clk, &watch_config);
pin_watch(chip->acc_oe, &watch_config);
pin_watch(chip->acc_we, &watch_config);
pin_watch(chip->a_in0, &watch_config);
pin_watch(chip->a_in1, &watch_config);
pin_watch(chip->a_in2, &watch_config);
pin_watch(chip->a_in3, &watch_config);
pin_watch(chip->a_in4, &watch_config);
pin_watch(chip->a_in5, &watch_config);
pin_watch(chip->a_in6, &watch_config);
pin_watch(chip->a_in7, &watch_config);
update_output(chip);
printf("Hello from custom chip!\n");
}