public static CircuitGraph GetAsGraph(FIRRTL.Circuit circuit, CircuitGraph graphLowFir = null) { VisitHelper helper = new VisitHelper(null, graphLowFir); foreach (var moduleDef in circuit.Modules) { helper.ModuleRoots.Add(moduleDef.Name, moduleDef); } FIRRTL.DefModule mainModDef = circuit.Modules.SingleOrDefault(x => x.Name == circuit.Main); if (mainModDef == null) { throw new ChiselDebugException("Circuit does not contain a module with the circuits name."); } GraphFIR.Module mainModule = VisitModule(helper, null, mainModDef); foreach (var mod in mainModule.GetAllNestedNodesOfType <GraphFIR.Module>()) { CleanupModule(mod); } //mainModule.InferType(); //mainModule.FinishConnections(); return(new CircuitGraph(circuit.Main, mainModule)); }
public VisitHelper ForNewCondModule(string moduleName, FIRRTL.DefModule moduleDef) { return(new VisitHelper(new GraphFIR.Module(moduleName, null, Mod, moduleDef), LowFirGraph, ModuleRoots, this, true, RootHelper ?? this)); }
public VisitHelper ForNewModule(string moduleName, string instanceName, FIRRTL.DefModule moduleDef) { return(new VisitHelper(new GraphFIR.Module(moduleName, instanceName, Mod, moduleDef), LowFirGraph, ModuleRoots, this, false, RootHelper ?? this)); }
private static GraphFIR.Module VisitModule(VisitHelper parentHelper, string moduleInstanceName, FIRRTL.DefModule moduleDef) { if (moduleDef is FIRRTL.Module mod) { VisitHelper helper = parentHelper.ForNewModule(mod.Name, moduleInstanceName, mod); foreach (var port in mod.Ports) { VisitPort(helper, port); } VisitStatement(helper, mod.Body); return(helper.Mod); } else if (moduleDef is FIRRTL.ExtModule extMod) { VisitHelper helper = parentHelper.ForNewModule(extMod.Name, moduleInstanceName, extMod); foreach (var port in extMod.Ports) { VisitPort(helper, port); } return(helper.Mod); } else { throw new NotImplementedException(); } }