77 lines
2.4 KiB
Rust
77 lines
2.4 KiB
Rust
use crate::frontend::types::{Type, TypeStruct};
|
|
use crate::frontend::Callable;
|
|
use crate::rtlil;
|
|
use crate::rtlil::SigSpec;
|
|
|
|
fn instantiate_unop(celltype: &str, id: &str, args: &[SigSpec], ret: &SigSpec) -> rtlil::Cell {
|
|
let a = args
|
|
.get(0)
|
|
.expect("wrong argcount slipped through type check");
|
|
assert_eq!(args.len(), 1);
|
|
|
|
let mut cell = rtlil::Cell::new(id, celltype);
|
|
cell.add_param("\\A_SIGNED", "0");
|
|
cell.add_param("\\A_WIDTH", "1");
|
|
cell.add_param("\\Y_WIDTH", "1");
|
|
cell.add_connection("\\A", a);
|
|
cell.add_connection("\\Y", ret);
|
|
cell
|
|
}
|
|
|
|
fn instantiate_binop(celltype: &str, id: &str, args: &[SigSpec], ret: &SigSpec) -> rtlil::Cell {
|
|
let a = args
|
|
.get(0)
|
|
.expect("wrong argcount slipped through type check");
|
|
let b = args
|
|
.get(1)
|
|
.expect("wrong argcount slipped through type check");
|
|
assert_eq!(args.len(), 2);
|
|
|
|
let mut cell = rtlil::Cell::new(id, celltype);
|
|
cell.add_param("\\A_SIGNED", "0");
|
|
cell.add_param("\\A_WIDTH", "1");
|
|
cell.add_param("\\B_SIGNED", "0");
|
|
cell.add_param("\\B_WIDTH", "1");
|
|
cell.add_param("\\Y_WIDTH", "1");
|
|
cell.add_connection("\\A", a);
|
|
cell.add_connection("\\B", b);
|
|
cell.add_connection("\\Y", ret);
|
|
cell
|
|
}
|
|
|
|
fn make_binop_callable<'ctx>(name: &str, celltype: &'static str) -> Callable<'ctx> {
|
|
// FIXME: CRIMES CRIMES CRIMES
|
|
let logic_type: &'static TypeStruct = Box::leak(Box::new(TypeStruct::logic_infer()));
|
|
let args = vec![
|
|
(Some("a".to_owned()), logic_type),
|
|
(Some("b".to_owned()), logic_type),
|
|
];
|
|
Callable {
|
|
name: name.to_owned(),
|
|
args,
|
|
ret_type: Some(logic_type),
|
|
}
|
|
}
|
|
|
|
fn make_unnop_callable<'ctx>(name: &str, celltype: &'static str) -> Callable<'ctx> {
|
|
// FIXME: CRIMES CRIMES CRIMES
|
|
let logic_type: &'static TypeStruct = Box::leak(Box::new(TypeStruct::logic_infer()));
|
|
let args = vec![(Some("A".to_owned()), logic_type)];
|
|
Callable {
|
|
name: name.to_owned(),
|
|
args,
|
|
ret_type: Some(logic_type),
|
|
}
|
|
}
|
|
|
|
pub fn get_builtins<'ctx>() -> Vec<Callable<'ctx>> {
|
|
vec![
|
|
make_binop_callable("and", "$and"),
|
|
make_binop_callable("or", "$or"),
|
|
make_binop_callable("xor", "$xor"),
|
|
make_binop_callable("xnor", "$xnor"),
|
|
make_unnop_callable("not", "$not"),
|
|
make_unnop_callable("reduce_or", "$reduce_or"),
|
|
]
|
|
}
|