Add outputting a pll configuration to a file

Signed-off-by: Michael Nolan <mtnolan2640@gmail.com>
diff --git a/libtrellis/tools/ecppll.cpp b/libtrellis/tools/ecppll.cpp
index f730449..d201ab6 100644
--- a/libtrellis/tools/ecppll.cpp
+++ b/libtrellis/tools/ecppll.cpp
@@ -50,6 +50,7 @@
 };
 
 pll_params calc_pll_params(float input, float output);
+void write_pll_config(pll_params params, const char* name, FILE* file);
 
 int main(int argc, char** argv){
   namespace po = boost::program_options;
@@ -58,6 +59,7 @@
   options.add_options()("help,h", "show help");
   options.add_options()("input,i", po::value<float>()->required(), "Input frequency in MHz");
   options.add_options()("output,o", po::value<float>()->required(), "Output frequency in MHz");
+  options.add_options()("file,f", po::value<string>(), "Output to file");
 
   po::variables_map vm;
   po::parsed_options parsed = po::command_line_parser(argc, argv).options(options).run();
@@ -92,6 +94,18 @@
   fprintf(stdout, "Output divisor: %d\n", params.output_div);
   fprintf(stdout, "VCO frequency: %f\n", params.fvco);
   fprintf(stdout, "Output frequency: %f\n", params.fout);
+  if(vm.count("file")){
+    FILE *f = NULL;
+
+    if(vm["file"].as<string>() == "-")
+      f = stdout;
+    else
+      f = fopen(vm["file"].as<string>().c_str(), "w");
+
+    
+    write_pll_config(params, "pll", f);
+
+  }
 
 }
 
@@ -126,5 +140,37 @@
     }
   }
   return params;
-  
+}
+
+void write_pll_config(pll_params params, const char* name,  FILE* file){
+  fprintf(file, "module %s(input clki, output clko);\n", name);
+  fprintf(file, "(* ICP_CURRENT=\"12\" *) (* LPF_RESISTOR=\"8\" *) (* MFG_ENABLE_FILTEROPAMP=\"1\" *) (* MFG_GMCREF_SEL=\"2\" *)\n");
+  fprintf(file, "EHXPLLL #(\n");
+  fprintf(file, "        .PLLRST_ENA(\"DISABLED\"),\n");
+  fprintf(file, "        .INTFB_WAKE(\"DISABLED\"),\n");
+  fprintf(file, "        .STDBY_ENABLE(\"DISABLED\"),\n");
+  fprintf(file, "        .DPHASE_SOURCE(\"DISABLED\"),\n");
+  fprintf(file, "        .CLKOP_FPHASE(0),\n");
+  fprintf(file, "        .CLKOP_CPHASE(11),\n");
+  fprintf(file, "        .OUTDIVIDER_MUXA(\"DIVA\"),\n");
+  fprintf(file, "        .CLKOP_ENABLE(\"ENABLED\")\n");
+  fprintf(file, "        .CLKOP_DIV(%d),\n", params.output_div);
+  fprintf(file, "        .CLKFB_DIV(%d),\n", params.feedback_div);
+  fprintf(file, "        .CLKI_DIV(%d),\n", params.refclk_div);
+  fprintf(file, "        .FEEDBK_PATH(\"CLKOP\")\n");
+  fprintf(file, "    ) pll_i (\n");
+  fprintf(file, "        .CLKI(clki),\n");
+  fprintf(file, "        .CLKFB(clko),\n");
+  fprintf(file, "        .CLKOP(clko),\n");
+  fprintf(file, "        .RST(1'b0),\n");
+  fprintf(file, "        .STDBY(1'b0),\n");
+  fprintf(file, "        .PHASESEL0(1'b0),\n");
+  fprintf(file, "        .PHASESEL1(1'b0),\n");
+  fprintf(file, "        .PHASEDIR(1'b0),\n");
+  fprintf(file, "        .PHASESTEP(1'b0),\n");
+  fprintf(file, "        .PLLWAKESYNC(1'b0),\n");
+  fprintf(file, "        .ENCLKOP(1'b0),\n");
+  fprintf(file, "	);\n");
+  fprintf(file, "endmodule\n");
+
 }