/* QMC: simplification tool (by using the Quine - McClusky process) Copyright (C) 2000 Thomas Pollak This program is free software; you can redistribute it and/or modify it under the expression_buffers of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. Auf Deutsch: QMC: Vereinfachungsprogramm fuer logische expression_buffere nach Quine - McClusky Copyright (C) 2000 Thomas Pollak Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen der GNU General Public License, wie von der Free Software Foundation herausgegeben, weitb_resulteben und/oder modifizieren, entweder unter Version 2 der Lizenz oder jeder spaeteren Version. Die Veroeffentlichung dieses Programms erfolgt in der Hoffnung, dass es Ihnen von Nutzen sein wird, aber OHNE JEDE GEWAEHRLEISTUNG - sogar ohne die implizite Gewaehrleistung der MARKTREIFE oder der EIGNUNG FUER EINEN BESTIMMTEN ZWECK. Details finden Sie in der GNU General Public License. Sie sollten eine Kopie der GNU General Public License zusammen mit diesem Programm erhalten haben. Falls nicht, schreiben Sie an die Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* file: core.cc - (part of old main file) begin: 10/2003 email: thomas@pollaknet.at web: http://qmc.pollaknet.at */ //Include #include #include #include #include #include using namespace std; /* unsigned short pow(unsigned short x, unsigned short y) { return( y>1 ? pow(x,--y)*x : x ); } */ unsigned short dual_pow(unsigned char x) { unsigned short int result = 2; while( --x > 0 ) result *= 2; return result; } /* core (old submain) */ int core(char *expression_buffer, unsigned short int options) { /************** * variables * **************/ bool *b_result = NULL, optimize=0; char *vars = NULL, *simple_expression_buffer = NULL; unsigned char num_vars, expr_length, j, check; unsigned short i, help, high, index, temp; clock_t start_time, stop_time; BOOL *BO_var = NULL, *lh = NULL; #ifdef DEBUG cerr << "\ncore started"; cerr << "\ncore.cc [core]: input_buffer [" << expression_buffer; cerr << "], strlen " <> expression_buffer; } /******************* * check brackets * *******************/ if( options & TABLE_INPUT ) { cout << "\nnumber of variables: "; cin >> help; num_vars = (unsigned char)help; //create object arry BO_var = new BOOL[num_vars]; //number of possibilities //help=pow((unsigned short)2,(unsigned short)num_vars); help = dual_pow(num_vars); //create boolean array b_result = new bool[help]; //call input procedure tableinput(BO_var,num_vars,high,b_result,help); //strcpy(expression_buffer,"NOTHING"); } //start timer start_time = clock(); if( !( options & TABLE_INPUT ) ) { //allocate memory for the variables vars = new char[MAX_NUM_VARS+1] ; #ifdef DEBUG cerr << "\ncore.cc [core]: expression_buffer=" << expression_buffer << "; (from input)"; #endif //remove any blank charakter from input buffer remove_blanks(expression_buffer, INPUT_BUFFER_SIZE); #ifdef DEBUG cerr << "\ncore.cc [core]: expression_buffer=" << expression_buffer << "; (without blanks)"; #endif //preparse the string preparse(expression_buffer); #ifdef DEBUG cerr << "\ncore.cc [core]: expression_buffer=" << expression_buffer << "; (parsed)"; #endif if(strlen(expression_buffer)<1) { cout << "nothing to calc!" << endl; //program ends return(0); } //check the input string if((check=bracket_check(expression_buffer,num_vars,vars))!=0) { cout << "bad input, use the correct syntax and try again. code: "; cout << (unsigned short)check << endl; //program ends return(0); } //Status verbose_msg("\nsyntax checked...", options); #ifdef DEBUG cerr << "\ncore.cc [core]: bracket check executed"; #endif //create object array BO_var= new BOOL[num_vars]; #ifdef DEBUG cerr << " - transfering ID to boolean objects "; #endif //transfering to objects for(i=0;i"; #endif //if analyse==1 then increase high if((b_result[i]=analyse(expression_buffer,num_vars,BO_var,0,expr_length-1))==1) { high++; //create entry for boolean table (at the end) tableoutput(1,1,options); } else { //create entry for boolean table (at the end) tableoutput(0,1,options); } if( !(i%4) ) verbose_msg(".", options); #ifdef DEBUG cerr << "\ncore.cc [core]: b_result[" << i << "]=" << b_result[i]; #endif } } /****************** * optimize table * ******************/ if( high+1 == help ) { optimize=1; verbose_msg("\nrecalculating...", options); invert_array(b_result,help); high = help - high; } /* if( high > (help/2) ) { optimize=1; verbose_msg("\nrecalculating...", options); invert_array(b_result,help); high = help - high; } */ /****************** * set LOW, HIGH * ******************/ #ifdef DEBUG cerr << "\ncore.cc [core]: analyse process finished!"; cerr << "\ncore.cc [core]: number of true comb's: " << high << "; num_vars="; cerr << (unsigned short)num_vars << "; product=" << high*num_vars << ";" << endl; #endif //create boolean array to compare //lh = new BOOL[(high+1)*num_vars]; lh = new BOOL[high*num_vars]; index=0; //Status verbose_msg("\npreparing for comparison...", options); //loop for (number of possibilties) for(i=0;i