File: core.cc

package info (click to toggle)
qmc 0.94-4.1
  • links: PTS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 216 kB
  • sloc: cpp: 1,187; tcl: 223; makefile: 15
file content (442 lines) | stat: -rw-r--r-- 10,264 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
/*  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 <cqmc>
#include <iostream>
#include <cstring>
#include <ctime>
#include <vector>

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 " <<strlen(expression_buffer) << endl;
  #endif

  if( options & INTERACTIVE )
  {
    //get input (string)
    cout << "enter expression: " << flush;
    cin >> 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<num_vars;i++)
    {
      BO_var[i].setid(vars[i]);

      #ifdef DEBUG
        cerr << BO_var[i].getid() << ',';
      #endif
    }

    //Status
    verbose_msg("\nvariables assigned...", options);

    /***********
     * analyse *
     ***********/

    expr_length = (unsigned char)strlen(expression_buffer);


    #ifdef DEBUG
      cerr << "\ncore.cc [core]: input_buffer[" << expression_buffer;
      cerr << "], strlen " << strlen(expression_buffer) << "; num_vars=";
      cerr << (unsigned short)num_vars <<"; expr_length=";
      cerr << (unsigned short)expr_length << ";" << endl;
    #endif


    //number of possible combinations
    //help=pow((unsigned short)2,(unsigned short)num_vars);
    help = dual_pow( num_vars );

    //create boolean array
    b_result = new bool[help];

    #ifdef DEBUG
      cerr << "\ncore.cc [core]: number of comb's=" << help << "; verfication: " << endl;
    #endif

    //set level (leayer) to zero
    high=0;

    //create output header for boolean table
    tableheadoutput(BO_var, num_vars, options);

    verbose_msg("\nstarting analyse function", options);

    //start analyse function 2^num_vars times
    //and write the result into the table
    for(i=0;i<help;i++)
    {
      #ifdef DEBUG
        cerr << "\ncore.cc [core]: transfering combination <";
      #endif

      temp=i;

      for(j=0;j<num_vars;j++)
      {
        //code inside loop should be changed
        #ifdef DEBUG
          cerr << '.';
        #endif

        //set 0,1
        BO_var[j].setvalue(temp%2);

        #ifdef DEBUG
          cerr << BO_var[j].value();
        #endif

        //create entry for boolean table
        tableoutput(BO_var[j].value(),0,options);

        temp/=2;

      }

      #ifdef DEBUG
        cerr << ">";
      #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<help;i++)
  {
    if(b_result[i]==1)
    {
      temp=i;

      for(j=0;j<num_vars;j++)
      {
        //set 1,0
        lh[index*num_vars+j].setvalue(temp%2);
        lh[index*num_vars+j].setid('#');
        temp/=2;
      }

      index++;
    }
  }


  #ifdef DEBUG
    cerr << "\ncore.cc [core]: results transfered to boolean objects - running check..." << endl;

    for(i=0; i < high; i++)
    {

      cerr << "content LH [";

      for(j=0; j < num_vars; j++) cerr << lh[j+i*num_vars].getid() << lh[j+i*num_vars].value();

      cerr << "] ";
      if ( !( (i+1)%4 ) ) cerr << endl;
    }
  #endif


  /************
   * compare *
   ************/

  //status
  verbose_msg("\nrunning comparison...\n", options);

  #ifdef DEBUG
    cerr << "\n\ncore.cc [core]: calling compare function..." << endl;
  #endif

  //start compare function
  if((lh=(BOOL *)compare(lh,num_vars,high,options))==0x00)
  {
    return(-1);
  }

  #ifdef DEBUG
    cerr << "\ncore.cc [core]: compare function finished without errors";
    cerr << "\ncore.cc [core]: creating minimized output..." << endl;
  #endif

  /****************************
   * create simple expression *
   ****************************/

  //create char array (string)
  //not sure about the correct size...
  simple_expression_buffer = new char[high*num_vars*3];

  //status
  verbose_msg("\ngenerating output string...\n", options);

  //create simple expression_buffer (string)
  create_result(BO_var,lh,num_vars,high,simple_expression_buffer, optimize,options);

  #ifdef DEBUG
    cerr << "\ncore.cc [core]: output_buffer generated - all done" << endl << endl;
  #endif

  /**********
   * Output *
   **********/

   //stop timer
  stop_time = clock();

  if( options & TIMER )
    cout << "used time: " << (double)( stop_time - start_time ) / CLOCKS_PER_SEC << "sec" << endl;

  if( options & HTML_OUTPUT)
  {
    tabletailoutput(simple_expression_buffer);
  }
  else
  {
    cout << "result: " << simple_expression_buffer << endl;
  }

  return 0;
}