Ignore:
Timestamp:
Feb 18, 2017, 4:13:44 PM (2 years ago)
Author:
nmedfort
Message:

Continued work on parenthesis matching; addition of Pablo ScanTo? and AdvanceThenScanTo/Thru? statements. Bug fix for Pablo Compiler for escaping variables.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/kernels/alignedprint.cpp

    r5326 r5329  
    1818}
    1919
    20 inline void p2s(IDISA::IDISA_Builder * iBuilder, Value * p[], Value * s[]) {
     20void p2s(IDISA::IDISA_Builder * iBuilder, Value * p[], Value * s[]) {
    2121    Value * bit00004444[2];
    2222    Value * bit22226666[2];
     
    8585}
    8686
    87 PrintableBits::PrintableBits(IDISA::IDISA_Builder * builder)
    88 : BlockOrientedKernel(builder, "PrintableBits", {Binding{builder->getStreamSetTy(1, 1), "bitStream"}}, {Binding{builder->getStreamSetTy(1, 8), "byteStream"}}, {}, {}, {})
    89 {
    90     setNoTerminateAttribute(true);
    91     setDoBlockUpdatesProducedItemCountsAttribute(false);
    92 
    93 }
    94 
    95 SelectStream::SelectStream(IDISA::IDISA_Builder * builder, unsigned sizeInputStreamSet, unsigned streamIndex)
    96 : BlockOrientedKernel(builder, "SelectStream", {Binding{builder->getStreamSetTy(sizeInputStreamSet, 1), "bitStreams"}}, {Binding{builder->getStreamSetTy(1, 1), "bitStream"}}, {}, {}, {}), mSizeInputStreamSet(sizeInputStreamSet), mStreamIndex(streamIndex)
    97 {
    98     setNoTerminateAttribute(true);
    99     setDoBlockUpdatesProducedItemCountsAttribute(false);
    100 
    101 }
    102 
    10387void SelectStream::generateDoBlockMethod() {
    10488    if (mStreamIndex >= mSizeInputStreamSet)
     
    10993    storeOutputStreamBlock("bitStream", iBuilder->getInt32(0), bitStrmVal);
    11094}
     95
     96void PrintableStreamSet::generateDoBlockMethod() {
     97
     98    /*
     99    00110001 is the Unicode codepoint for '1' and 00101110 is the codepoint for '.'.
     100    We want to output a byte stream that is aligned with the input bitstream such that it contains 00110001 in each 1 position and 00101110 in each 0 position.
     101
     102    For example, consider input bitstream 101. Our desired output is:
     103    00110001 00101110 00110001
     104
     105    We can do the bitstream to bytestream conversion in parallel by viewing the output stream in terms of parallel bit streams.
     106
     107    0   0   0 -> First bit position of every byte is all zeros
     108    0   0   0 -> Same for second bit
     109    1   1   1 -> Third bit is all ones
     110    1   0   1 -> 4th bit is 1 for a '1' byte and '0' for a zero byte. Matches input bit stream
     111    0   1   0 -> opposite
     112    0   1   0 -> opposite
     113    0   1   0 -> opposite
     114    1   0   1 -> same as 4th bit position.
     115
     116    Armed with the above we can do the bit->byte conversion all at once
     117    rather than byte at a time! That's what we do below.
     118    */
     119
     120    BasicBlock * entry = iBuilder->GetInsertBlock();
     121    BasicBlock * cond = CreateBasicBlock("cond");
     122    BasicBlock * body = CreateBasicBlock("body");
     123    BasicBlock * exit = CreateBasicBlock("exit");
     124
     125    Value * count = getInputStreamSetCount("bitStream");
     126    iBuilder->CreateBr(cond);
     127    iBuilder->SetInsertPoint(cond);
     128    PHINode * i = iBuilder->CreatePHI(iBuilder->getSizeTy(), 2, "i");
     129    i->addIncoming(iBuilder->getSize(0), entry);
     130
     131    iBuilder->CreateCondBr(iBuilder->CreateICmpNE(i, count), body, exit);
     132    iBuilder->SetInsertPoint(body);
     133    // Load current block
     134    Value * bitStrmVal = loadInputStreamBlock("bitStream", i);
     135
     136    Value * bits[8];
     137
     138    bits[0] = ConstantInt::getNullValue(iBuilder->getBitBlockType());
     139    bits[1] = ConstantInt::getNullValue(iBuilder->getBitBlockType());
     140    bits[2] = ConstantInt::getAllOnesValue(iBuilder->getBitBlockType());
     141    bits[3] = bitStrmVal;
     142    Value * negBitStrmVal = iBuilder->simd_not(bitStrmVal);
     143    bits[4] = negBitStrmVal;
     144    bits[5] = negBitStrmVal;
     145    bits[6] = negBitStrmVal;
     146    bits[7] = bitStrmVal;
     147
     148    // Reassemble the paralell bit streams into a byte stream
     149    Value * printableBytes[8];
     150    p2s(iBuilder, bits, printableBytes);
     151    for (unsigned j = 0; j < 8; ++j) {
     152        storeOutputStreamPack("byteStream", i, iBuilder->getInt32(j), iBuilder->bitCast(printableBytes[j]));
     153    }
     154
     155    i->addIncoming(iBuilder->CreateAdd(i, iBuilder->getSize(1)), iBuilder->GetInsertBlock());
     156    iBuilder->CreateBr(cond);
     157
     158    iBuilder->SetInsertPoint(exit);
    111159}
     160
     161PrintableBits::PrintableBits(IDISA::IDISA_Builder * builder)
     162: BlockOrientedKernel(builder, "PrintableBits", {Binding{builder->getStreamSetTy(1), "bitStream"}}, {Binding{builder->getStreamSetTy(1, 8), "byteStream"}}, {}, {}, {})
     163{
     164    setNoTerminateAttribute(true);
     165    setDoBlockUpdatesProducedItemCountsAttribute(false);
     166}
     167
     168SelectStream::SelectStream(IDISA::IDISA_Builder * builder, unsigned sizeInputStreamSet, unsigned streamIndex)
     169: BlockOrientedKernel(builder, "SelectStream", {Binding{builder->getStreamSetTy(sizeInputStreamSet), "bitStreams"}}, {Binding{builder->getStreamSetTy(1, 1), "bitStream"}}, {}, {}, {}), mSizeInputStreamSet(sizeInputStreamSet), mStreamIndex(streamIndex)
     170{
     171    setNoTerminateAttribute(true);
     172    setDoBlockUpdatesProducedItemCountsAttribute(false);
     173
     174}
     175
     176PrintableStreamSet::PrintableStreamSet(IDISA::IDISA_Builder * builder)
     177: BlockOrientedKernel(builder, "PrintableStreamSet", {Binding{builder->getStreamSetTy(0), "bitStream"}}, {Binding{builder->getStreamSetTy(0, 8), "byteStream"}}, {}, {}, {}) {
     178    setNoTerminateAttribute(true);
     179    setDoBlockUpdatesProducedItemCountsAttribute(false);
     180}
     181
     182
     183
     184}
Note: See TracChangeset for help on using the changeset viewer.