OpenCores
URL https://opencores.org/ocsvn/bluespec_md6/bluespec_md6/trunk

Subversion Repositories bluespec_md6

[/] [bluespec_md6/] [trunk/] [MD6Control/] [test/] [encodeBits.c] - Rev 7

Compare with Previous | Blame | View Log

#include<stdlib.h>
#include<stdio.h>
#include<sys/stat.h>
#include<assert.h>
#include<endian.h>
#include"encodeBits.h"
#include"md6.h"
 
 
const int requiredWordCount = 1<<20;
 
 
 
// reads the first bits bits out of the file 
void md6_file(char *filename, 
              char *outinput, 
              char *outresult,
              char *outsize,
               long long bits)
 
{
  FILE *inFile = fopen (filename, "rb");
  FILE *outInput = fopen (outinput, "wb"); 
  FILE *outResult = fopen (outresult, "wb");
  FILE *outSize = fopen (outsize, "wb"); 
  md6_state st;
  uint64_t bytes;
  long long bitCounter = bits;
  unsigned char data[1024];
  int err,i,j,wordCount=0;
  long long bitMin;
 
  md6_word key[md6_k];
 
  printf("Bits: %d\n", bits);
 
  for(i=0;i<md6_k;i++) {
    key[i]=0;
  }
 
  if (inFile == NULL) {
    printf ("%s can't be opened.\n", filename);
  }
 
 
  // Use this instead!
  //  md6_full_init(st,d,NULL,0,md6_default_L,md6_default_r)
  // It is legit to have fewer bytes in the key - should add this option to the HW.
  // Perhaps may want to make 512 a parameter to this function
  if (err=md6_full_init(&st,512,(char*)key,md6_k*8,md6_default_L,md6_default_r(512))) {
      printf("Error code: %d\n",err);
  }
 
  wordCount = 0;
  while ((bytes = fread (data, 1, md6_w/8, inFile)) != 0){
    char wordBuf[md6_w/8];
    int i;
 
 
    //Only swap if this word is full. otherwise, we'll screw up the
    //last byte
    for( i = 0; i < md6_w/8; i++) {
      /*  if((BYTE_ORDER == LITTLE_ENDIAN) && (bitCounter >= md6_w)) {
          wordBuf[i] = data[md6_w/8-i-1];
        }
        else{*/
          wordBuf[i] = data[i];
     }
 
 
 
    // md6_update border case uses wrong endianess
    // we may cross a bit boundary here.  In this case we want min of 
    // bitCounter/bytes*8
    bitMin = (bitCounter<bytes*8)?bitCounter:bytes*8;
    if ((err=md6_update(&st, wordBuf, bitMin))) {
      printf("Error code: %d\n",err);
    }
    wordCount++;
    bitCounter -= bitMin; 
    if((bytes != md6_w/8) || (bitCounter <= 0)) {
      break;
    }
  }
  // swap the last guy specially
  //XXX assert something about bitCounter here
  printf("bytes: %d, bits: %d, bitCounter: %d", bytes, bits, bitCounter);
  assert(bitCounter == 0);
 
 
  if ((err=md6_final(&st,NULL))) {
      printf("Error code: %d\n",err);
  } else {
    printf("\nCalled md6_final\n");
  }
 
  //Wind back
  rewind(inFile);
 
  for(i=0;i<md6_n;i++) {
    data[i]=0;
  }
 
  wordCount = 0;
  while ((bytes = fread (data, 1,md6_w/8, inFile))){
    char wordBuf[md6_w/8];        
    int i;
 
    // Bluespec is big endian
    // Really we should make the C code also big endian.
    // This has to do with zero padding in the controller.  
    // If we fail to feed the right values, we'll basically die.
    for( i = 0; i < md6_w/8; i++) {
      if(BYTE_ORDER == LITTLE_ENDIAN) {
        wordBuf[i] = data[md6_w/8-i-1];
      }
      else{
        wordBuf[i] = data[i];
      }
    }
 
 
    fprintf(outInput,PR_MD6_WORD "\n", *((md6_word*)wordBuf));       
    printf("Got %d bytes\n", bytes);
    wordCount+=bytes;
    if(bytes < (md6_w/8)) {
      break;
    }
    for(i=0;i<md6_n;i++) {
      data[i]=0;
    }
  }
 
  fprintf(outSize,"%x\n%x\n%x\n%x\n",bits,bits,bits,bits);
 
  for(; wordCount < requiredWordCount; wordCount++) {
    fprintf(outInput,PR_MD6_WORD "\n", 0);       
  }
 
  printf("Hashval: %s\n", st.hexhashval);
  for (j = 0;j<md6_c;j++) {
    char wordBuf[md6_w/8];
    int i;
 
    // Bluespec is big endian
    // XXX this code is not deployed
    for( i = 0; i < md6_w/8; i++) {
      if(BYTE_ORDER != BIG_ENDIAN) {
        wordBuf[i] = st.hashval[j*md6_w/8+(md6_w/8-i-1)];
      }
      else{
        wordBuf[i] = st.hashval[j*md6_w/8+i];
      }
    }
 
    fprintf(outResult,PR_MD6_WORD "\n",*((md6_word*)wordBuf));
  }
 
  fclose (inFile);
  fclose (outInput);
  fclose (outResult);
  fclose (outSize);
}
 
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.