|
|
|
@ -3,7 +3,7 @@
|
|
|
|
|
|
|
|
|
|
use core::fmt::Write;
|
|
|
|
|
use core::panic::PanicInfo;
|
|
|
|
|
use lwcpu::{NumberDisplay, CharDisplay};
|
|
|
|
|
use lwcpu::{NumberDisplay, CharDisplay, TextDisplay};
|
|
|
|
|
use riscv_rt::entry;
|
|
|
|
|
|
|
|
|
|
const SEGMENT_MAX: usize = 8;
|
|
|
|
@ -33,10 +33,11 @@ fn simple_sieve(primes: &mut [usize; SEGMENT_SIZE], n: &mut usize) {
|
|
|
|
|
*n = index;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
fn segment_sieve(primes: &[usize], prime_multiple: &mut [usize]) {
|
|
|
|
|
fn segment_sieve(primes: &[usize], prime_multiple: &mut [usize], char: &mut CharDisplay, text: &mut TextDisplay) {
|
|
|
|
|
let mut low: usize = SEGMENT_SIZE;
|
|
|
|
|
let mut high: usize = SEGMENT_SIZE*2;
|
|
|
|
|
for _ in 1..SEGMENT_SIZE { // there are [SEGMENT_SIZE] number of segments
|
|
|
|
|
char.show();
|
|
|
|
|
let mut segment = [true; SEGMENT_SIZE];
|
|
|
|
|
for (i,p) in primes.iter().enumerate() {
|
|
|
|
|
let mut multiple = prime_multiple[i];
|
|
|
|
@ -46,10 +47,12 @@ fn segment_sieve(primes: &[usize], prime_multiple: &mut [usize]) {
|
|
|
|
|
}
|
|
|
|
|
prime_multiple[i] = multiple;
|
|
|
|
|
}
|
|
|
|
|
char.hide();
|
|
|
|
|
|
|
|
|
|
for (x,prime) in segment.iter().enumerate() {
|
|
|
|
|
if *prime {
|
|
|
|
|
NumberDisplay::display_number((low+x) as u32);
|
|
|
|
|
NumberDisplay::increment();
|
|
|
|
|
writeln!(text, "{} is prime", low+x).ok();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -61,29 +64,43 @@ fn segment_sieve(primes: &[usize], prime_multiple: &mut [usize]) {
|
|
|
|
|
#[panic_handler]
|
|
|
|
|
fn panic_handler(_info: &PanicInfo) -> ! {
|
|
|
|
|
NumberDisplay::display_number(0xDEADC0DE);
|
|
|
|
|
let mut text = CharDisplay{};
|
|
|
|
|
let mut text = TextDisplay::default();
|
|
|
|
|
text.clear(false);
|
|
|
|
|
let _ = write!(text, "Panic: {}", _info.message());
|
|
|
|
|
loop {}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#[entry]
|
|
|
|
|
fn main() -> ! {
|
|
|
|
|
NumberDisplay::display_number(0);
|
|
|
|
|
let mut char = CharDisplay{};
|
|
|
|
|
char.init();
|
|
|
|
|
char.hide();
|
|
|
|
|
char.write_str("SIEVING...").ok();
|
|
|
|
|
|
|
|
|
|
let mut text = TextDisplay::default();
|
|
|
|
|
text.clear(true);
|
|
|
|
|
|
|
|
|
|
// There will be no more than [SEGMENT_SIZE] primes in the segment
|
|
|
|
|
let mut primes_buffer = [0; SEGMENT_SIZE];
|
|
|
|
|
let mut n = 0;
|
|
|
|
|
|
|
|
|
|
char.show();
|
|
|
|
|
simple_sieve(&mut primes_buffer, &mut n);
|
|
|
|
|
char.hide();
|
|
|
|
|
|
|
|
|
|
let primes = &primes_buffer[..n];
|
|
|
|
|
|
|
|
|
|
let mut prime_multiple = [0; SEGMENT_SIZE];
|
|
|
|
|
for (i,x) in primes.iter().enumerate() {
|
|
|
|
|
NumberDisplay::display_number(*x as u32);
|
|
|
|
|
NumberDisplay::increment();
|
|
|
|
|
writeln!(text, "{} is prime", *x).ok();
|
|
|
|
|
let mut multiple = *x;
|
|
|
|
|
while multiple < SEGMENT_SIZE {
|
|
|
|
|
multiple += x;
|
|
|
|
|
}
|
|
|
|
|
prime_multiple[i] = multiple;
|
|
|
|
|
}
|
|
|
|
|
segment_sieve(primes, &mut prime_multiple);
|
|
|
|
|
segment_sieve(primes, &mut prime_multiple, &mut char, &mut text);
|
|
|
|
|
loop {}
|
|
|
|
|
}
|
|
|
|
|