Files
chipyard/tests/gcd.c
2019-09-26 01:47:31 -07:00

43 lines
796 B
C

#include "mmio.h"
#define GCD_STATUS 0x2000
#define GCD_X 0x2004
#define GCD_Y 0x2008
#define GCD_GCD 0x200C
unsigned int gcd_ref(unsigned int x, unsigned int y) {
while (y != 0) {
if (x > y)
x = x - y;
else
y = y - x;
}
return x;
}
// DOC include start: GCD test
int main(void)
{
uint32_t result, ref, x = 20, y = 15;
// wait for peripheral to be ready
while ((reg_read8(GCD_STATUS) & 0x2) == 0) ;
reg_write32(GCD_X, x);
reg_write32(GCD_Y, y);
// wait for peripheral to complete
while ((reg_read8(GCD_STATUS) & 0x1) == 0) ;
result = reg_read32(GCD_GCD);
ref = gcd_ref(x, y);
if (result != ref) {
printf("Hardware result %d does not match reference value %d\n", result, ref);
return 1;
}
return 0;
}
// DOC include end: GCD test