source: proto/PDF/pablo_template_pdf.cpp @ 2560

Last change on this file since 2560 was 2560, checked in by ksherdy, 7 years ago

Updated PDF demo to the point of g++ compile without compiler errors.

File size: 6.3 KB
Line 
1#include <stdio.h>
2#include <stdlib.h>
3#include <errno.h>
4#include <sys/types.h>
5#include <sys/stat.h>
6
7#define LocalCarryDeclare(name, count)\
8CarryArray<count, 0> name;\
9
10#include <simd-lib/bitblock.hpp>
11#include <simd-lib/carryQ.hpp>
12#include <simd-lib/bitblock_iterator.hpp>
13#include <simd-lib/s2p.hpp>
14#include <perflib/perfsec.h>
15
16// Define the mappings for pablo.assert_0(strm, errkind) statements which
17// compile to the the form assert_0_error(errkind, strm)
18#define assert_0_error(errkind, errstrm) error_tracker.NoteError(errkind, errstrm);
19
20#ifdef BUFFER_PROFILING
21    BOM_Table * parser_timer;
22#elif PAPI
23                #define PAPI_EVENTS_COUNT 2
24                int PAPI_EVENTS[PAPI_EVENTS_COUNT] = {PAPI_TOT_CYC, PAPI_BR_MSP};       
25    CC * parser_timer;
26#else
27    void * parser_timer;
28#endif
29
30BitBlock EOF_mask = simd<1>::constant<1>();
31
32//////////////////////////////////////////////////////////////////////////////////////////
33// Buffer Management
34//////////////////////////////////////////////////////////////////////////////////////////
35#define PADDING_BLOCKS 1
36#define PADDING_SIZE (BLOCK_SIZE * PADDING_BLOCKS)
37#define COPYBACK_BLOCKS 0
38#define COPYBACK_SIZE (BLOCK_SIZE * COPYBACK_BLOCKS)
39#define LOOKAHEAD_BLOCKS 1
40#define LOOKAHEAD_SIZE (BLOCK_SIZE * LOOKAHEAD_BLOCKS)
41#define SEGMENT_BLOCKS  12
42#define SEGMENT_SIZE (BLOCK_SIZE * SEGMENT_BLOCKS)
43#define BUFFER_SIZE (COPYBACK_SIZE + SEGMENT_SIZE + LOOKAHEAD_SIZE + PADDING_SIZE)
44
45//////////////////////////////////////////////////////////////////////////////////////////
46// @ global depends on 'error_tracker' and 'EOF_mask' definitions.
47//////////////////////////////////////////////////////////////////////////////////////////
48@global
49
50//////////////////////////////////////////////////////////////////////////////////////////
51// Headers that depend @ global stream struct types.
52//////////////////////////////////////////////////////////////////////////////////////////
53#include <transpose.hpp>
54//#include <post_process.hpp>
55
56static void do_process(FILE *infile, FILE *outfile);
57
58int main(int argc, char * argv[]) {
59
60        char * infilename, * outfilename;
61        FILE *infile, *outfile;
62        struct stat fileinfo;
63
64        if (argc < 2) {
65                printf("Usage: %s <filename> [<outputfile>]\n", argv[0]);
66                exit(-1);
67        }
68
69        infilename = argv[1];
70        stat(infilename, &fileinfo);
71        infile = fopen(infilename, "rb");
72        if (!infile) {
73                fprintf(stderr, "Error: cannot open %s for input.\n", infilename);
74                exit(-1);
75        }
76
77        if (argc < 3) outfile = stdout;
78        else {
79                outfilename = argv[2];
80                outfile = fopen(outfilename, "wb");
81                if (!outfile) {
82                        fprintf(stderr, "Error: cannot open %s for writing.\n", outfilename);
83                        exit(-1);
84                }
85        }
86
87        PERF_SEC_BIND(1);
88
89        PERF_SEC_INIT(parser_timer);
90
91        do_process(infile, outfile);
92
93        PERF_SEC_DUMP(parser_timer);
94
95        PERF_SEC_DESTROY(parser_timer);
96
97        fclose(infile);
98        fclose(outfile);
99
100        return(0);
101}
102
103void do_process(FILE *infile, FILE *outfile) {
104        @decl
105
106        /* Extras */
107
108        parity.odd = simd<2>::constant<1>();
109        parity.even = simd<2>::constant<2>();
110
111        int block_base=0;
112        int block_pos = 0;
113        int buffer_base=0;
114        int buffer_pos = 0;
115        int chars_avail = 0;
116        int chars_read = 0;
117
118        //////////////////////////////////////////////////////////////////////////////////////////
119        // Buffer Management
120        //////////////////////////////////////////////////////////////////////////////////////////
121
122        #include <simd-lib/buffer.hpp>
123
124        uint8_t * src_buffer;
125        ALLOC_STATIC_ALIGNED_BYTE_BUFFER(src_buffer, BUFFER_SIZE);
126   
127        //////////////////////////////////////////////////////////////////////////////////////////
128        // Initial file read
129        //////////////////////////////////////////////////////////////////////////////////////////
130        chars_read = fread((void *)src_buffer, 1, SEGMENT_SIZE, infile);
131        chars_avail = chars_read;
132
133        //////////////////////////////////////////////////////////////////////////////////////////
134        // Read OVERLAP bytes to support post processing validation lookahead.
135        //
136        // For example, true, false, null marked that overlap end of the segment.
137        //
138        //////////////////////////////////////////////////////////////////////////////////////////
139        chars_read = chars_avail + fread(&src_buffer[chars_avail], 1, PADDING_SIZE, infile);
140        chars_avail = chars_read;
141        if (chars_avail >= SEGMENT_SIZE) chars_avail = SEGMENT_SIZE;
142
143        @stream_stmts
144
145        //////////////////////////////////////////////////////////////////////////////////////////
146        // Processs Full Segments
147        //////////////////////////////////////////////////////////////////////////////////////////
148        while (chars_avail >= SEGMENT_SIZE) {
149          PERF_SEC_START(parser_timer);
150          for (int blk = 0; blk < SEGMENT_BLOCKS; blk++) {
151                  block_base = blk*BLOCK_SIZE;
152                  s2p_do_block((BytePack *) &src_buffer[block_base], basis_bits);
153
154                  @block_stmts
155
156                  //postprocess_do_block(lex, ctCDPI_Callouts, ref_Callouts, check_streams, (char *)src_buffer, buffer_base, block_base,chars_avail, tracker);
157
158          }
159          PERF_SEC_END(parser_timer, chars_avail);
160
161          memmove(src_buffer, &src_buffer[SEGMENT_SIZE], PADDING_SIZE); 
162          chars_read = fread(&src_buffer[PADDING_SIZE], 1, SEGMENT_SIZE, infile);// + LOOKAHEAD_SIZE; ??????
163          chars_avail = chars_read;
164          if (chars_avail >= SEGMENT_SIZE) chars_avail = SEGMENT_SIZE;
165          buffer_pos += chars_avail;
166          buffer_base = buffer_pos;
167        }
168
169        //////////////////////////////////////////////////////////////////////////////////////////
170        // Final Partial Segment
171        //////////////////////////////////////////////////////////////////////////////////////////
172        PERF_SEC_START(parser_timer);
173
174        block_pos = 0;
175        int remaining = chars_avail;
176
177        /* Full Blocks */
178        uint32_t blk = 0;
179        while (remaining >= BLOCK_SIZE) {
180                  block_base = block_pos;
181                  s2p_do_block((BytePack *) &src_buffer[block_pos], basis_bits);
182                  @block_stmts
183
184//                postprocess_do_block(lex, ctCDPI_Callouts, ref_Callouts, check_streams, (char *)src_buffer, buffer_base, block_base, chars_avail, tracker);
185                  block_pos += BLOCK_SIZE;
186                  remaining -= BLOCK_SIZE;
187                  blk++;
188        }
189        block_base = block_pos;
190
191        /* Partial Block or Any Carry */
192        if (remaining > 0 || @any_carry) {
193                  EOF_mask = bitblock::srl(simd<1>::constant<1>(), convert(BLOCK_SIZE-remaining));
194                  s2p_do_final_block((BytePack *) &src_buffer[block_pos], basis_bits, EOF_mask);
195                  @final_block_stmts
196
197//                postprocess_do_block(lex, ctCDPI_Callouts, ref_Callouts, check_streams, (char *)src_buffer, buffer_base, block_base, chars_avail, tracker);
198                  blk++;
199        }
200
201        buffer_pos += chars_avail;
202        buffer_base = buffer_pos;
203
204        PERF_SEC_END(parser_timer, chars_avail);
205}
206
Note: See TracBrowser for help on using the repository browser.