public NetComponents( GateChipDefinition gateChip, List <LogicGate> gates, Dictionary <StdLogic, Net> netMap, DeclaredObjectContainer design, Dictionary <StdLogic, Net> representingNet) { if (gateChip.gateCount < gates.Count) { throw new Exception(); } this.chip = gateChip; this.id = ++NetComponents.count; for (int i = 0; i < gates.Count; ++i) { for (int j = 0; j < gates[i].inputSignals.Count; ++j) { var netInputSignal = netMap[(StdLogic)gates[i].inputSignals[j]]; var chipInputSignal = gateChip.portNameMappings[i][new StdLogic(new SignalName(".in" + j))]; if (!chipInputSignal.attribute.ContainsKey("pin_assign")) { throw new CompilerException( string.Format(@"Port signal ""{0}"" of chip ""{1}"" does not have attribute ""pin_assignment""", chipInputSignal.name, gateChip.chipName)); } netInputSignal.adjacentNodes.Add(new Node(this, (int)chipInputSignal.attribute["pin_assign"])); } for (int j = gates[i].inputSignals.Count; j < gateChip.gateWidth; ++j) { var chipInputSignal = gateChip.portNameMappings[i][new StdLogic(new SignalName(".in" + j))]; if (!chipInputSignal.attribute.ContainsKey("pin_assign")) { throw new CompilerException( string.Format(@"Port signal ""{0}"" of chip ""{1}"" does not have attribute ""pin_assignment""", chipInputSignal.name, gateChip.chipName)); } // ゲートの余った入力 if (gateChip.defaultHigh) { if (!design.signalTable.ContainsKey("VCC") || !(design.signalTable["VCC"] is StdLogic)) { throw new CompilerException( string.Format(@"Signal ""{0}"" was not found in design", "VCC")); } var vccSignal = (StdLogic)design.signalTable["VCC"]; netMap[vccSignal].adjacentNodes.Add(new Node(this, (int)chipInputSignal.attribute["pin_assign"])); } else { if (!design.signalTable.ContainsKey("GND") || !(design.signalTable["GND"] is StdLogic)) { throw new CompilerException( string.Format(@"Signal ""{0}"" was not found in design", "GND")); } var groundSignal = (StdLogic)design.signalTable["GND"]; netMap[groundSignal].adjacentNodes.Add(new Node(this, (int)chipInputSignal.attribute["pin_assign"])); } } var netOutputSignal = netMap[(StdLogic)gates[i].outputSignal]; var chipOutputSignal = gateChip.portNameMappings[i][new StdLogic(new SignalName(".out"))]; if (!chipOutputSignal.attribute.ContainsKey("pin_assign")) { throw new CompilerException( string.Format(@"Port signal ""{0}"" of chip ""{1}"" does not have attribute ""pin_assignment""", chipOutputSignal.name, gateChip.chipName)); } netOutputSignal.adjacentNodes.Add(new Node(this, (int)chipOutputSignal.attribute["pin_assign"])); } ProcesConstAssign(this, design, representingNet); }
static void Main(string[] args) { string programFile = args[0]; string chipDefinitionDirectory = args[1]; string outFile = args[2]; var mainObject = (new Parser.MyParser()).Parse(programFile); Console.WriteLine("------ {0} ------", programFile); mainObject.Print(); var chipDefinitions = new List <IChipDefinition>(); foreach (string chipDesignFile in System.IO.Directory.GetFiles(chipDefinitionDirectory, "*.vhd")) { IChipDefinition chipDefinition = GateChipDefinition.ImportFromFile(chipDesignFile); if (chipDefinition == null) { chipDefinition = ComponentChipDefinition.ImportFromFile(chipDesignFile); } if (chipDefinition == null) { continue; } chipDefinitions.Add(chipDefinition); Console.WriteLine(); Console.WriteLine("------ {0} ------", chipDesignFile); } var compiler = new Compiler.Compiler(); compiler.Compile(mainObject, chipDefinitions); Console.WriteLine(); Console.WriteLine("-----------------"); foreach (var parts in compiler.netComponents) { if (parts.chip is ComponentChipDefinition) { Console.WriteLine("[LIBPARTS]: {0} ({1})", ((ComponentChipDefinition)parts.chip).chipAttribute["component_name"], parts.GetHashCode()); } else if (parts.chip is GateChipDefinition) { Console.WriteLine("[LIBPARTS]: {0} ({1})", ((GateChipDefinition)parts.chip).chipAttribute["component_name"], parts.GetHashCode()); } } foreach (var pair in compiler.representingNet) { Console.WriteLine("[NET]: {0} -> {1}", pair.Key, pair.Value.name); foreach (var node in pair.Value.adjacentNodes) { Console.WriteLine("\t{0}:pin{1}", node.netComponent.GetHashCode(), node.pin); } } (new Writer.Writer()).Write(compiler, outFile); // パーツリストを出力 var componentList = new Dictionary <IChipDefinition, int>(); foreach (var netComponent in compiler.netComponents) { if (!componentList.ContainsKey(netComponent.chip)) { componentList[netComponent.chip] = 0; } componentList[netComponent.chip]++; } Console.WriteLine(); Console.WriteLine("----- partslist -----"); foreach (var pair in componentList) { Console.WriteLine("{0} : {1} (residue : {2})", pair.Key.chipAttribute["component_name"], pair.Value, compiler.resComponentCount[pair.Key]); } Console.WriteLine("----------"); Console.WriteLine("sum : {0}", componentList.Values.Sum()); Console.WriteLine("finished."); }