use clap::{Args, Parser, Subcommand, ValueEnum};
use std::path::PathBuf;
pub mod cmd_build;
pub mod cmd_check;
pub mod cmd_clean;
pub mod cmd_doc;
pub mod cmd_dump;
pub mod cmd_fmt;
pub mod cmd_init;
pub mod cmd_metadata;
pub mod cmd_migrate;
pub mod cmd_new;
pub mod cmd_publish;
pub mod cmd_synth;
pub mod cmd_test;
pub mod cmd_translate;
pub mod cmd_update;
pub mod context;
pub mod diff;
pub mod doc;
pub mod runner;
pub mod stopwatch;
pub mod utils;
pub use stopwatch::StopWatch;
#[derive(Parser)]
#[command(author, version, about, long_about = None)]
#[command(propagate_version = true)]
#[clap(version(veryl_metadata::VERYL_VERSION))]
#[clap(long_version(veryl_metadata::VERYL_VERSION))]
pub struct Opt {
#[arg(long, global = true)]
pub quiet: bool,
#[arg(long, global = true)]
pub verbose: bool,
#[arg(long, global = true)]
pub trace: bool,
#[arg(long, global = true, hide = true)]
pub completion: Option<CompletionShell>,
#[command(subcommand)]
pub command: Commands,
}
#[derive(Clone, ValueEnum)]
#[clap(rename_all = "lower")]
pub enum CompletionShell {
Bash,
Elvish,
Fish,
PowerShell,
Zsh,
}
#[derive(Subcommand)]
pub enum Commands {
New(OptNew),
Init(OptInit),
Fmt(OptFmt),
Check(OptCheck),
Build(OptBuild),
Clean(OptClean),
Update(OptUpdate),
Publish(OptPublish),
Migrate(OptMigrate),
Doc(OptDoc),
Metadata(OptMetadata),
Dump(OptDump),
Test(OptTest),
Synth(OptSynth),
Translate(OptTranslate),
}
#[derive(Args)]
pub struct OptTranslate {
pub files: Vec<PathBuf>,
#[arg(long)]
pub stdout: bool,
#[arg(long)]
pub strict: bool,
#[arg(long = "no-format")]
pub no_format: bool,
}
#[derive(Args)]
pub struct OptNew {
pub path: PathBuf,
}
#[derive(Args)]
pub struct OptInit {
#[arg(default_value = ".")]
pub path: PathBuf,
}
#[derive(Args)]
pub struct OptFmt {
pub files: Vec<PathBuf>,
#[arg(long)]
pub check: bool,
}
#[derive(Args)]
pub struct OptCheck {
pub files: Vec<PathBuf>,
}
#[derive(Args)]
pub struct OptBuild {
pub files: Vec<PathBuf>,
#[arg(long)]
pub check: bool,
}
#[derive(Args)]
pub struct OptClean {}
#[derive(Args)]
pub struct OptUpdate {}
#[derive(Args)]
pub struct OptPublish {
#[arg(long)]
pub bump: Option<BumpKind>,
}
#[derive(Args)]
pub struct OptMigrate {
pub files: Vec<PathBuf>,
#[arg(long)]
pub check: bool,
}
#[derive(Args)]
pub struct OptDoc {
pub files: Vec<PathBuf>,
}
#[derive(Args)]
pub struct OptTest {
pub files: Vec<PathBuf>,
#[arg(short = 't', long = "test")]
pub test: Option<String>,
#[arg(long, value_enum)]
pub sim: Option<SimType>,
#[arg(long)]
pub wave: bool,
#[arg(long, value_enum, default_value = "cc")]
pub backend: Backend,
#[arg(long)]
pub backend_validate: bool,
#[arg(long)]
pub disable_ff_opt: bool,
#[arg(long)]
pub ignored: bool,
#[arg(long)]
pub include_ignored: bool,
#[arg(short = 'D', long = "define", value_name = "NAME")]
pub define: Vec<String>,
}
#[derive(Clone, Copy, Debug, Default, ValueEnum)]
pub enum Backend {
Interpret,
Cranelift,
#[default]
Cc,
}
#[derive(Clone, Copy, Debug, ValueEnum)]
pub enum SimType {
Verilator,
Vcs,
Dsim,
Vivado,
}
impl From<SimType> for veryl_metadata::SimType {
fn from(x: SimType) -> Self {
match x {
SimType::Dsim => veryl_metadata::SimType::Dsim,
SimType::Verilator => veryl_metadata::SimType::Verilator,
SimType::Vcs => veryl_metadata::SimType::Vcs,
SimType::Vivado => veryl_metadata::SimType::Vivado,
}
}
}
#[derive(Clone, Copy, Default, Debug, ValueEnum)]
pub enum BumpKind {
Major,
Minor,
#[default]
Patch,
}
impl From<BumpKind> for veryl_metadata::BumpKind {
fn from(x: BumpKind) -> Self {
match x {
BumpKind::Major => veryl_metadata::BumpKind::Major,
BumpKind::Minor => veryl_metadata::BumpKind::Minor,
BumpKind::Patch => veryl_metadata::BumpKind::Patch,
}
}
}
#[derive(Args)]
pub struct OptMetadata {
#[arg(long, value_enum, default_value_t)]
pub format: Format,
}
#[derive(Clone, Copy, Default, Debug, ValueEnum)]
pub enum Format {
#[default]
Pretty,
Json,
}
#[derive(Args)]
pub struct OptDump {
pub files: Vec<PathBuf>,
#[arg(long)]
pub syntax_tree: bool,
#[arg(long)]
pub symbol_table: bool,
#[arg(long)]
pub namespace_table: bool,
#[arg(long)]
pub type_dag: bool,
#[arg(long)]
pub file_dag: bool,
#[arg(long)]
pub attribute_table: bool,
#[arg(long)]
pub unsafe_table: bool,
#[arg(long)]
pub ir: bool,
}
#[derive(Args)]
pub struct OptSynth {
pub files: Vec<PathBuf>,
#[arg(long)]
pub top: Option<String>,
#[arg(long)]
pub timing_paths: Option<usize>,
#[arg(long)]
pub dump_ir: bool,
#[arg(long)]
pub dump_timing: bool,
#[arg(long)]
pub dump_area: bool,
#[arg(long)]
pub dump_power: bool,
}