private static void SolveTable1(Table1 table1) { for (int i = 0; i < table1.Columns.Count - 1; i++) { for (int j = 0; j < table1.Columns[i].Groups.Count - 1; j++) { for (int k = 0; k < table1.Columns[i].Groups[j].Records.Count; k++) { var term1 = table1.Columns[i].Groups[j].Records[k]; for (int l = 0; l < table1.Columns[i].Groups[j + 1].Records.Count; l++) { var term2 = table1.Columns[i].Groups[j + 1].Records[l]; var res = Data.QuineMcCluskey.Table1.Loop.CompareItems(term1, term2); if (res == null) { continue; } // Mark records as used term1.Used = term2.Used = true; if (table1.Columns[i + 1].Groups[j].Records.Any(r => res.Data.SequenceEqual(r.Data))) { continue; } table1.Columns[i + 1].Groups[j].Records.Add(res); } } } } }
private static Table1 CreateTable1(IEnumerable <int> minterms) { var table = new Table1(); // If there are no minterms at all, return empty table if (!minterms.Any()) { return(table); } // Convert to binary var bin_minterms = minterms.Select(m => new { Binary = Convert.ToString(m, 2), Decimal = m }); // Compute number of bits var bits = bin_minterms.Max(m => m.Binary.Length); // Pad the binary numbers, convert to logic states var bin_minterms_padded = bin_minterms .Select(m => new { Binary = m.Binary.PadLeft(bits, '0').Select(b => { switch (b) { case '0': return(LogicState.False); case '1': return(LogicState.True); default: return(LogicState.DontCare); } }), m.Decimal }); for (int i = 0; i <= bits; i++) { var column = new Data.QuineMcCluskey.Table1.Column(); for (int j = 0; j < bits - i + 1; j++) { column.Groups.Add(new Data.QuineMcCluskey.Table1.Group()); } table.Columns.Add(column); } foreach (var minterm in bin_minterms_padded) { table .Columns[0] .Groups[minterm.Binary.Count(n => n == LogicState.True)] .Records.Add(new Data.QuineMcCluskey.Table1.Loop(new[] { minterm.Decimal }, minterm.Binary.ToArray())); } return(table); }