
function est() {
}

function init(number) {
    if (document.getElementById("idFIFO") != null) {
        var val = document.getElementById("idFIFO").selectedIndex;
        //    alert(val);
        widthChange();
        nChange();   
        document.getElementById("idFIFO").options[val].selected = 1;
        est();
    }
}

function newWindow(url, name) {
    var newWindow;
    newWindow = open(url, name, "resizable, scrollbars, height = 250, width = 450")
}

function newWindowBig(url, name) {
    var newWindow;
    newWindow = open(url, name, "resizable, scrollbars, height = 400, width = 752")
}

function resetText() {
    document.getElementById("tRange").innerHTML = "2&ndash;16";
    document.getElementById("pRange").innerHTML = "1&ndash;32";
//    document.getElementById("tBRAMS").innerHTML = "1 BRAM used";
    document.getElementById("fRange").innerHTML = "2&ndash;32";
    document.getElementById("idN").options[4].selected = 1;
    document.getElementById("idWidth").options[5].selected = 1;
    document.getElementById("idP").options[0].selected = 1;
    document.getElementById("idTwiddle").options[0].selected = 1;
    widthChange();
    nChange();

}


function nChange() {
    updateP();
    updateFIFO();
    est();
}

function widthChange() {
    updateTWidth();
    updateFIFO();
    est();
}


function pChange() {
    updateFIFO();
    est();
}

function updateTWidth() {
    
    var p = document.getElementById("idP").value;
    var width_index = document.getElementById("idWidth").selectedIndex;

    var twSelect = document.getElementById("idTWidth");

    //if width is decreasing, get rid of twiddleWidth values > width
      var count=0;
    for (i=twSelect.options.length; i>width_index+2; i--) {
        if (twSelect.options[i] != null) {
            if (twSelect.options[i].selected == true)
              count++;
        }
        twSelect.options[i] = null;
        
    }

    var length = twSelect.options.length;
    var length2 = length;

    if (count != 0)
      twSelect.options[length-1].selected=true;


    var foo=(twSelect.options[length-1].value);
    var foo2= foo-0;
    foo2 = foo2+2;

    for (i=foo2; i<=(document.getElementById("idWidth").value); i=i+2) {
        twSelect.options[length2] = new Option(i, i);
        length2++;
    }

    // update twiddle width range
      text = "2&ndash;";
    text = text + (i-2);
    document.getElementById("tRange").innerHTML = text;

}

function updateFIFO() {

    var p = document.getElementById("idP").value;
    var n = document.getElementById("idN").value;
    
    var width = document.getElementById("idWidth").value;

    fifoSelect = document.getElementById("idFIFO");

    // Clear FIFO select values
      var count = 0;
    for (i=fifoSelect.options.length; i >= 0; i--) 
      fifoSelect.options[i] = null;   

    var length = 0;

    // add new FIFO values  
      for (i=2; i <= n/(2*p); i=i*2) {
//          var txt = i + " (" + getbramFIFO(i) + ", " + slicesAllFIFOS(2*width, i, n, p) + ")";
        var txt = i;
          fifoSelect.options[length] = new Option(txt,i);
          length++;
      }
    
    // if p == n/2, we have no FIFOs at all
      if (p == (n/2)) {
          fifoSelect.options[fifoSelect.options.length] = new Option("No FIFOs used", 1);
          text = "No FIFOs used";
          fifoSelect.options[fifoSelect.options.length-1].selected = 1;
      }
      else {
          text = "2&ndash;";
          text = text + (i/2);
      }
    
    document.getElementById("fRange").innerHTML = text;
    
}

function updateP() {

    n_index = document.getElementById("idN").selectedIndex;
    n = document.getElementById("idN").value;

    //  alert(n_index);
    //  alert(n);

    pSelect = document.getElementById("idP");
    var count=0;

    // if n is decreasing, get rid of p values > n/2
      for (i=pSelect.options.length; i>n_index+1; i--) {
          if (pSelect.options[i] != null) {
              if (pSelect.options[i].selected == true)
                count++;
          }
          pSelect.options[i] = null;
      }
    
    var length = pSelect.options.length;        
    var length2 = length; 

    // if the previously-selected p value cannot be selected due to a change in n,
    // select the largest p possible for this n size.
      if (count != 0)
        pSelect.options[length-1].selected=true;

    // if n is increasing, add p values <= n/2
      for (i=(pSelect.options[length-1].value)*2; i<=n/2; i=i*2) {
          pSelect.options[length2] = new Option(i, i);
          length2++;
      }

    // write range of p
      var text = "1&ndash;";
    text = text + (i/2);
    document.getElementById("pRange").innerHTML = text;

}

