//--------------------------------------------------------------------------- #include #include #include #include #include #include #pragma hdrstop #include "Simulator.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; std::map< std::string, int > mapdata; std::vector< std::string > poradiVstupu; std::vector< std::string > poradiVystupu; std::vector< std::map< std::string, std::string > > hradla; std::map< std::string, std::string > gate; std::string convertData(int A) { std::string out; if(A == 0) out.push_back('0'); if(A == 1) out.push_back('1'); return out; } int convertData(std::string A) { if(A.begin() == "0") return 0; if(A.begin() == "1") return 1; } //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { if(OpenDialog1->Execute()) { EditPopis->Text = OpenDialog1->FileName; } else { return; } FILE * popis; popis = fopen(EditPopis->Text.c_str(),"r"); char aa = getc(popis); bool uvnitr = false; while(!feof(popis)) { if(aa == '<') { aa = getc(popis); if(aa == 'g') uvnitr = true; if(aa == '/') uvnitr = false; if(aa == 'i' || aa == 'o') { for(int i=0;i<9;++i) getc(popis); char inout = aa; if(inout == 'o') getc(popis); aa = getc(popis); std::string id; while(aa != '\'') { id.push_back(aa); aa = getc(popis); } mapdata[id] = -1; if(inout == 'i') poradiVstupu.push_back(id); if(inout == 'o' && !uvnitr) poradiVystupu.push_back(id); } } aa = getc(popis); } fclose(popis); popis = fopen(EditPopis->Text.c_str(),"r"); aa = getc(popis); while(!feof(popis)) { if(aa == '<') { aa = getc(popis); if(aa == 'g') { for(int i=0;i<10;++i) getc(popis); aa = getc(popis); std::string typ; while(aa != '\'') { typ.push_back(aa); aa = getc(popis); } gate["typ"] = typ; bool konec = false; while(!konec) { while(getc(popis) != '<'){} aa = getc(popis); std::string vstup; if(aa == '/') konec = true; else if(aa == 'i') vstup = "in"; else vstup = "out"; for(int i=0;i<9;++i) getc(popis); if(vstup == "out") getc(popis); aa = getc(popis); std::string id; while(aa != '\'') { id.push_back(aa); aa = getc(popis); } gate[id] = vstup; } } hradla.push_back(gate); } aa = getc(popis); } fclose(popis); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button2Click(TObject *Sender) { if(OpenDialog2->Execute()) { EditVstup->Text = OpenDialog2->FileName; } else { return; } FILE *f; f=fopen(EditVystup->Text.c_str(),"w"); FILE *in; in = fopen(EditVstup->Text.c_str(),"r"); while(!feof(in)) { char aa = getc(in); //int i=0; //while(aa != '\n' && aa != EOF) for(int i=0;i::iterator ii = gate.begin(); ii != gate.end(); ++ii) { if(ii->second == "in") { if(mapdata[ii->first] == -1) muzespocitat = false; else { ii->second = convertData(mapdata[ii->first]); } } } if(muzespocitat) { if(gate["typ"] == "not") { int vysledek = 0; for(std::map::iterator ii = gate.begin(); ii != gate.end(); ++ii) { if(ii->second == "in") { if(convertData(ii->first) == 0)vysledek = 1; if(convertData(ii->first) == 0)vysledek = 1; } } for(std::map::iterator ii = gate.begin(); ii != gate.end(); ++ii) { if(ii->second == "out") { mapdata[ii->second] = vysledek; } } } if(gate["typ"] == "or") { int vysledek = 0; for(std::map::iterator ii = gate.begin(); ii != gate.end(); ++ii) { if(ii->second == "in") { if(convertData(ii->first) == 1) vysledek = 1; } } for(std::map::iterator ii = gate.begin(); ii != gate.end(); ++ii) { if(ii->second == "out") { mapdata[ii->first] = vysledek; } } } if(gate["typ"] == "and") { int vysledek = 1; for(std::map::iterator ii = gate.begin(); ii != gate.end(); ++ii) { if(ii->second == "in") { if(convertData(ii->first) == 0) vysledek = 0; } } for(std::map::iterator ii = gate.begin(); ii != gate.end(); ++ii) { if(ii->second == "out") { mapdata[ii->first] = vysledek; } } } if(gate["typ"] == "xor") { int vysledek = 0; for(std::map::iterator ii = gate.begin(); ii != gate.end(); ++ii) { if(ii->second == "in") { if(convertData(ii->first) == 1) { if(vysledek == 1) vysledek = 0; if(vysledek == 0) vysledek = 1; } } } for(std::map::iterator ii = gate.begin(); ii != gate.end(); ++ii) { if(ii->second == "out") { mapdata[ii->first] = vysledek; } } } } } pocita = false; for(int i=0;iExecute()) { EditVystup->Text = SaveDialog1->FileName; } else { return; } } //---------------------------------------------------------------------------