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> { 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"), ] }