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);
        }
Exemple #2
0
        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.");
        }