function getbramFIFO(thresh) {
    var i=4;
    var n = document.getElementById("idN").value;
    var p = document.getElementById("idP").value;
    var totBRAMS = 0;
    var w = document.getElementById("idWidth").value;
    if (w <= 8)
      w = 8;
    else if (w <= 16)
      w = 16;
    else if (w <= 32)
      w = 32;   

    var totBRAMS = 0;
    for (i=4; i <= n/p; i=i*2) {
        totBRAMS += sizeFIFO(thresh, i, w);
    }

    return totBRAMS*p;
}

function bramFIFO() {
    var thresh = document.getElementById("idFIFO").value;

        var i=4;
        var n = document.getElementById("idN").value;
        var p = document.getElementById("idP").value;
        var totBRAMS = 0;
        var w = document.getElementById("idWidth").value;
        if (w <= 8)
          w = 8;
        else if (w <= 16)
          w = 16;
        else if (w <= 32)
          w = 32;   

        var totBRAMS = 0;
        for (i=4; i <= n/p; i=i*2) {
            totBRAMS += sizeFIFO(thresh, i, w);
        }

}

function sizeFIFO(thresh, m, width) {
    var usage, temp_size;

    if (m/4 >= thresh) {
        usage = m/4;        
        usage = 2*numBRAMS_FIFO(usage, width);
        if (2*width == 64)
          usage *= 2;
        return usage;
    }
    else {
        return 0;
    }
}

function numBRAMS_FIFO(size, width) {
    if (2*width == 16) {
        var t = size/1024;
        if (size <= 512) {
            return Math.ceil(t);
        }
        else {
            return 2*Math.ceil(t);
        }
    }
    else if (2*width == 32 || 2*width == 64) {
        t = size/512;
        return Math.ceil(t);
    }
}

function calcTwiddleROMS() {
    if (document.getElementById("idTwiddle").value == 0)
      var numb = 0;

    else {
        var size = findROMSize();

        twidth = document.getElementById("idTWidth").value;
        
        if (twidth <= 8)
          twidth = 8;
        else if (twidth <= 16)
          twidth = 16;
        else
          twidth = 32;

        var numb = numBRAMs(size, twidth);
        numb = numb * document.getElementById("idP").value;
    }

    if (numb == 1)
      var text = "1 BRAM used";
    else
      var text = numb + " BRAMs used";
    
    document.getElementById("tBRAMS").innerHTML = text;
}

function findROMSize() {
    var n = document.getElementById("idN").value;
    var p = document.getElementById("idP").value;
    var romSize;
    var logN = Math.log(n) / Math.LN2;

    //update the number of block RAMs used by twiddles  
      if (p > logN) {
          romSize = n*logN/(2*p);   
          romSize = Math.log(romSize) / Math.LN2;
          romSize = Math.ceil(romSize);
          romSize = Math.pow(2, romSize);
          return romSize;
      }
      else 
        return n/2;        
}

function numBRAMs(size, width) {
    var counter = 0;
    var temp, t;

    if (width == 8) {
        t = size/2048;
        if (size <= 1024)
          return Math.ceil(t);
        else
          return Math.ceil(t)*2;
    }

    else if (width == 16) {
        t = size/1024;
        if (size <= 512)
          return Math.ceil(t);
        else
          return Math.ceil(t)*2;
    }

    else if (width == 32) {
        t = size/512;
        if (size <= 256)
          return Math.ceil(t);
        else
          return Math.ceil(t)*2;
    }
}

function slices_FIFO(width, depth) {
    if (depth <= 32)
      return width;
    else {
        var temp = Math.log(depth)/Math.LN2;
        temp = Math.ceil(temp);
        temp -= 4;
        temp = Math.pow(2, temp);
        return temp*width;
    }
}

function slicesAllFIFOS(width, threshold, n, p) {
    var m;
    var slices = 0;
    for (m = 4; m <= n/p; m = m*2) {
        var depth = m/4;        
        if (depth < threshold) {
            slices += 2*slices_FIFO(width, depth);
        }
    }

    return slices;
}

function go() {
    var n = document.getElementById("idN").value;
    var w = document.getElementById("idWidth").value;
    var t = document.getElementById("idTWidth").value;
    var scale = document.getElementById("idScale").value;
    var p = document.getElementById("idP").value;
    var control = document.getElementById("idControl").value;
    var twid = document.getElementById("idTwiddle").value;
    var fifo = document.getElementById("idFIFO").value;
    var permute = document.getElementById("idPermute").value;
    newwindow = window.open('http://www.ece.cmu.edu/~pam/dctgen/gen.php?idN='+n
		+ '&idP='+p
		+ '&idWidth='+w
		+ '&idTWidth='+t
		+ '&idScale='+scale
		+ '&idPermute='+permute
		+ '&idControl='+control
		+ '&idP='+p
		+ '&idTwiddle='+twid
		+ '&idFIFO='+fifo,
	'gen', "resizable, scrollbars, height = 350, width = 450");
    if (window.focus) {
	newwindow.focus();
    }
}