// SPDX-License-Identifier: LGPL-3.0-or-later // See Notices.txt for copyright information use fayalite::{ build::{ToArgs, WriteArgs}, prelude::*, }; #[hdl_module] fn blinky(clock_frequency: u64) { #[hdl] let clk: Clock = m.input(); #[hdl] let rst: SyncReset = m.input(); let cd = #[hdl] ClockDomain { clk, rst: rst.to_reset(), }; let max_value = clock_frequency / 2 - 1; let int_ty = UInt::range_inclusive(0..=max_value); #[hdl] let counter_reg: UInt = reg_builder().clock_domain(cd).reset(0u8.cast_to(int_ty)); #[hdl] let output_reg: Bool = reg_builder().clock_domain(cd).reset(false); #[hdl] if counter_reg.cmp_eq(max_value) { connect_any(counter_reg, 0u8); connect(output_reg, !output_reg); } else { connect_any(counter_reg, counter_reg + 1_hdl_u1); } #[hdl] let led: Bool = m.output(); connect(led, output_reg); } #[derive(clap::Args, Clone, PartialEq, Eq, Hash, Debug)] struct ExtraArgs { /// clock frequency in hertz #[arg(long, default_value = "1000000", value_parser = clap::value_parser!(u64).range(2..))] clock_frequency: u64, } impl ToArgs for ExtraArgs { fn to_args(&self, args: &mut (impl WriteArgs + ?Sized)) { let Self { clock_frequency } = self; args.write_arg(format!("--clock-frequency={clock_frequency}")); } } fn main() { BuildCli::main(|_cli, ExtraArgs { clock_frequency }| { Ok(JobParams::new(blinky(clock_frequency), "blinky")) }); }