using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Xml; using System.IO; using System.Threading; namespace _1 { public partial class Form1 : Form { List processPins; List inputs; List outputs; List gates; public string fname; Thread t; public Form1() { fname = ""; InitializeComponent(); } private void log(string text) { if (logger.InvokeRequired) logger.Invoke(new logg(log_i),text); else logger.Text += text; } delegate void logg(string text); private void log_i(string text) { logger.Text += text; } private void tlog(string text) { if (this.InvokeRequired) this.Invoke(new tlogg(tlog_i), text); else this.Text = text; } delegate void tlogg(string text); private void tlog_i(string text) { this.Text = text; } private void listGatesToolStripMenuItem_Click(object sender, EventArgs e) { string pins = ""; foreach (pin p in processPins) pins += "P: " + p.name + Environment.NewLine; MessageBox.Show(pins); foreach (gate g in gates) { pins = g.gt.ToString() + Environment.NewLine; foreach (pin p in g.inputPins) pins += "I: " + p.name + Environment.NewLine; foreach (pin p in g.outputPins) pins += "O: " + p.name + Environment.NewLine; MessageBox.Show(pins); } } private void calculateToolStripMenuItem1_Click(object sender, EventArgs e) { //v novem threadu, trva to bohuzel ukrutne dlouho, takze je to potreba :( t = new Thread(new ThreadStart(calculateProc)); t.Start(); } private void calculateProc() { string output=""; StreamReader sr = new StreamReader(new FileStream(fname+".in", FileMode.Open)); int rows = 0; //pro vsechny radky vstupniho souboru foreach (string s in sr.ReadToEnd().Split('\n')) { if (s != "") { rows++; tlog("pocitam " + rows.ToString() + ". radek vstupniho souboru"); //vyresime output += calculate(s) + Environment.NewLine; } //reset pinu a hradel mezi radky vypoctu foreach (pin p in processPins) p.value = logicValue.unknown; foreach (gate g in gates) { g.solved = false; foreach (pin p in g.inputPins) p.value = logicValue.unknown; } } sr.Close(); log("results:"+Environment.NewLine+output); //zapsani vysledku do konzole Console.WriteLine(output); if (fromargs) { this.Close(); Application.Exit(); } } public string calculate(string inputData) { log("pocitam " + inputData+Environment.NewLine); for (int i=0;i [ "); foreach (pin p in g.outputPins) log(p.name + " "); log("]" + Environment.NewLine); //a vyresime ho solve(g); } else unsolved = false; } string outp = ""; //pro vsechny vystupy u foreach (string s in outputs) foreach (pin gp in processPins) //najdeme odpovidajici pin if (gp.name == s) //a zapiseme jeho hodnotu if (gp.value == logicValue.high) outp += "1"; else outp += "0"; return outp; } private void solve(gate g) { logicValue outval=logicValue.unknown; //priradit vstupum hodnoty foreach (pin ip in g.inputPins) { log(" vstupni pin hradla " + ip.name + " " + ip.value.ToString()); foreach (pin p in processPins) if (ip.name == p.name) ip.value = p.value; log("->" + ip.value.ToString() +Environment.NewLine); } //spocitat hodnotu vystupu if (g.gt == gateType.not) { if (g.inputPins[0].value == logicValue.high) outval = logicValue.low; else outval = logicValue.high; } if (g.gt == gateType.and) { bool tmp = true; foreach (pin p in g.inputPins) if (p.value == logicValue.low) tmp = false; if (tmp) outval = logicValue.high; else outval = logicValue.low; } if (g.gt == gateType.or) { bool tmp = false; foreach (pin p in g.inputPins) if (p.value == logicValue.high) tmp = true; if (tmp) outval = logicValue.high; else outval = logicValue.low; } if (g.gt == gateType.xor) { int count = 0; foreach (pin p in g.inputPins) if (p.value == logicValue.high) count++; bool tmp = (count % 2 == 1); if (tmp) outval = logicValue.high; else outval = logicValue.low; } //najit odpovidajici pin a zapsat do nej hodnotu foreach (pin p in processPins) if (p.name == g.outputPins[0].name) { p.value = outval; log(" " + g.outputPins[0].name + "->" + outval.ToString() + Environment.NewLine + Environment.NewLine); } g.solved = true; } //vraci nevyresene hradlo, u ktereho ale zname hodnoty na vstupu private gate findSolvableGate() { foreach (gate g in gates) { bool solvable = true; //pro vsechny vstupy foreach (pin p in g.inputPins) { bool tmp = false; //zjistime, zdali uz zname hodnoty foreach (pin mp in processPins) if ((p.name == mp.name) && (mp.value != logicValue.unknown)) tmp = true; //pokud tomu neni, hradlo nevyhovuje if (!tmp) solvable = false; } if (!g.solved && solvable) return g; } return new gate("invalid"); } private void open() { processPins = new List(); inputs = new List(); outputs = new List(); gates = new List(); StreamReader sr = new StreamReader(new FileStream(fname, FileMode.Open)); string gatetype = ""; bool ingate = false; gate g = new gate(""); //proc ja se nenaucil parsovat xmlka... :( foreach (string s in sr.ReadToEnd().Split('\n')) { if (s.Contains("")) { ingate = false; gates.Add(g); } if (s.Contains("