use llhd::{int_ty, ir::prelude::*, signal_ty};
fn main() {
let mut md = Module::new();
let mut func_sig = Signature::new();
func_sig.add_input(int_ty(32));
func_sig.set_return_type(int_ty(3));
md.declare(UnitName::global("my_func"), func_sig.clone());
let mut proc_sig = Signature::new();
proc_sig.add_input(signal_ty(int_ty(42)));
proc_sig.add_output(signal_ty(int_ty(9)));
md.declare(UnitName::global("my_proc"), proc_sig.clone());
let mut proc2 = UnitData::new(UnitKind::Process, UnitName::local("foo"), Signature::new());
{
let mut builder = UnitBuilder::new_anonymous(&mut proc2);
let bb = builder.block();
builder.append_to(bb);
let ext = builder.add_extern(UnitName::global("my_func"), func_sig);
let v1 = builder.ins().const_int((32, 9001));
builder.ins().call(ext, vec![v1]);
}
md.add_unit(proc2);
let mut ent = UnitData::new(UnitKind::Entity, UnitName::local("bar"), Signature::new());
{
let mut builder = UnitBuilder::new_anonymous(&mut ent);
let ext0 = builder.add_extern(UnitName::global("my_proc"), proc_sig);
let ext1 = builder.add_extern(UnitName::local("foo"), Signature::new());
builder.ins().inst(ext0, vec![], vec![]);
builder.ins().inst(ext1, vec![], vec![]);
}
md.add_unit(ent);
md.link();
println!("{}", md.dump());
}