package org.cellocad.MIT.misc;
/**
* Created by Bryan Der on 7/13/15.
*/
import org.cellocad.MIT.dnacompiler.*;
import org.cellocad.adaptors.ucfadaptor.UCFAdaptor;
import org.cellocad.adaptors.ucfadaptor.UCFReader;
import java.util.HashMap;
public class SNR {
public static void main(String[] args) {
Args _options = new Args();
_options.set_UCFfilepath( _options.get_home() + "/resources/UCF/Eco1C1G1T1.UCF.json" );
_options.set_histogram( false );
GateLibrary gate_library = new GateLibrary(0, 0);
PartLibrary part_library = new PartLibrary();
UCFAdaptor ucf_adaptor = new UCFAdaptor();
UCFReader ucf_reader = new UCFReader();
UCF ucf = ucf_reader.readAllCollections(_options.get_UCFfilepath());
Integer STEPS = 100;
Double MAX = 50.0;
Double MIN = 0.001;
Double LOGMAX = Math.log10(MAX);
Double LOGMIN = Math.log10(MIN);
Double LOGINC = (LOGMAX - LOGMIN) / STEPS;
for(Gate g: gate_library.get_GATES_BY_NAME().values()) {
String filename = "rpu_triangle_" + g.Name + ".txt";
Util.fileWriter(_options.get_home() + "/src/test/resources/"+filename, "", false);
Integer snr_score = 0;
for (int i = 0; i < STEPS - 1; ++i) {
for (int j = i + 1; j < STEPS; ++j) {
Double log_rpu_low = LOGMIN + i * LOGINC;
Double rpu_low = Math.pow(10, log_rpu_low);
Double log_rpu_high = LOGMIN + j * LOGINC;
Double rpu_high = Math.pow(10, log_rpu_high);
HashMap<String, Double> low_x = new HashMap<>();
low_x.put("x", rpu_low);
HashMap<String, Double> high_x = new HashMap<>();
high_x.put("x", rpu_high);
Double out_high = ResponseFunction.computeOutput(low_x, g.get_params(), g.get_equation());
Double out_low = ResponseFunction.computeOutput(high_x, g.get_params(), g.get_equation());
Double out_snr = 20 * Math.log10((Math.log10(out_high / out_low)) / (2 * Math.log10(3.2)));
Double in_snr = 20 * Math.log10((Math.log10(rpu_high / rpu_low)) / (2 * Math.log10(3.2)));
Double d_snr = out_snr - in_snr;
String out = rpu_low + " " + rpu_high + " " + d_snr + "\n";
Util.fileWriter(_options.get_home() + "/src/test/resources/"+filename, out, true);
if(d_snr > 0) {
snr_score++;
}
}
}
Double on_off_ratio = g.get_params().get("ymax") / g.get_params().get("ymin");
Double n = g.get_params().get("n");
Double ratio_n = on_off_ratio * n;
System.out.println(g.Name + " dsnr_score: " + snr_score + " " + on_off_ratio + " " + n + " " + ratio_n);
}
}
}