├── sources ├── __init__.py ├── odatix │ ├── __init__.py │ ├── gui │ │ ├── __init__.py │ │ ├── architecture_utils.py │ │ ├── version.txt │ │ ├── assets │ │ │ ├── favicon.ico │ │ │ ├── icons │ │ │ │ ├── run.png │ │ │ │ ├── export.png │ │ │ │ ├── tools.png │ │ │ │ ├── explorer.png │ │ │ │ ├── monitor.png │ │ │ │ ├── settings.png │ │ │ │ ├── architecture.png │ │ │ │ ├── documentation.png │ │ │ │ ├── sidebar-panel-expand-icon.svg │ │ │ │ └── sidebar-panel-collapse-icon.svg │ │ │ ├── preview │ │ │ │ ├── overview.png │ │ │ │ └── architectures.png │ │ │ ├── fonts │ │ │ │ ├── w95 │ │ │ │ │ ├── w95font.woff │ │ │ │ │ └── w95font.woff2 │ │ │ │ ├── Lexend-SemiBold.ttf │ │ │ │ └── Nunito-SemiBold.ttf │ │ │ ├── switch.css │ │ │ ├── preview_scroll.js │ │ │ └── auto_resize.js │ │ ├── css_helper.py │ │ ├── utils.py │ │ ├── themes.py │ │ ├── pages │ │ │ └── not_found_404.py │ │ └── content_lib.py │ ├── lib │ │ ├── __init__.py │ │ ├── curses_helper.py │ │ ├── re_helper.py │ │ ├── hard_settings.py │ │ ├── variables.py │ │ └── term_mode.py │ ├── components │ │ └── __init__.py │ ├── explorer │ │ ├── __init__.py │ │ ├── assets │ │ │ ├── favicon.ico │ │ │ ├── preview │ │ │ │ └── overview.png │ │ │ └── icons │ │ │ │ ├── sidebar-panel-expand-icon.svg │ │ │ │ └── sidebar-panel-collapse-icon.svg │ │ ├── css_helper.py │ │ ├── pages │ │ │ ├── not_found_404.py │ │ │ ├── lines.py │ │ │ ├── radar.py │ │ │ ├── columns.py │ │ │ ├── overview.py │ │ │ ├── scatter.py │ │ │ └── scatter3d.py │ │ └── content_lib.py │ └── version.txt ├── odatix_eda_tools │ ├── dummy │ │ ├── tcl │ │ │ ├── summary.tcl │ │ │ ├── analyze_script.tcl │ │ │ ├── update_freq.tcl │ │ │ ├── custom_freq_synth_script.tcl │ │ │ ├── is_slack_met.tcl │ │ │ └── synth_script.tcl │ │ ├── metrics.yml │ │ └── tool.yml │ ├── openlane │ │ ├── tcl │ │ │ ├── summary.tcl │ │ │ ├── analyze_script.tcl │ │ │ ├── update_freq.tcl │ │ │ ├── is_slack_met.tcl │ │ │ ├── init_script.tcl │ │ │ └── synth_script.tcl │ │ ├── tool.yml │ │ └── metrics.yml │ ├── design_compiler │ │ ├── tool.yml │ │ ├── tcl │ │ │ ├── update_freq.tcl │ │ │ └── is_slack_met.tcl │ │ └── technology │ │ │ ├── AMS_c35_1V8 │ │ │ └── synopsys_dc_setup.tcl │ │ │ ├── AMS_c35_2V2 │ │ │ └── synopsys_dc_setup.tcl │ │ │ ├── AMS_c35_2V7 │ │ │ └── synopsys_dc_setup.tcl │ │ │ ├── AMS_c35_3V3 │ │ │ └── synopsys_dc_setup.tcl │ │ │ ├── AMS_h18_1V8 │ │ │ └── synopsys_dc_setup.tcl │ │ │ ├── AMS_h18_2V2 │ │ │ └── synopsys_dc_setup.tcl │ │ │ ├── AMS_h18_2V7 │ │ │ └── synopsys_dc_setup.tcl │ │ │ ├── AMS_h18_3V3 │ │ │ └── synopsys_dc_setup.tcl │ │ │ ├── AMS_h18_5V0 │ │ │ └── synopsys_dc_setup.tcl │ │ │ ├── AMS_350nm_CMOS │ │ │ └── synopsys_dc_setup.tcl │ │ │ └── XFAB_180nm_CMOS │ │ │ └── synopsys_dc_setup.tcl │ ├── _common │ │ ├── exit.tcl │ │ ├── exit_safe.tcl │ │ └── init_script.tcl │ └── vivado │ │ └── tcl │ │ ├── update_freq.tcl │ │ └── is_slack_met.tcl ├── requirements_win32.txt ├── odatix_examples │ ├── examples │ │ ├── alu_chisel │ │ │ ├── project │ │ │ │ ├── build.properties │ │ │ │ └── plugins.sbt │ │ │ ├── src │ │ │ │ └── main │ │ │ │ │ └── scala │ │ │ │ │ ├── pck_control.scala │ │ │ │ │ ├── ALUTop.scala │ │ │ │ │ └── ALU.scala │ │ │ └── build.sbt │ │ ├── counter_chisel │ │ │ ├── project │ │ │ │ ├── build.properties │ │ │ │ └── plugins.sbt │ │ │ ├── build.sbt │ │ │ └── src │ │ │ │ └── main │ │ │ │ └── scala │ │ │ │ └── counter.scala │ │ ├── shift_register_chisel │ │ │ ├── project │ │ │ │ ├── build.properties │ │ │ │ └── plugins.sbt │ │ │ ├── src │ │ │ │ └── main │ │ │ │ │ └── scala │ │ │ │ │ └── ShiftRegister.scala │ │ │ └── build.sbt │ │ ├── alu_sv │ │ │ ├── pck_control.sv │ │ │ ├── alu_top.sv │ │ │ └── alu.sv │ │ ├── shift_register_sv │ │ │ └── shift_register.sv │ │ ├── counter_verilog │ │ │ └── counter.v │ │ ├── counter_sv │ │ │ └── counter.sv │ │ ├── mult │ │ │ └── mult.sv │ │ ├── rom_chisel │ │ │ ├── build.sbt │ │ │ └── src │ │ │ │ └── main │ │ │ │ └── scala │ │ │ │ └── rom.scala │ │ └── counter_vhdl │ │ │ └── counter.vhdl │ └── odatix_userconfig │ │ ├── architectures │ │ ├── Example_ALU_chisel │ │ │ ├── 04bits.txt │ │ │ ├── 08bits.txt │ │ │ ├── 16bits.txt │ │ │ ├── 24bits.txt │ │ │ ├── 32bits.txt │ │ │ ├── 48bits.txt │ │ │ ├── 64bits.txt │ │ │ └── _settings.yml │ │ ├── Example_Rom_Chisel │ │ │ ├── addr │ │ │ │ ├── 08bits.txt │ │ │ │ ├── 12bits.txt │ │ │ │ ├── 16bits.txt │ │ │ │ ├── 20bits.txt │ │ │ │ ├── 24bits.txt │ │ │ │ ├── 28bits.txt │ │ │ │ ├── 32bits.txt │ │ │ │ └── _settings.yml │ │ │ ├── data │ │ │ │ ├── 08bits.txt │ │ │ │ ├── 09bits.txt │ │ │ │ ├── 10bits.txt │ │ │ │ ├── 11bits.txt │ │ │ │ ├── 12bits.txt │ │ │ │ ├── 13bits.txt │ │ │ │ ├── 14bits.txt │ │ │ │ └── _settings.yml │ │ │ └── _settings.yml │ │ ├── Example_Counter_chisel │ │ │ ├── 04bits.txt │ │ │ ├── 08bits.txt │ │ │ ├── 16bits.txt │ │ │ ├── 24bits.txt │ │ │ ├── 32bits.txt │ │ │ ├── 48bits.txt │ │ │ ├── 64bits.txt │ │ │ └── _settings.yml │ │ ├── Example_Shift_Register_chisel │ │ │ ├── 04bits.txt │ │ │ ├── 08bits.txt │ │ │ ├── 16bits.txt │ │ │ ├── 24bits.txt │ │ │ ├── 32bits.txt │ │ │ ├── 48bits.txt │ │ │ ├── 64bits.txt │ │ │ └── _settings.yml │ │ ├── Example_ALU_sv │ │ │ ├── 04bits.txt │ │ │ ├── 08bits.txt │ │ │ ├── 16bits.txt │ │ │ ├── 24bits.txt │ │ │ ├── 32bits.txt │ │ │ ├── 48bits.txt │ │ │ ├── 64bits.txt │ │ │ └── _settings.yml │ │ ├── Example_Mult │ │ │ ├── 04bits.txt │ │ │ ├── 08bits.txt │ │ │ ├── 16bits.txt │ │ │ ├── 24bits.txt │ │ │ ├── 32bits.txt │ │ │ ├── 48bits.txt │ │ │ ├── 64bits.txt │ │ │ └── _settings.yml │ │ ├── Example_Counter_sv │ │ │ ├── 04bits.txt │ │ │ ├── 08bits.txt │ │ │ ├── 16bits.txt │ │ │ ├── 24bits.txt │ │ │ ├── 32bits.txt │ │ │ ├── 48bits.txt │ │ │ ├── 64bits.txt │ │ │ └── _settings.yml │ │ ├── Example_Counter_verilog │ │ │ ├── 04bits.txt │ │ │ ├── 08bits.txt │ │ │ ├── 16bits.txt │ │ │ ├── 24bits.txt │ │ │ ├── 32bits.txt │ │ │ ├── 48bits.txt │ │ │ ├── 64bits.txt │ │ │ └── _settings.yml │ │ ├── Example_Counter_vhdl │ │ │ ├── 04bits.txt │ │ │ ├── 08bits.txt │ │ │ ├── 16bits.txt │ │ │ ├── 24bits.txt │ │ │ ├── 32bits.txt │ │ │ ├── 48bits.txt │ │ │ ├── 64bits.txt │ │ │ └── _settings.yml │ │ ├── Example_Shift_Register_sv │ │ │ ├── 04bits.txt │ │ │ ├── 08bits.txt │ │ │ ├── 16bits.txt │ │ │ ├── 24bits.txt │ │ │ ├── 32bits.txt │ │ │ ├── 48bits.txt │ │ │ ├── 64bits.txt │ │ │ └── _settings.yml │ │ └── Example_Config_Generation │ │ │ ├── 03_List │ │ │ └── _settings.yml │ │ │ ├── 02.2_Power_of_two │ │ │ └── _settings.yml │ │ │ ├── 01_Range │ │ │ └── _settings.yml │ │ │ ├── 02.1_Power_of_two │ │ │ └── _settings.yml │ │ │ ├── 04_Multiples │ │ │ └── _settings.yml │ │ │ ├── 05_Function │ │ │ └── _settings.yml │ │ │ ├── 06_Union │ │ │ └── _settings.yml │ │ │ ├── _settings.yml │ │ │ ├── 07_Disjunctive_Union │ │ │ └── _settings.yml │ │ │ ├── 09_Difference │ │ │ └── _settings.yml │ │ │ ├── 08_Intersection │ │ │ └── _settings.yml │ │ │ └── 10_Multiple_Parameters │ │ │ └── _settings.yml │ │ ├── target_dummy.yml │ │ ├── simulations │ │ └── TB_Example_Counter_GHDL │ │ │ └── _settings.yml │ │ ├── target_openlane.yml │ │ ├── clean.yml │ │ ├── target_vivado.yml │ │ ├── simulations_settings.yml │ │ └── target_design_compiler.yml ├── images │ ├── odatix │ │ └── odatix.png │ ├── odatix_logo_white.png │ └── odatix-explorer │ │ ├── odatix-explorer-lines.png │ │ ├── odatix-explorer-radar.png │ │ ├── odatix-explorer-columns.png │ │ ├── odatix-explorer-overview.png │ │ ├── odatix-explorer-scatter.png │ │ ├── odatix-explorer-scatter3d.png │ │ └── odatix-explorer-columns-freq.png ├── requirements.txt ├── odatix_init │ ├── odatix.yml │ └── odatix_userconfig │ │ ├── target_dummy.yml │ │ ├── target_openlane.yml │ │ ├── clean.yml │ │ ├── target_vivado.yml │ │ ├── fmax_synthesis_settings.yml │ │ ├── custom_freq_synthesis_settings.yml │ │ ├── simulations_settings.yml │ │ └── target_design_compiler.yml ├── MANIFEST.in └── setup.py ├── docs ├── requirements.txt ├── Makefile ├── source │ ├── userguide │ │ └── index.rst │ ├── installation │ │ ├── index.rst │ │ └── install_from_pypi.rst │ ├── conf.py │ └── quick_start │ │ ├── simulations.rst │ │ ├── index.rst │ │ └── add_simulation.rst └── make.bat ├── .gitignore ├── .readthedocs.yaml ├── run_odatix.py ├── run_odatix_gui.py ├── run_odatix_explorer.py ├── .github └── workflows │ └── python-publish.yml ├── Makefile └── results └── results_openlane.yml /sources/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sources/odatix/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sources/odatix/gui/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sources/odatix/lib/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sources/odatix/components/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sources/odatix/explorer/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sources/odatix/version.txt: -------------------------------------------------------------------------------- 1 | 3.7.2 2 | -------------------------------------------------------------------------------- /sources/odatix/gui/architecture_utils.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sources/odatix/gui/version.txt: -------------------------------------------------------------------------------- 1 | 3.7.0 2 | -------------------------------------------------------------------------------- /sources/odatix_eda_tools/dummy/tcl/summary.tcl: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sources/odatix_eda_tools/dummy/tcl/analyze_script.tcl: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sources/odatix_eda_tools/openlane/tcl/summary.tcl: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sources/requirements_win32.txt: -------------------------------------------------------------------------------- 1 | windows-curses 2 | -------------------------------------------------------------------------------- /sources/odatix_eda_tools/openlane/tcl/analyze_script.tcl: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sources/odatix_examples/examples/alu_chisel/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.8.0 2 | -------------------------------------------------------------------------------- /sources/odatix_examples/examples/alu_chisel/project/plugins.sbt: -------------------------------------------------------------------------------- 1 | logLevel := Level.Warn 2 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_ALU_chisel/04bits.txt: -------------------------------------------------------------------------------- 1 | BITS = 4 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_ALU_chisel/08bits.txt: -------------------------------------------------------------------------------- 1 | BITS = 8 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Rom_Chisel/addr/08bits.txt: -------------------------------------------------------------------------------- 1 | 8 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Rom_Chisel/addr/12bits.txt: -------------------------------------------------------------------------------- 1 | 12 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Rom_Chisel/addr/16bits.txt: -------------------------------------------------------------------------------- 1 | 16 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Rom_Chisel/addr/20bits.txt: -------------------------------------------------------------------------------- 1 | 20 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Rom_Chisel/addr/24bits.txt: -------------------------------------------------------------------------------- 1 | 24 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Rom_Chisel/addr/28bits.txt: -------------------------------------------------------------------------------- 1 | 28 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Rom_Chisel/addr/32bits.txt: -------------------------------------------------------------------------------- 1 | 32 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Rom_Chisel/data/08bits.txt: -------------------------------------------------------------------------------- 1 | 8 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Rom_Chisel/data/09bits.txt: -------------------------------------------------------------------------------- 1 | 9 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Rom_Chisel/data/10bits.txt: -------------------------------------------------------------------------------- 1 | 10 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Rom_Chisel/data/11bits.txt: -------------------------------------------------------------------------------- 1 | 11 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Rom_Chisel/data/12bits.txt: -------------------------------------------------------------------------------- 1 | 12 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Rom_Chisel/data/13bits.txt: -------------------------------------------------------------------------------- 1 | 13 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Rom_Chisel/data/14bits.txt: -------------------------------------------------------------------------------- 1 | 14 -------------------------------------------------------------------------------- /sources/odatix_examples/examples/counter_chisel/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.8.0 2 | -------------------------------------------------------------------------------- /sources/odatix_examples/examples/counter_chisel/project/plugins.sbt: -------------------------------------------------------------------------------- 1 | logLevel := Level.Warn 2 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_ALU_chisel/16bits.txt: -------------------------------------------------------------------------------- 1 | BITS = 16 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_ALU_chisel/24bits.txt: -------------------------------------------------------------------------------- 1 | BITS = 24 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_ALU_chisel/32bits.txt: -------------------------------------------------------------------------------- 1 | BITS = 32 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_ALU_chisel/48bits.txt: -------------------------------------------------------------------------------- 1 | BITS = 48 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_ALU_chisel/64bits.txt: -------------------------------------------------------------------------------- 1 | BITS = 64 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Counter_chisel/04bits.txt: -------------------------------------------------------------------------------- 1 | BITS = 4 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Counter_chisel/08bits.txt: -------------------------------------------------------------------------------- 1 | BITS = 8 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Counter_chisel/16bits.txt: -------------------------------------------------------------------------------- 1 | BITS = 16 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Counter_chisel/24bits.txt: -------------------------------------------------------------------------------- 1 | BITS = 24 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Counter_chisel/32bits.txt: -------------------------------------------------------------------------------- 1 | BITS = 32 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Counter_chisel/48bits.txt: -------------------------------------------------------------------------------- 1 | BITS = 48 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Counter_chisel/64bits.txt: -------------------------------------------------------------------------------- 1 | BITS = 64 -------------------------------------------------------------------------------- /sources/odatix_examples/examples/shift_register_chisel/project/build.properties: -------------------------------------------------------------------------------- 1 | sbt.version = 1.8.0 2 | -------------------------------------------------------------------------------- /sources/odatix_examples/examples/shift_register_chisel/project/plugins.sbt: -------------------------------------------------------------------------------- 1 | logLevel := Level.Warn 2 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Shift_Register_chisel/04bits.txt: -------------------------------------------------------------------------------- 1 | BITS = 4 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Shift_Register_chisel/08bits.txt: -------------------------------------------------------------------------------- 1 | BITS = 8 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Shift_Register_chisel/16bits.txt: -------------------------------------------------------------------------------- 1 | BITS = 16 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Shift_Register_chisel/24bits.txt: -------------------------------------------------------------------------------- 1 | BITS = 24 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Shift_Register_chisel/32bits.txt: -------------------------------------------------------------------------------- 1 | BITS = 32 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Shift_Register_chisel/48bits.txt: -------------------------------------------------------------------------------- 1 | BITS = 48 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Shift_Register_chisel/64bits.txt: -------------------------------------------------------------------------------- 1 | BITS = 64 -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_ALU_sv/04bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 4 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_ALU_sv/08bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 8 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_ALU_sv/16bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 16 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_ALU_sv/24bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 24 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_ALU_sv/32bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 32 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_ALU_sv/48bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 48 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_ALU_sv/64bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 64 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Mult/04bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 4 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Mult/08bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 8 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Mult/16bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 16 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Mult/24bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 24 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Mult/32bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 32 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Mult/48bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 48 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Mult/64bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 64 3 | -------------------------------------------------------------------------------- /sources/images/odatix/odatix.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsaussereau/Odatix/HEAD/sources/images/odatix/odatix.png -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Counter_sv/04bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 4 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Counter_sv/08bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 8 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Counter_sv/16bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 16 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Counter_sv/24bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 24 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Counter_sv/32bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 32 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Counter_sv/48bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 48 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Counter_sv/64bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 64 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Counter_verilog/04bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 4 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Counter_verilog/08bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 8 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Counter_verilog/16bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 16 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Counter_verilog/24bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 24 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Counter_verilog/32bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 32 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Counter_verilog/48bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 48 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Counter_verilog/64bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 64 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Counter_vhdl/04bits.txt: -------------------------------------------------------------------------------- 1 | 2 | BITS : integer := 4 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Counter_vhdl/08bits.txt: -------------------------------------------------------------------------------- 1 | 2 | BITS : integer := 8 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Counter_vhdl/16bits.txt: -------------------------------------------------------------------------------- 1 | 2 | BITS : integer := 16 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Counter_vhdl/24bits.txt: -------------------------------------------------------------------------------- 1 | 2 | BITS : integer := 24 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Counter_vhdl/32bits.txt: -------------------------------------------------------------------------------- 1 | 2 | BITS : integer := 32 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Counter_vhdl/48bits.txt: -------------------------------------------------------------------------------- 1 | 2 | BITS : integer := 48 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Counter_vhdl/64bits.txt: -------------------------------------------------------------------------------- 1 | 2 | BITS : integer := 64 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Shift_Register_sv/04bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 4 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Shift_Register_sv/08bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 8 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Shift_Register_sv/16bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 16 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Shift_Register_sv/24bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 24 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Shift_Register_sv/32bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 32 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Shift_Register_sv/48bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 48 3 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Shift_Register_sv/64bits.txt: -------------------------------------------------------------------------------- 1 | 2 | parameter BITS = 64 3 | -------------------------------------------------------------------------------- /sources/images/odatix_logo_white.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsaussereau/Odatix/HEAD/sources/images/odatix_logo_white.png -------------------------------------------------------------------------------- /sources/odatix/gui/assets/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsaussereau/Odatix/HEAD/sources/odatix/gui/assets/favicon.ico -------------------------------------------------------------------------------- /sources/odatix/gui/assets/icons/run.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsaussereau/Odatix/HEAD/sources/odatix/gui/assets/icons/run.png -------------------------------------------------------------------------------- /sources/odatix/explorer/assets/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsaussereau/Odatix/HEAD/sources/odatix/explorer/assets/favicon.ico -------------------------------------------------------------------------------- /sources/odatix/gui/assets/icons/export.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsaussereau/Odatix/HEAD/sources/odatix/gui/assets/icons/export.png -------------------------------------------------------------------------------- /sources/odatix/gui/assets/icons/tools.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsaussereau/Odatix/HEAD/sources/odatix/gui/assets/icons/tools.png -------------------------------------------------------------------------------- /sources/odatix/gui/assets/icons/explorer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsaussereau/Odatix/HEAD/sources/odatix/gui/assets/icons/explorer.png -------------------------------------------------------------------------------- /sources/odatix/gui/assets/icons/monitor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsaussereau/Odatix/HEAD/sources/odatix/gui/assets/icons/monitor.png -------------------------------------------------------------------------------- /sources/odatix/gui/assets/icons/settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsaussereau/Odatix/HEAD/sources/odatix/gui/assets/icons/settings.png -------------------------------------------------------------------------------- /sources/odatix/gui/assets/preview/overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsaussereau/Odatix/HEAD/sources/odatix/gui/assets/preview/overview.png -------------------------------------------------------------------------------- /sources/odatix/gui/assets/fonts/w95/w95font.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsaussereau/Odatix/HEAD/sources/odatix/gui/assets/fonts/w95/w95font.woff -------------------------------------------------------------------------------- /sources/odatix/gui/assets/fonts/w95/w95font.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsaussereau/Odatix/HEAD/sources/odatix/gui/assets/fonts/w95/w95font.woff2 -------------------------------------------------------------------------------- /sources/odatix/gui/assets/icons/architecture.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsaussereau/Odatix/HEAD/sources/odatix/gui/assets/icons/architecture.png -------------------------------------------------------------------------------- /sources/odatix/gui/assets/icons/documentation.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsaussereau/Odatix/HEAD/sources/odatix/gui/assets/icons/documentation.png -------------------------------------------------------------------------------- /docs/requirements.txt: -------------------------------------------------------------------------------- 1 | sphinx>=7.1.2 2 | furo 3 | sphinx-inline-tabs==2023.4.21 4 | sphinx-copybutton==0.5.2 5 | sphinx-toolbox==3.5.0 6 | sphinx-design==0.6.1 -------------------------------------------------------------------------------- /sources/odatix/explorer/assets/preview/overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsaussereau/Odatix/HEAD/sources/odatix/explorer/assets/preview/overview.png -------------------------------------------------------------------------------- /sources/odatix/gui/assets/fonts/Lexend-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsaussereau/Odatix/HEAD/sources/odatix/gui/assets/fonts/Lexend-SemiBold.ttf -------------------------------------------------------------------------------- /sources/odatix/gui/assets/fonts/Nunito-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsaussereau/Odatix/HEAD/sources/odatix/gui/assets/fonts/Nunito-SemiBold.ttf -------------------------------------------------------------------------------- /sources/odatix/gui/assets/preview/architectures.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsaussereau/Odatix/HEAD/sources/odatix/gui/assets/preview/architectures.png -------------------------------------------------------------------------------- /sources/requirements.txt: -------------------------------------------------------------------------------- 1 | PyYAML 2 | ruamel.yaml 3 | argcomplete 4 | dash 5 | Flask 6 | numpy 7 | pandas 8 | plotly 9 | waitress 10 | dash_svg 11 | -------------------------------------------------------------------------------- /sources/images/odatix-explorer/odatix-explorer-lines.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsaussereau/Odatix/HEAD/sources/images/odatix-explorer/odatix-explorer-lines.png -------------------------------------------------------------------------------- /sources/images/odatix-explorer/odatix-explorer-radar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsaussereau/Odatix/HEAD/sources/images/odatix-explorer/odatix-explorer-radar.png -------------------------------------------------------------------------------- /sources/images/odatix-explorer/odatix-explorer-columns.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsaussereau/Odatix/HEAD/sources/images/odatix-explorer/odatix-explorer-columns.png -------------------------------------------------------------------------------- /sources/images/odatix-explorer/odatix-explorer-overview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsaussereau/Odatix/HEAD/sources/images/odatix-explorer/odatix-explorer-overview.png -------------------------------------------------------------------------------- /sources/images/odatix-explorer/odatix-explorer-scatter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsaussereau/Odatix/HEAD/sources/images/odatix-explorer/odatix-explorer-scatter.png -------------------------------------------------------------------------------- /sources/images/odatix-explorer/odatix-explorer-scatter3d.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsaussereau/Odatix/HEAD/sources/images/odatix-explorer/odatix-explorer-scatter3d.png -------------------------------------------------------------------------------- /sources/images/odatix-explorer/odatix-explorer-columns-freq.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/jsaussereau/Odatix/HEAD/sources/images/odatix-explorer/odatix-explorer-columns-freq.png -------------------------------------------------------------------------------- /sources/odatix_init/odatix.yml: -------------------------------------------------------------------------------- 1 | ############################################## 2 | # Odatix Workspace Settings 3 | ############################################## 4 | 5 | # Default workspace settings can be overridden here. 6 | 7 | workspace: odatix 8 | -------------------------------------------------------------------------------- /sources/MANIFEST.in: -------------------------------------------------------------------------------- 1 | include requirements.txt 2 | include README.md 3 | include odatix/version.txt 4 | recursive-include odatix/explorer/assets * 5 | recursive-include odatix/eda_tools * 6 | recursive-include odatix_examples * 7 | recursive-include odatix_init * 8 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Config_Generation/03_List/_settings.yml: -------------------------------------------------------------------------------- 1 | 2 | start_delimiter: " // test parameters begin" 3 | stop_delimiter: " // test parameters end" 4 | 5 | generate_configurations: Yes 6 | generate_configurations_settings: 7 | template: "parameter VALUE = $var;" 8 | name: "config_${var}" 9 | variables: 10 | var: 11 | type: list 12 | settings: 13 | list: [100, 225, 412, 803] 14 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/target_dummy.yml: -------------------------------------------------------------------------------- 1 | 2 | ############################################## 3 | # Target settings for dummy test tool 4 | ############################################## 5 | 6 | constraint_file: constraints.txt 7 | 8 | tool_install_path: "" # tclsh should be in your $PATH 9 | 10 | force_single_thread: No 11 | 12 | script_copy_enable: No 13 | script_copy_source: "/dev/null" 14 | 15 | # FPGA target 16 | targets: 17 | - dummy_target 18 | -------------------------------------------------------------------------------- /sources/odatix_init/odatix_userconfig/target_dummy.yml: -------------------------------------------------------------------------------- 1 | 2 | ############################################## 3 | # Target settings for dummy test tool 4 | ############################################## 5 | 6 | constraint_file: constraints.txt 7 | 8 | tool_install_path: "" # tclsh should be in your $PATH 9 | 10 | force_single_thread: No 11 | 12 | script_copy_enable: No 13 | script_copy_source: "/dev/null" 14 | 15 | # FPGA target 16 | targets: 17 | - dummy_target 18 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/simulations/TB_Example_Counter_GHDL/_settings.yml: -------------------------------------------------------------------------------- 1 | 2 | ############################################## 3 | # Settings for counter testbench 4 | ############################################## 5 | --- 6 | 7 | # delimiters for parameter files 8 | use_parameters: Yes 9 | param_target_file: "tb/tb_counter.vhdl" 10 | start_delimiter: "generic (" 11 | stop_delimiter: " );" 12 | 13 | # override part of the parameters 14 | override_parameters: No -------------------------------------------------------------------------------- /sources/odatix/gui/assets/icons/sidebar-panel-expand-icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Config_Generation/02.2_Power_of_two/_settings.yml: -------------------------------------------------------------------------------- 1 | 2 | start_delimiter: " // test parameters begin" 3 | stop_delimiter: " // test parameters end" 4 | 5 | generate_configurations: Yes 6 | generate_configurations_settings: 7 | template: "parameter VALUE = $var;" 8 | name: "config_${var}" 9 | variables: 10 | var: 11 | type: power_of_two 12 | settings: 13 | from: 32 14 | to: 1024 15 | -------------------------------------------------------------------------------- /sources/odatix/explorer/assets/icons/sidebar-panel-expand-icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Config_Generation/01_Range/_settings.yml: -------------------------------------------------------------------------------- 1 | 2 | start_delimiter: " // test parameters begin" 3 | stop_delimiter: " // test parameters end" 4 | 5 | generate_configurations: Yes 6 | generate_configurations_settings: 7 | template: "parameter VALUE = $var;" 8 | name: "config_${var}" 9 | variables: 10 | var: 11 | type: range 12 | settings: 13 | from: 10 14 | to: 100 15 | step: 10 16 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Config_Generation/02.1_Power_of_two/_settings.yml: -------------------------------------------------------------------------------- 1 | 2 | start_delimiter: " // test parameters begin" 3 | stop_delimiter: " // test parameters end" 4 | 5 | generate_configurations: Yes 6 | generate_configurations_settings: 7 | template: "parameter VALUE = $var;" 8 | name: "config_${var}" 9 | variables: 10 | var: 11 | type: power_of_two 12 | settings: 13 | from_2^: 5 14 | to_2^: 10 15 | -------------------------------------------------------------------------------- /sources/odatix/gui/assets/icons/sidebar-panel-collapse-icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Config_Generation/04_Multiples/_settings.yml: -------------------------------------------------------------------------------- 1 | 2 | start_delimiter: " // test parameters begin" 3 | stop_delimiter: " // test parameters end" 4 | 5 | generate_configurations: Yes 6 | generate_configurations_settings: 7 | template: "parameter VALUE = $var;" 8 | name: "config_${var}" 9 | variables: 10 | var: 11 | type: multiples 12 | settings: 13 | base: 8 14 | from: 8 15 | to: 64 16 | -------------------------------------------------------------------------------- /sources/odatix/explorer/assets/icons/sidebar-panel-collapse-icon.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /sources/odatix_examples/examples/alu_sv/pck_control.sv: -------------------------------------------------------------------------------- 1 | `ifndef __PCK_CONTROL__ 2 | `define __PCK_CONTROL__ 3 | 4 | package pck_control; 5 | 6 | typedef enum logic [3:0] { 7 | alu_nop = 4'd0, 8 | alu_add = 4'd1, 9 | alu_sub = 4'd2, 10 | alu_and = 4'd3, 11 | alu_or = 4'd4, 12 | alu_xor = 4'd5, 13 | alu_slt = 4'd6, 14 | alu_sltu = 4'd7, 15 | alu_sll = 4'd8, 16 | alu_srl = 4'd9, 17 | alu_sra = 4'd10, 18 | alu_cpa = 4'd11, 19 | alu_cpb = 4'd12 20 | } sel_alu_op_e; 21 | 22 | endpackage 23 | 24 | `endif -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Rom_Chisel/data/_settings.yml: -------------------------------------------------------------------------------- 1 | 2 | start_delimiter: " val data_bits = " 3 | stop_delimiter: " // Data width" 4 | param_target_file: "src/main/scala/rom.scala" 5 | 6 | generate_configurations: Yes 7 | generate_configurations_settings: 8 | template: "${bits}" 9 | name: "${formatted_bits}bits" 10 | variables: 11 | bits: 12 | type: range 13 | settings: 14 | from: 8 15 | to: 14 16 | 17 | formatted_bits: 18 | type: format 19 | settings: 20 | source: $bits 21 | format: "%02d" 22 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Rom_Chisel/addr/_settings.yml: -------------------------------------------------------------------------------- 1 | 2 | start_delimiter: " val addr_bits = " 3 | stop_delimiter: " // Address width" 4 | param_target_file: "src/main/scala/rom.scala" 5 | 6 | generate_configurations: Yes 7 | generate_configurations_settings: 8 | template: "${bits}" 9 | name: "${formatted_bits}bits" 10 | variables: 11 | bits: 12 | type: list 13 | settings: 14 | list: [4, 6, 8, 10, 12, 14, 16] 15 | 16 | formatted_bits: 17 | type: format 18 | settings: 19 | source: $bits 20 | format: "%02d" 21 | -------------------------------------------------------------------------------- /sources/odatix_init/odatix_userconfig/target_openlane.yml: -------------------------------------------------------------------------------- 1 | 2 | ############################################## 3 | # Target Settings for OpenLane 4 | ############################################## 5 | 6 | constraint_file: config.json 7 | 8 | # /!\ UPDATE WITH YOUR OWN INSTALL PATH HERE /!\ 9 | tool_install_path: ~/OpenLane 10 | 11 | force_single_thread: No # Single thread is not supported yet with openlane 12 | 13 | script_copy_enable: No 14 | script_copy_source: "/dev/null" 15 | 16 | # ASIC target 17 | targets: 18 | - sky130A 19 | # - sky130B 20 | # - gf180mcuA 21 | # - gf180mcuB 22 | # - gf180mcuC 23 | -------------------------------------------------------------------------------- /sources/odatix_examples/examples/alu_chisel/src/main/scala/pck_control.scala: -------------------------------------------------------------------------------- 1 | package pck_control 2 | 3 | import chisel3._ 4 | import chisel3.util._ 5 | 6 | object ALUOp extends ChiselEnum { 7 | val alu_nop = Value(0.U) 8 | val alu_add = Value(1.U) 9 | val alu_sub = Value(2.U) 10 | val alu_and = Value(3.U) 11 | val alu_or = Value(4.U) 12 | val alu_xor = Value(5.U) 13 | val alu_slt = Value(6.U) 14 | val alu_sltu = Value(7.U) 15 | val alu_sll = Value(8.U) 16 | val alu_srl = Value(9.U) 17 | val alu_sra = Value(10.U) 18 | val alu_cpa = Value(11.U) 19 | val alu_cpb = Value(12.U) 20 | } 21 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/target_openlane.yml: -------------------------------------------------------------------------------- 1 | 2 | ############################################## 3 | # Target Settings for OpenLane 4 | ############################################## 5 | 6 | constraint_file: config.json 7 | 8 | # /!\ UPDATE WITH YOUR OWN INSTALL PATH HERE /!\ 9 | tool_install_path: ~/OpenLane 10 | 11 | force_single_thread: No # Single thread is not supported yet with openlane 12 | 13 | script_copy_enable: No 14 | script_copy_source: "/dev/null" 15 | 16 | # ASIC target 17 | targets: 18 | - sky130A 19 | # - sky130B 20 | # - gf180mcuA 21 | # - gf180mcuB 22 | # - gf180mcuC 23 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Config_Generation/05_Function/_settings.yml: -------------------------------------------------------------------------------- 1 | 2 | start_delimiter: " // test parameters begin" 3 | stop_delimiter: " // test parameters end" 4 | 5 | generate_configurations: Yes 6 | generate_configurations_settings: 7 | template: "parameter VALUE_START = $var;\n parameter VALUE_END = ${var_func};" 8 | name: "config_${var}..${var_func}" 9 | variables: 10 | var: 11 | type: multiples 12 | settings: 13 | from: 0 14 | to: 56 15 | base: 8 16 | var_func: 17 | type: function 18 | settings: 19 | op: ${var}+7 20 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Config_Generation/06_Union/_settings.yml: -------------------------------------------------------------------------------- 1 | 2 | start_delimiter: " // test parameters begin" 3 | stop_delimiter: " // test parameters end" 4 | 5 | generate_configurations: Yes 6 | generate_configurations_settings: 7 | template: "parameter VALUE = ${union_var};" 8 | name: "config_${union_var}" 9 | variables: 10 | var_1: 11 | type: list 12 | settings: 13 | list: [50, 60] 14 | var_2: 15 | type: list 16 | settings: 17 | list: [10, 100] 18 | union_var: 19 | type: union 20 | settings: 21 | sources: [var_1, var_2] 22 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Config_Generation/_settings.yml: -------------------------------------------------------------------------------- 1 | ################################################################### 2 | # THIS EXAMPLE CANNOT BE SYNTHETIZED # 3 | # ITS ONLY PURPOSE IS GIVE SOME CONFIGURATION GENERATION EXAMPLES # 4 | ################################################################### 5 | 6 | rtl_path: "" 7 | 8 | top_level_file: "" 9 | top_level_module: "" 10 | rtl_file_format: "" 11 | 12 | clock_signal: "" 13 | reset_signal: "" 14 | 15 | # Delimiters for parameter files 16 | use_parameters: Yes 17 | start_delimiter: " //
" 18 | stop_delimiter: " //
" 19 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Config_Generation/07_Disjunctive_Union/_settings.yml: -------------------------------------------------------------------------------- 1 | 2 | start_delimiter: " // test parameters begin" 3 | stop_delimiter: " // test parameters end" 4 | 5 | generate_configurations: Yes 6 | generate_configurations_settings: 7 | template: "parameter VALUE = ${union_var};" 8 | name: "config_${union_var}" 9 | variables: 10 | var_1: 11 | type: list 12 | settings: 13 | list: [50, 60] 14 | var_2: 15 | type: list 16 | settings: 17 | list: [10, 50, 100] 18 | union_var: 19 | type: disjunctive_union 20 | settings: 21 | sources: [var_1, var_2] 22 | -------------------------------------------------------------------------------- /sources/odatix_init/odatix_userconfig/clean.yml: -------------------------------------------------------------------------------- 1 | 2 | ############################################## 3 | # Odatix Clean Settings 4 | ############################################## 5 | 6 | remove_list: 7 | # Design Compiler 8 | - alib-* 9 | - LIB_*_autoread 10 | - command.log 11 | - default.svf 12 | - filenames*.log 13 | - change_names_verilog 14 | - ARCH 15 | - ENTI 16 | - "*.syn" 17 | - "*.mr" 18 | 19 | # Vivado 20 | - .Xil 21 | - "*.jou" 22 | - hs_err_*.log 23 | - vivado*.log 24 | - tight_setup_hold_pins.txt 25 | - clockInfo.txt 26 | 27 | # Vitis 28 | - vitis_hls.log 29 | 30 | # Odatix 31 | - odatix_error.log 32 | - odatix-explorer_error.log 33 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/clean.yml: -------------------------------------------------------------------------------- 1 | 2 | ############################################## 3 | # Odatix Clean Settings 4 | ############################################## 5 | 6 | remove_list: 7 | # Design Compiler 8 | - alib-* 9 | - LIB_*_autoread 10 | - command.log 11 | - default.svf 12 | - filenames*.log 13 | - change_names_verilog 14 | - ARCH 15 | - ENTI 16 | - "*.syn" 17 | - "*.mr" 18 | 19 | # Vivado 20 | - .Xil 21 | - "*.jou" 22 | - hs_err_*.log 23 | - vivado*.log 24 | - tight_setup_hold_pins.txt 25 | - clockInfo.txt 26 | 27 | # Vitis 28 | - vitis_hls.log 29 | 30 | # Odatix 31 | - odatix_error.log 32 | - odatix-explorer_error.log 33 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Python 3 | **/__pycache__ 4 | pipx/Asterism* 5 | pipx/build 6 | 7 | # Work 8 | work/* 9 | work* 10 | 11 | # Vivado 12 | **/.Xil 13 | **/vivado*.jou 14 | **/vivado*.log 15 | **/vivado*.str 16 | **/tight_setup_hold_pins.txt 17 | hs_err_*.log 18 | .run_vivado_success 19 | 20 | # Design Compiler 21 | .nfs* 22 | alib-* 23 | command.log 24 | change_names_verilog 25 | default.svf 26 | filenames*.log 27 | LIB_*_autoread 28 | 29 | # Results 30 | results/* 31 | 32 | # Build 33 | sources/build 34 | sources/dist 35 | build 36 | dist 37 | release 38 | venv* 39 | **/*.egg-info 40 | 41 | # Others 42 | **/.stamp.* 43 | examples 44 | odatix_userconfig 45 | odatix.yml 46 | 47 | # Docs 48 | docs/build 49 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Config_Generation/09_Difference/_settings.yml: -------------------------------------------------------------------------------- 1 | 2 | start_delimiter: " // test parameters begin" 3 | stop_delimiter: " // test parameters end" 4 | 5 | generate_configurations: Yes 6 | generate_configurations_settings: 7 | template: "parameter VALUE = ${diff_var};" 8 | name: "config_${diff_var}" 9 | variables: 10 | mult_3: 11 | type: multiples 12 | settings: 13 | base: 3 14 | from: 1 15 | to: 50 16 | mult_4: 17 | type: multiples 18 | settings: 19 | base: 4 20 | from: 1 21 | to: 50 22 | diff_var: 23 | type: difference 24 | settings: 25 | sources: [mult_4, mult_3] 26 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Config_Generation/08_Intersection/_settings.yml: -------------------------------------------------------------------------------- 1 | 2 | start_delimiter: " // test parameters begin" 3 | stop_delimiter: " // test parameters end" 4 | 5 | generate_configurations: Yes 6 | generate_configurations_settings: 7 | template: "parameter VALUE = ${inter_var};" 8 | name: "config_${inter_var}" 9 | variables: 10 | mult_3: 11 | type: multiples 12 | settings: 13 | base: 3 14 | from: 1 15 | to: 50 16 | mult_4: 17 | type: multiples 18 | settings: 19 | base: 4 20 | from: 1 21 | to: 50 22 | inter_var: 23 | type: intersection 24 | settings: 25 | sources: [mult_3, mult_4] 26 | -------------------------------------------------------------------------------- /.readthedocs.yaml: -------------------------------------------------------------------------------- 1 | 2 | # Required 3 | version: 2 4 | 5 | # Set the OS, Python version and other tools you might need 6 | build: 7 | os: ubuntu-22.04 8 | tools: 9 | python: "3.12" 10 | # You can also specify other tool versions: 11 | # nodejs: "19" 12 | # rust: "1.64" 13 | # golang: "1.19" 14 | 15 | # Build documentation in the "docs/" directory with Sphinx 16 | sphinx: 17 | configuration: docs/source/conf.py 18 | 19 | # Optionally build your docs in additional formats such as PDF and ePub 20 | # formats: 21 | # - pdf 22 | # - epub 23 | 24 | # Optional but recommended, declare the Python requirements required 25 | # to build your documentation 26 | python: 27 | install: 28 | - requirements: docs/requirements.txt -------------------------------------------------------------------------------- /sources/odatix_examples/examples/shift_register_sv/shift_register.sv: -------------------------------------------------------------------------------- 1 | 2 | module shift_register #( 3 | parameter BITS = 8 4 | )( 5 | input wire i_clk, 6 | input wire i_rst, 7 | input wire i_bit_in, 8 | input wire i_right_nleft, 9 | output wire [BITS-1:0] o_value 10 | ); 11 | 12 | logic [BITS-1:0] shift_reg; 13 | 14 | always_ff @(posedge i_clk) begin 15 | if (i_rst) begin 16 | shift_reg <= 0; 17 | end else begin 18 | if (i_right_nleft) begin 19 | shift_reg <= {i_bit_in, shift_reg[BITS-1:1]}; 20 | end else begin 21 | shift_reg <= {shift_reg[BITS-2:0], i_bit_in}; 22 | end 23 | end 24 | end 25 | 26 | assign o_value = shift_reg; 27 | 28 | endmodule 29 | -------------------------------------------------------------------------------- /sources/odatix_examples/examples/counter_verilog/counter.v: -------------------------------------------------------------------------------- 1 | 2 | module counter #( 3 | parameter BITS = 8 4 | )( 5 | input wire clock, 6 | input wire reset, 7 | input wire i_init, 8 | input wire i_inc_dec, 9 | output wire [BITS-1:0] o_value 10 | ); 11 | 12 | reg [BITS-1:0] value; 13 | 14 | always @(posedge clock) begin 15 | if (reset) begin 16 | value <= 0; 17 | end else begin 18 | if (i_init) begin 19 | value <= 0; 20 | end else begin 21 | if (i_inc_dec) begin 22 | value <= value + 1; 23 | end else begin 24 | value <= value - 1; 25 | end 26 | end 27 | end 28 | end 29 | 30 | assign o_value = value; 31 | 32 | endmodule 33 | -------------------------------------------------------------------------------- /sources/odatix_examples/examples/counter_sv/counter.sv: -------------------------------------------------------------------------------- 1 | 2 | module counter #( 3 | parameter BITS = 8 4 | )( 5 | input wire clock, 6 | input wire reset, 7 | input wire i_init, 8 | input wire i_inc_dec, 9 | output wire [BITS-1:0] o_value 10 | ); 11 | 12 | logic [BITS-1:0] value; 13 | 14 | always_ff @(posedge clock) begin 15 | if (reset) begin 16 | value <= 0; 17 | end else begin 18 | if (i_init) begin 19 | value <= 0; 20 | end else begin 21 | if (i_inc_dec) begin 22 | value <= value + 1; 23 | end else begin 24 | value <= value - 1; 25 | end 26 | end 27 | end 28 | end 29 | 30 | assign o_value = value; 31 | 32 | endmodule 33 | -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line, and also 5 | # from the environment for the first two. 6 | SPHINXOPTS ?= 7 | SPHINXBUILD ?= sphinx-build 8 | SOURCEDIR = source 9 | BUILDDIR = build 10 | 11 | # Put it first so that "make" without argument is like "make help". 12 | help: 13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 14 | 15 | .PHONY: help Makefile 16 | 17 | open: 18 | @firefox file://$(shell pwd)/build/html/index.html 19 | 20 | # Catch-all target: route all unknown targets to Sphinx using the new 21 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 22 | %: Makefile 23 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 24 | -------------------------------------------------------------------------------- /sources/odatix_examples/examples/mult/mult.sv: -------------------------------------------------------------------------------- 1 | 2 | module mult #( 3 | parameter BITS = 8 4 | )( 5 | input wire i_clk, 6 | input wire i_rst, 7 | input wire [BITS-1:0] i_op_a, 8 | input wire [BITS-1:0] i_op_b, 9 | output wire [BITS-1:0] o_res 10 | ); 11 | 12 | reg [BITS-1:0] op_a; 13 | reg [BITS-1:0] op_b; 14 | reg [BITS-1:0] value; 15 | 16 | // register inputs 17 | always_ff @(posedge i_clk) begin 18 | if (i_rst) begin 19 | op_a <= 0; 20 | op_b <= 0; 21 | end else begin 22 | op_a <= i_op_a; 23 | op_b <= i_op_b; 24 | end 25 | end 26 | 27 | // multiplier logic 28 | always_ff @(posedge i_clk) begin 29 | if (i_rst) begin 30 | value <= 0; 31 | end else begin 32 | value <= op_a * op_b; 33 | end 34 | end 35 | 36 | assign o_res = value; 37 | 38 | endmodule 39 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Config_Generation/10_Multiple_Parameters/_settings.yml: -------------------------------------------------------------------------------- 1 | 2 | start_delimiter: " // test parameters begin" 3 | stop_delimiter: " // test parameters end" 4 | 5 | generate_configurations: Yes 6 | generate_configurations_settings: 7 | template: "\n parameter p_dmem_depth_pw2 = $dmem_depth,\n parameter p_imem_depth_pw2 = $imem_depth,\n" 8 | name: "DMEM_${dmem_depth_pw2}-IMEM_${imem_depth_pw2}" 9 | variables: 10 | dmem_depth: 11 | type: range 12 | settings: 13 | from: 8 14 | to: 10 15 | dmem_depth_pw2: 16 | type: function 17 | settings: 18 | op: 2^$dmem_depth 19 | imem_depth: 20 | type: range 21 | settings: 22 | from: 8 23 | to: 10 24 | imem_depth_pw2: 25 | type: function 26 | settings: 27 | op: 2^$imem_depth 28 | -------------------------------------------------------------------------------- /docs/source/userguide/index.rst: -------------------------------------------------------------------------------- 1 | Advanced Functionalities 2 | ======================== 3 | 4 | .. toctree:: 5 | :maxdepth: 1 6 | :hidden: 7 | 8 | parameter_domains 9 | configuration_generation 10 | 11 | This sections presents advanced Odatix functionalities. 12 | 13 | .. grid:: 14 | 15 | .. grid-item-card:: Parameter Domains 16 | :link: parameter_domains.html 17 | :text-align: center 18 | 19 | Define sets of parameters to leverage architecture parameter combination. Parameter domains are particularly useful when dealing with a large set of parameters. 20 | 21 | .. grid-item-card:: Configuration Generation 22 | :link: configuration_generation.html 23 | :text-align: center 24 | 25 | Automatically generate architecture parameters. Configuration generation is particularly useful when dealing with a large set of parameters. 26 | -------------------------------------------------------------------------------- /sources/odatix_eda_tools/dummy/metrics.yml: -------------------------------------------------------------------------------- 1 | ############################################## 2 | # Metrics for dummy tool 3 | ############################################## 4 | 5 | fmax_synthesis_metrics: 6 | Fmax: 7 | type: regex 8 | settings: 9 | file: log/frequency_search.log 10 | pattern: ".*Highest frequency with timing constraints being met: ([0-9_]+) MHz" 11 | group_id: 1 12 | format: "%.0f" 13 | unit: MHz 14 | 15 | custom_freq_synthesis_metrics: 16 | Frequency: 17 | type: regex 18 | settings: 19 | file: frequency.txt 20 | pattern: "([0-9_]+) MHz" 21 | group_id: 1 22 | format: "%.0f" 23 | unit: MHz 24 | 25 | metrics: 26 | Param_Domains: 27 | type: yaml 28 | error_if_missing: No 29 | settings: 30 | file: param_domains.yml 31 | 32 | Param_Domains: 33 | type: yaml 34 | error_if_missing: No 35 | settings: 36 | file: param_domains.yml 37 | -------------------------------------------------------------------------------- /docs/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | pushd %~dp0 4 | 5 | REM Command file for Sphinx documentation 6 | 7 | if "%SPHINXBUILD%" == "" ( 8 | set SPHINXBUILD=sphinx-build 9 | ) 10 | set SOURCEDIR=source 11 | set BUILDDIR=build 12 | 13 | if "%1" == "" goto help 14 | 15 | %SPHINXBUILD% >NUL 2>NUL 16 | if errorlevel 9009 ( 17 | echo. 18 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx 19 | echo.installed, then set the SPHINXBUILD environment variable to point 20 | echo.to the full path of the 'sphinx-build' executable. Alternatively you 21 | echo.may add the Sphinx directory to PATH. 22 | echo. 23 | echo.If you don't have Sphinx installed, grab it from 24 | echo.http://sphinx-doc.org/ 25 | exit /b 1 26 | ) 27 | 28 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 29 | goto end 30 | 31 | :help 32 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 33 | 34 | :end 35 | popd 36 | -------------------------------------------------------------------------------- /sources/odatix_eda_tools/openlane/tool.yml: -------------------------------------------------------------------------------- 1 | ############################################## 2 | # Settings for OpenLane 3 | ############################################## 4 | 5 | # Group processes 6 | process_group: False 7 | report_path: runs/odatix/reports 8 | 9 | # Default metrics file for this tool 10 | default_metrics_file: $eda_tools_path/openlane/metrics.yml 11 | 12 | unix: 13 | 14 | # Command to check if the tool is installed 15 | tool_test_command: 16 | - make -f $eda_tools_path/openlane/makefile.mk test_tool 17 | - TOOL_INSTALL_PATH=$tool_install_path 18 | 19 | # Command for fmax synthesis 20 | fmax_synthesis_command: 21 | - make -f $eda_tools_path/openlane/makefile.mk synth_fmax 22 | - EDA_TOOLS_PATH=$eda_tools_path 23 | - TOOL_INSTALL_PATH=$tool_install_path 24 | - WORK_DIR=$work_path 25 | - REPORT_DIR=$work_path/runs/odatix/reports 26 | - SCRIPT_DIR=$script_path 27 | - LOG_DIR=$log_path 28 | - LIB_NAME=$lib_name 29 | -------------------------------------------------------------------------------- /sources/odatix_examples/examples/shift_register_chisel/src/main/scala/ShiftRegister.scala: -------------------------------------------------------------------------------- 1 | import chisel3._ 2 | import chisel3.util._ 3 | 4 | class ShiftRegister(BITS: Int) extends Module { 5 | val io = IO(new Bundle { 6 | val i_bit_in = Input(Bool()) 7 | val i_right_nleft = Input(Bool()) 8 | val o_value = Output(UInt(BITS.W)) 9 | }) 10 | 11 | val shift_reg = RegInit(0.U(BITS.W)) 12 | 13 | when(io.i_right_nleft) { 14 | shift_reg := Cat(io.i_bit_in, shift_reg(BITS-1, 1)) 15 | } .otherwise { 16 | shift_reg := Cat(shift_reg(BITS-2, 0), io.i_bit_in) 17 | } 18 | 19 | io.o_value := shift_reg 20 | } 21 | 22 | object ShiftRegister extends App { 23 | _root_.circt.stage.ChiselStage.emitSystemVerilog( 24 | new ShiftRegister(8), 25 | firtoolOpts = Array.concat( 26 | Array( 27 | "--disable-all-randomization", 28 | "--strip-debug-info", 29 | "--split-verilog" 30 | ), 31 | args 32 | ) 33 | ) 34 | } -------------------------------------------------------------------------------- /sources/odatix_eda_tools/design_compiler/tool.yml: -------------------------------------------------------------------------------- 1 | 2 | ############################################## 3 | # Settings for Design Compiler 4 | ############################################## 5 | 6 | process_group: True 7 | 8 | # Default metrics file for this tool 9 | default_metrics_file: $eda_tools_path/design_compiler/metrics.yml 10 | 11 | unix: 12 | 13 | # Command to check if the tool is installed 14 | tool_test_command: 15 | - make -f $eda_tools_path/design_compiler/makefile.mk test_tool 16 | 17 | # Command for fmax synthesis 18 | fmax_synthesis_command: 19 | - make -f $eda_tools_path/design_compiler/makefile.mk synth_fmax 20 | - WORK_DIR=$work_path 21 | - SCRIPT_DIR=$script_path 22 | - LOG_DIR=$log_path 23 | 24 | # Command for custom frequency synthesis 25 | custom_freq_synthesis_command: 26 | - make -f $eda_tools_path/design_compiler/makefile.mk synth 27 | - WORK_DIR=$work_path 28 | - SCRIPT_DIR=$script_path 29 | - LOG_DIR=$log_path 30 | -------------------------------------------------------------------------------- /sources/odatix_examples/examples/alu_chisel/build.sbt: -------------------------------------------------------------------------------- 1 | // ****************************** 2 | // PARAMETERS 3 | // ****************************** 4 | ThisBuild / scalaVersion := "2.13.10" 5 | ThisBuild / version := "0.1.0" 6 | ThisBuild / organization := "IMS Laboratory" 7 | val chiselVersion = "5.0.0" 8 | 9 | val libDep = Seq( 10 | "org.chipsalliance" %% "chisel" % chiselVersion, 11 | "edu.berkeley.cs" %% "chiseltest" % "5.0.0" % "test" 12 | ) 13 | 14 | val scalacOpt = Seq( 15 | "-language:reflectiveCalls", 16 | "-deprecation", 17 | "-feature", 18 | "-Xcheckinit", 19 | "-Ymacro-annotations" 20 | ) 21 | 22 | // ****************************** 23 | // PROJECTS 24 | // ****************************** 25 | lazy val main = (project in file(".")) 26 | .settings( 27 | name := "main", 28 | libraryDependencies ++= libDep, 29 | scalacOptions ++= scalacOpt, 30 | addCompilerPlugin("org.chipsalliance" % "chisel-plugin" % chiselVersion cross CrossVersion.full) 31 | ) 32 | -------------------------------------------------------------------------------- /sources/odatix_examples/examples/rom_chisel/build.sbt: -------------------------------------------------------------------------------- 1 | // ****************************** 2 | // PARAMETERS 3 | // ****************************** 4 | ThisBuild / scalaVersion := "2.13.10" 5 | ThisBuild / version := "0.1.0" 6 | ThisBuild / organization := "IMS Laboratory" 7 | val chiselVersion = "5.0.0" 8 | 9 | val libDep = Seq( 10 | "org.chipsalliance" %% "chisel" % chiselVersion, 11 | "edu.berkeley.cs" %% "chiseltest" % "5.0.0" % "test" 12 | ) 13 | 14 | val scalacOpt = Seq( 15 | "-language:reflectiveCalls", 16 | "-deprecation", 17 | "-feature", 18 | "-Xcheckinit", 19 | "-Ymacro-annotations" 20 | ) 21 | 22 | // ****************************** 23 | // PROJECTS 24 | // ****************************** 25 | lazy val main = (project in file(".")) 26 | .settings( 27 | name := "main", 28 | libraryDependencies ++= libDep, 29 | scalacOptions ++= scalacOpt, 30 | addCompilerPlugin("org.chipsalliance" % "chisel-plugin" % chiselVersion cross CrossVersion.full) 31 | ) 32 | -------------------------------------------------------------------------------- /sources/odatix_examples/examples/counter_chisel/build.sbt: -------------------------------------------------------------------------------- 1 | // ****************************** 2 | // PARAMETERS 3 | // ****************************** 4 | ThisBuild / scalaVersion := "2.13.10" 5 | ThisBuild / version := "0.1.0" 6 | ThisBuild / organization := "IMS Laboratory" 7 | val chiselVersion = "5.0.0" 8 | 9 | val libDep = Seq( 10 | "org.chipsalliance" %% "chisel" % chiselVersion, 11 | "edu.berkeley.cs" %% "chiseltest" % "5.0.0" % "test" 12 | ) 13 | 14 | val scalacOpt = Seq( 15 | "-language:reflectiveCalls", 16 | "-deprecation", 17 | "-feature", 18 | "-Xcheckinit", 19 | "-Ymacro-annotations" 20 | ) 21 | 22 | // ****************************** 23 | // PROJECTS 24 | // ****************************** 25 | lazy val main = (project in file(".")) 26 | .settings( 27 | name := "main", 28 | libraryDependencies ++= libDep, 29 | scalacOptions ++= scalacOpt, 30 | addCompilerPlugin("org.chipsalliance" % "chisel-plugin" % chiselVersion cross CrossVersion.full) 31 | ) 32 | -------------------------------------------------------------------------------- /sources/odatix_examples/examples/shift_register_chisel/build.sbt: -------------------------------------------------------------------------------- 1 | // ****************************** 2 | // PARAMETERS 3 | // ****************************** 4 | ThisBuild / scalaVersion := "2.13.10" 5 | ThisBuild / version := "0.1.0" 6 | ThisBuild / organization := "IMS Laboratory" 7 | val chiselVersion = "5.0.0" 8 | 9 | val libDep = Seq( 10 | "org.chipsalliance" %% "chisel" % chiselVersion, 11 | "edu.berkeley.cs" %% "chiseltest" % "5.0.0" % "test" 12 | ) 13 | 14 | val scalacOpt = Seq( 15 | "-language:reflectiveCalls", 16 | "-deprecation", 17 | "-feature", 18 | "-Xcheckinit", 19 | "-Ymacro-annotations" 20 | ) 21 | 22 | // ****************************** 23 | // PROJECTS 24 | // ****************************** 25 | lazy val main = (project in file(".")) 26 | .settings( 27 | name := "main", 28 | libraryDependencies ++= libDep, 29 | scalacOptions ++= scalacOpt, 30 | addCompilerPlugin("org.chipsalliance" % "chisel-plugin" % chiselVersion cross CrossVersion.full) 31 | ) 32 | -------------------------------------------------------------------------------- /sources/odatix_eda_tools/_common/exit.tcl: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | exit 0 23 | -------------------------------------------------------------------------------- /sources/odatix_examples/examples/counter_chisel/src/main/scala/counter.scala: -------------------------------------------------------------------------------- 1 | package example 2 | 3 | import chisel3._ 4 | import chisel3.util._ 5 | import _root_.circt.stage.{ChiselStage} 6 | 7 | class Counter(BITS: Int) extends Module { 8 | override val desiredName = s"counter" 9 | 10 | val i_init = IO(Input(Bool())) 11 | val i_inc_dec = IO(Input(Bool())) 12 | val o_value = IO(Output(UInt(BITS.W))) 13 | 14 | val value = RegInit(0.U(BITS.W)) 15 | 16 | when (i_init) { 17 | value := 0.U 18 | } .otherwise { 19 | when (i_inc_dec) { 20 | value := value + 1.U 21 | } .otherwise { 22 | value := value - 1.U 23 | } 24 | } 25 | 26 | o_value := value 27 | 28 | } 29 | 30 | object Counter extends App { 31 | _root_.circt.stage.ChiselStage.emitSystemVerilog( 32 | new Counter(8), 33 | firtoolOpts = Array.concat( 34 | Array( 35 | "--disable-all-randomization", 36 | "--strip-debug-info", 37 | "--split-verilog" 38 | ), 39 | args 40 | ) 41 | ) 42 | } -------------------------------------------------------------------------------- /sources/odatix_examples/examples/alu_sv/alu_top.sv: -------------------------------------------------------------------------------- 1 | `include "pck_control.sv" 2 | 3 | module alu_top 4 | import pck_control::*; 5 | #( 6 | parameter BITS = 8 7 | )( 8 | input wire i_clk, 9 | input wire i_rst, 10 | input wire [4:0] i_sel_op, 11 | input wire [BITS-1:0] i_op_a, 12 | input wire [BITS-1:0] i_op_b, 13 | output wire [BITS-1:0] o_res 14 | ); 15 | 16 | reg [BITS-1:0] op_a; 17 | reg [BITS-1:0] op_b; 18 | sel_alu_op_e sel_op; 19 | 20 | // register inputs 21 | always_ff @(posedge i_clk) begin 22 | if (i_rst) begin 23 | op_a <= 0; 24 | op_b <= 0; 25 | sel_op <= alu_nop; 26 | end else begin 27 | op_a <= i_op_a; 28 | op_b <= i_op_b; 29 | sel_op <= sel_alu_op_e'(i_sel_op); 30 | end 31 | end 32 | 33 | alu #( 34 | .BITS ( BITS ) 35 | ) inst_alu ( 36 | .i_clk ( i_clk ), 37 | .i_rst ( i_rst ), 38 | .i_sel_op ( sel_op ), 39 | .i_op_a ( op_a ), 40 | .i_op_b ( op_b ), 41 | .o_res ( o_res ) 42 | ); 43 | endmodule 44 | -------------------------------------------------------------------------------- /sources/odatix_init/odatix_userconfig/target_vivado.yml: -------------------------------------------------------------------------------- 1 | 2 | ############################################## 3 | # Target settings for vivado 4 | ############################################## 5 | 6 | constraint_file: constraints.xdc 7 | 8 | tool_install_path: "" # Vivado should be in your $PATH 9 | 10 | force_single_thread: No # Setting this to 'Yes' may improve performance with a high number of parallel jobs 11 | 12 | script_copy_enable: No 13 | script_copy_source: "/dev/null" 14 | 15 | # FPGA target 16 | targets: 17 | # - xc7s6-cpga196-1 18 | # - xc7s25-csga225-1 19 | # - xc7a15t-cpg236-1 20 | # - xc7a35t-cpg236-1 21 | - xc7a100t-csg324-1 22 | # - xc7k70t-fbg676-2 23 | # - xc7k70t-fbg676-3 24 | # - xc7k160t-fbg484-2 25 | # - xc7k160t-fbg484-3 26 | # - xc7k325t-ffg900-2 27 | # - xc7v585t-ffg1761-2 28 | # - xc7v585t-ffg1761-3 29 | # - xcku035-fbva676-2-e 30 | # - xcku035-fbva676-3-e 31 | # - xcvu065-ffvc1517-2-e 32 | # - xcvu065-ffvc1517-3-e 33 | # - xcku3p-ffva676-2-e 34 | # - xcku3p-ffva676-3-e 35 | # - xcvu3p-ffvc1517-2-e 36 | # - xcvu3p-ffvc1517-3-e 37 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/target_vivado.yml: -------------------------------------------------------------------------------- 1 | 2 | ############################################## 3 | # Target settings for vivado 4 | ############################################## 5 | 6 | constraint_file: constraints.xdc 7 | 8 | tool_install_path: "" # Vivado should be in your $PATH 9 | 10 | force_single_thread: No # Setting this to 'Yes' may improve performance with a high number of parallel jobs 11 | 12 | script_copy_enable: No 13 | script_copy_source: "/dev/null" 14 | 15 | # FPGA target 16 | targets: 17 | # - xc7s6-cpga196-1 18 | # - xc7s25-csga225-1 19 | # - xc7a15t-cpg236-1 20 | # - xc7a35t-cpg236-1 21 | - xc7a100t-csg324-1 22 | # - xc7k70t-fbg676-2 23 | # - xc7k70t-fbg676-3 24 | # - xc7k160t-fbg484-2 25 | # - xc7k160t-fbg484-3 26 | # - xc7k325t-ffg900-2 27 | # - xc7v585t-ffg1761-2 28 | # - xc7v585t-ffg1761-3 29 | # - xcku035-fbva676-2-e 30 | # - xcku035-fbva676-3-e 31 | # - xcvu065-ffvc1517-2-e 32 | # - xcvu065-ffvc1517-3-e 33 | # - xcku3p-ffva676-2-e 34 | # - xcku3p-ffva676-3-e 35 | # - xcvu3p-ffvc1517-2-e 36 | # - xcvu3p-ffvc1517-3-e 37 | -------------------------------------------------------------------------------- /run_odatix.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | import sources.odatix.odatix_main as odatix_main 23 | 24 | if __name__ == "__main__": 25 | odatix_main.main() 26 | -------------------------------------------------------------------------------- /run_odatix_gui.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | import sources.odatix.odatix_gui as odatix_gui 23 | 24 | if __name__ == "__main__": 25 | odatix_gui.main() 26 | -------------------------------------------------------------------------------- /sources/odatix_examples/examples/alu_chisel/src/main/scala/ALUTop.scala: -------------------------------------------------------------------------------- 1 | import chisel3._ 2 | import chisel3.util._ 3 | import pck_control.ALUOp 4 | 5 | class ALUTop(BITS: Int) extends Module { 6 | val io = IO(new Bundle { 7 | val i_sel_op = Input(UInt(4.W)) 8 | val i_op_a = Input(UInt(BITS.W)) 9 | val i_op_b = Input(UInt(BITS.W)) 10 | val o_res = Output(UInt(BITS.W)) 11 | }) 12 | 13 | val op_a = RegInit(0.U(BITS.W)) 14 | val op_b = RegInit(0.U(BITS.W)) 15 | val sel_op = RegInit(ALUOp.alu_nop) 16 | 17 | op_a := io.i_op_a 18 | op_b := io.i_op_b 19 | sel_op := ALUOp(io.i_sel_op) 20 | 21 | val alu = Module(new ALU(BITS)) 22 | alu.io.i_sel_op := sel_op 23 | alu.io.i_op_a := op_a 24 | alu.io.i_op_b := op_b 25 | io.o_res := alu.io.o_res 26 | } 27 | 28 | object ALUTop extends App { 29 | _root_.circt.stage.ChiselStage.emitSystemVerilog( 30 | new ALUTop(8), 31 | firtoolOpts = Array.concat( 32 | Array( 33 | "--disable-all-randomization", 34 | "--strip-debug-info", 35 | "--split-verilog" 36 | ), 37 | args 38 | ) 39 | ) 40 | } -------------------------------------------------------------------------------- /sources/odatix_examples/examples/counter_vhdl/counter.vhdl: -------------------------------------------------------------------------------- 1 | library IEEE; 2 | use IEEE.STD_LOGIC_1164.ALL; 3 | use IEEE.NUMERIC_STD.ALL; 4 | 5 | entity counter is 6 | generic ( 7 | BITS : integer := 8 8 | ); 9 | port ( 10 | clock : in std_logic; 11 | reset : in std_logic; 12 | i_init : in std_logic; 13 | i_inc_dec : in std_logic; 14 | o_value : out std_logic_vector(BITS-1 downto 0) 15 | ); 16 | end entity counter; 17 | 18 | architecture Behavioral of counter is 19 | signal value : unsigned(BITS-1 downto 0); 20 | begin 21 | process(clock) 22 | begin 23 | if rising_edge(clock) then 24 | if reset = '1' then 25 | value <= (others => '0'); 26 | else 27 | if i_init = '1' then 28 | value <= (others => '0'); 29 | else 30 | if i_inc_dec = '1' then 31 | value <= value + 1; 32 | else 33 | value <= value - 1; 34 | end if; 35 | end if; 36 | end if; 37 | end if; 38 | end process; 39 | 40 | o_value <= std_logic_vector(value); 41 | 42 | end architecture Behavioral; 43 | -------------------------------------------------------------------------------- /sources/odatix_init/odatix_userconfig/fmax_synthesis_settings.yml: -------------------------------------------------------------------------------- 1 | 2 | ############################################## 3 | # Odatix settings for fmax synthesis 4 | ############################################## 5 | --- 6 | 7 | # overwrite existing results 8 | overwrite: No # overridden by -o / --overwrite 9 | 10 | # prompt 'Continue? (Y/n)' after settings checks 11 | ask_continue: Yes # overridden by -y / --noask 12 | 13 | # exit monitor when all jobs are done 14 | exit_when_done: No # overridden by -E / --exit 15 | 16 | # size of the log history per job in the monitor 17 | log_size_limit: 300 # overridden by --logsize 18 | 19 | # maximum number of parallel jobs 20 | nb_jobs: 8 # overridden by -j / --jobs 21 | 22 | # targeted architectures 23 | architectures: 24 | 25 | #--------------------------------------------# 26 | # Add your own designs! 27 | #--------------------------------------------# 28 | 29 | #- Your_Design/Your_1st_Configuration 30 | #- Your_Design/Your_2nd_Configuration 31 | #- Your_Design/Your_3rd_Configuration 32 | 33 | # or 34 | 35 | # - Your_Design/* 36 | 37 | ... 38 | -------------------------------------------------------------------------------- /run_odatix_explorer.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | import sources.odatix.odatix_explorer as odatix_explorer 23 | 24 | if __name__ == "__main__": 25 | odatix_explorer.main() 26 | -------------------------------------------------------------------------------- /sources/odatix_init/odatix_userconfig/custom_freq_synthesis_settings.yml: -------------------------------------------------------------------------------- 1 | 2 | ############################################## 3 | # Odatix settings for custom freq synthesis 4 | ############################################## 5 | --- 6 | 7 | # overwrite existing results 8 | overwrite: No # overridden by -o / --overwrite 9 | 10 | # prompt 'Continue? (Y/n)' after settings checks 11 | ask_continue: Yes # overridden by -y / --noask 12 | 13 | # exit monitor when all jobs are done 14 | exit_when_done: No # overridden by -E / --exit 15 | 16 | # size of the log history per job in the monitor 17 | log_size_limit: 300 # overridden by --logsize 18 | 19 | # maximum number of parallel jobs 20 | nb_jobs: 8 # overridden by -j / --jobs 21 | 22 | # targeted architectures 23 | architectures: 24 | 25 | #--------------------------------------------# 26 | # Add your own designs! 27 | #--------------------------------------------# 28 | 29 | #- Your_Design/Your_1st_Configuration 30 | #- Your_Design/Your_2nd_Configuration 31 | #- Your_Design/Your_3rd_Configuration 32 | 33 | # or 34 | 35 | # - Your_Design/* 36 | 37 | ... 38 | -------------------------------------------------------------------------------- /sources/odatix/gui/css_helper.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | class Style: 23 | visible_div = {"display": "block"} 24 | visible = {"display": "flex"} 25 | hidden = {"display": "none"} 26 | -------------------------------------------------------------------------------- /sources/odatix/explorer/css_helper.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | class Style: 23 | visible_div = {"display": "block"} 24 | visible = {"display": "flex"} 25 | hidden = {"display": "none"} 26 | -------------------------------------------------------------------------------- /sources/odatix_init/odatix_userconfig/simulations_settings.yml: -------------------------------------------------------------------------------- 1 | 2 | ############################################## 3 | # Odatix settings for simulations 4 | ############################################## 5 | --- 6 | 7 | # overwrite existing results 8 | overwrite: No # overridden by -o / --overwrite 9 | 10 | # prompt 'Continue? (Y/n)' after settings checks 11 | ask_continue: No # overridden by -y / --noask 12 | 13 | # exit monitor when all jobs are done 14 | exit_when_done: Yes # overridden by -E / --exit 15 | 16 | # size of the log history per job in the monitor 17 | log_size_limit: 300 # overridden by --logsize 18 | 19 | # maximum number of parallel jobs 20 | nb_jobs: 8 # overridden by -j / --jobs 21 | 22 | # targeted simulations 23 | simulations: 24 | 25 | #--------------------------------------------# 26 | # Add your own designs! 27 | #--------------------------------------------# 28 | 29 | #- Your_Simulation: 30 | # - Your_Design/Your_1st_Configuration 31 | # - Your_Design/Your_2nd_Configuration 32 | # - Your_Design/Your_3rd_Configuration 33 | 34 | # or 35 | 36 | #- Your_Simulation: 37 | # - Your_Design/* 38 | 39 | ... 40 | -------------------------------------------------------------------------------- /docs/source/installation/index.rst: -------------------------------------------------------------------------------- 1 | Installation 2 | ============ 3 | 4 | **Odatix** can be installed in several ways. 5 | 6 | For standard use, the preferred option is installation from PyPI. 7 | 8 | For developers looking to modify Odatix, it can be installed from the source code. 9 | Additionally, it is possible to use Odatix without installing it by running it directly from the source code using the ``run_odatix.py`` and ``run_odatix_explorer.py`` scripts. 10 | 11 | .. toctree:: 12 | :maxdepth: 1 13 | :hidden: 14 | 15 | install_from_pypi 16 | install_from_sources 17 | install_eda_tools 18 | 19 | 20 | .. grid:: 21 | 22 | .. grid-item-card:: Install from Pypi 23 | :link: install_from_pypi.html 24 | :text-align: center 25 | 26 | (Recommended) 27 | 28 | .. grid-item-card:: Install from sources 29 | :link: install_from_sources.html 30 | :text-align: center 31 | 32 | (For developers) 33 | 34 | 35 | Make sure at least one of the supported EDA tools is installed. 36 | 37 | .. card:: Install one of the supported EDA tools 38 | :margin: auto 39 | :width: 50% 40 | :link: install_eda_tools.html 41 | :text-align: center -------------------------------------------------------------------------------- /sources/odatix_eda_tools/dummy/tool.yml: -------------------------------------------------------------------------------- 1 | ############################################## 2 | # Settings for dummy tool 3 | ############################################## 4 | 5 | # Group processes 6 | process_group: True 7 | 8 | # Default metrics file for this tool 9 | default_metrics_file: "$eda_tools_path/dummy/metrics.yml" 10 | 11 | unix: 12 | # This command is used to check if the tool is installed 13 | tool_test_command: echo 'exit 0' | tclsh 14 | 15 | # You can use lists to define your command with multiple lines 16 | fmax_synthesis_command: tclsh $script_path/find_fmax.tcl 17 | 18 | custom_freq_synthesis_command: tclsh $script_path/custom_freq_synth_script.tcl 19 | 20 | # Log formatting 21 | format: 22 | 23 | # Format tags (replaced by the corresponding format escape code) 24 | tags: 25 | bold: [''] 26 | end: [''] 27 | red: [''] 28 | green: [''] 29 | yellow: [''] 30 | cyan: [''] 31 | grey: [''] 32 | 33 | # Replace sequences (regular expressions) 34 | replace: 35 | - "(Slack \\(VIOLATED\\))": "$1" 36 | - "(Slack \\(MET\\))": "$1" 37 | -------------------------------------------------------------------------------- /sources/odatix/lib/curses_helper.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | import curses 23 | 24 | CTRL_D = 4 25 | 26 | def enable_selection(): 27 | curses.mousemask(0) 28 | 29 | def disable_selection(): 30 | curses.mousemask(curses.ALL_MOUSE_EVENTS | curses.REPORT_MOUSE_POSITION) 31 | -------------------------------------------------------------------------------- /sources/odatix_eda_tools/design_compiler/tcl/update_freq.tcl: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | proc update_freq {freq constraints_file} { 23 | set constraints_file_handler [open $constraints_file w] 24 | puts $constraints_file_handler "$freq" 25 | close $constraints_file_handler 26 | } -------------------------------------------------------------------------------- /sources/odatix/gui/utils.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | import urllib.parse 23 | 24 | def get_key_from_url(url, key): 25 | """ 26 | Extract the value of a specific key from a URL query string. 27 | """ 28 | if not url: 29 | return None 30 | params = urllib.parse.parse_qs(url.lstrip("?")) 31 | return params.get(key, [None])[0] 32 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Shift_Register_sv/_settings.yml: -------------------------------------------------------------------------------- 1 | 2 | ############################################## 3 | # Settings for Shift Register example 4 | ############################################## 5 | 6 | # Source files 7 | rtl_path: "examples/shift_register_sv" 8 | top_level_file: "shift_register.sv" 9 | top_level_module: "shift_register" 10 | 11 | # Signals 12 | clock_signal: "i_clk" 13 | reset_signal: "i_rst" 14 | 15 | # Delimiters for parameter files 16 | use_parameters: Yes 17 | start_delimiter: "#(" 18 | stop_delimiter: ")(" 19 | 20 | # Default frequencies (in MHz) 21 | fmax_synthesis: 22 | lower_bound: 50 23 | upper_bound: 1500 24 | custom_freq_synthesis: 25 | list: [50, 100] 26 | 27 | # Optional target-specific frequencies (in MHz) 28 | xc7a100t-csg324-1: 29 | fmax_synthesis: 30 | lower_bound: 650 31 | upper_bound: 1000 32 | custom_freq_synthesis: 33 | list: [50, 100] 34 | xc7k70t-fbg676-2: 35 | fmax_synthesis: 36 | lower_bound: 450 37 | upper_bound: 2500 38 | custom_freq_synthesis: 39 | list: [50, 100] 40 | XFAB180CMOS: 41 | fmax_synthesis: 42 | lower_bound: 200 43 | upper_bound: 1000 44 | custom_freq_synthesis: 45 | list: [50, 100] 46 | AMS350CMOS: 47 | fmax_synthesis: 48 | lower_bound: 50 49 | upper_bound: 500 50 | custom_freq_synthesis: 51 | list: [50, 100] 52 | -------------------------------------------------------------------------------- /sources/odatix_examples/examples/alu_chisel/src/main/scala/ALU.scala: -------------------------------------------------------------------------------- 1 | import chisel3._ 2 | import chisel3.util._ 3 | import pck_control.ALUOp 4 | 5 | class ALU(BITS: Int) extends Module { 6 | val io = IO(new Bundle { 7 | val i_sel_op = Input(ALUOp()) 8 | val i_op_a = Input(UInt(BITS.W)) 9 | val i_op_b = Input(UInt(BITS.W)) 10 | val o_res = Output(UInt(BITS.W)) 11 | }) 12 | 13 | val value = RegInit(0.U(BITS.W)) 14 | 15 | switch(io.i_sel_op) { 16 | is (ALUOp.alu_add) { value := io.i_op_a + io.i_op_b } 17 | is (ALUOp.alu_sub) { value := io.i_op_a - io.i_op_b } 18 | is (ALUOp.alu_and) { value := io.i_op_a & io.i_op_b } 19 | is (ALUOp.alu_or) { value := io.i_op_a | io.i_op_b } 20 | is (ALUOp.alu_xor) { value := io.i_op_a ^ io.i_op_b } 21 | is (ALUOp.alu_slt) { value := io.i_op_a.asSInt < io.i_op_b.asSInt } 22 | is (ALUOp.alu_sltu) { value := io.i_op_a < io.i_op_b } 23 | is (ALUOp.alu_sll) { value := io.i_op_a << io.i_op_b(log2Ceil(BITS)-1, 0) } 24 | is (ALUOp.alu_srl) { value := io.i_op_a >> io.i_op_b(log2Ceil(BITS)-1, 0) } 25 | is (ALUOp.alu_sra) { value := (io.i_op_a.asSInt >> io.i_op_b(log2Ceil(BITS)-1, 0)).asUInt } 26 | is (ALUOp.alu_cpa) { value := io.i_op_a } 27 | is (ALUOp.alu_cpb) { value := io.i_op_b } 28 | is (ALUOp.alu_nop) { value := 0.U } 29 | } 30 | 31 | io.o_res := value 32 | } 33 | -------------------------------------------------------------------------------- /sources/odatix/explorer/pages/not_found_404.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | import dash 23 | from dash import html 24 | 25 | dash.register_page( 26 | __name__, 27 | name='PageNotFound' 28 | ) 29 | 30 | layout = html.Div( 31 | [ 32 | html.Div( 33 | [ 34 | html.H1("404", id="p404-h1"), 35 | html.H2("Oops, page not found!", id="p404-h2") 36 | ], 37 | id="p404" 38 | ) 39 | ], 40 | id="p404-container" 41 | ) 42 | -------------------------------------------------------------------------------- /sources/odatix_eda_tools/design_compiler/technology/AMS_c35_1V8/synopsys_dc_setup.tcl: -------------------------------------------------------------------------------- 1 | 2 | ######### 3 | ### Define Work Library Location 4 | ######### 5 | #define_design_lib WORK -path "./work" 6 | 7 | ######### 8 | ### retrieve AMS directory path and SYNOPSYS path from the environement variables 9 | ######### 10 | 11 | if {[catch { 12 | set AMSDIR [get_unix_variable AMS_C35_1V8] 13 | } errmsg]} { 14 | set AMSDIR "/opt/ams/" 15 | } 16 | 17 | set SYNDIR [get_unix_variable SYNOPSYS] 18 | 19 | ######### 20 | ### set library paths 21 | ######### 22 | set search_path ". $AMSDIR/synopsys/c35_1.8V /softs/kits/ams/AMS_410_CDS/synopsys/c35_1.8V/ $SYNDIR/libraries/syn $SYNDIR/dw/sim_ver" 23 | set target_library "c35_CORELIB_WC.db c35_IOLIB_WC.db" 24 | 25 | # set synthetic_library dw_foundation.sldb 26 | set link_library "* $target_library $synthetic_library" 27 | 28 | ######### 29 | ### set bus naming style for compliance between .sdf and post syn .vhdl 30 | ######### 31 | set sdfout_no_edge true 32 | #set verilogout_equation false 33 | #set verilogout_no_tri true 34 | #set verilogout_single_bit false 35 | 36 | set hdlout_internal_busses true 37 | set vhdlout_single_bit user 38 | set vhdlout_preserve_hierarchical_types user 39 | set bus_inference_style "%s_%d_" 40 | set bus_naming_style "%s_%d" 41 | set write_name_nets_same_as_ports true 42 | 43 | #puts "USE: set_fix_multiple_port_nets -all [all_designs]" 44 | -------------------------------------------------------------------------------- /sources/odatix_eda_tools/design_compiler/technology/AMS_c35_2V2/synopsys_dc_setup.tcl: -------------------------------------------------------------------------------- 1 | 2 | ######### 3 | ### Define Work Library Location 4 | ######### 5 | #define_design_lib WORK -path "./work" 6 | 7 | ######### 8 | ### retrieve AMS directory path and SYNOPSYS path from the environement variables 9 | ######### 10 | 11 | if {[catch { 12 | set AMSDIR [get_unix_variable AMS_C35_2V2] 13 | } errmsg]} { 14 | set AMSDIR "/opt/ams/" 15 | } 16 | 17 | set SYNDIR [get_unix_variable SYNOPSYS] 18 | 19 | ######### 20 | ### set library paths 21 | ######### 22 | set search_path ". $AMSDIR/synopsys/c35_2.2V /softs/kits/ams/AMS_410_CDS/synopsys/c35_2.2V/ $SYNDIR/libraries/syn $SYNDIR/dw/sim_ver" 23 | set target_library "c35_CORELIB_WC.db c35_IOLIB_WC.db" 24 | 25 | # set synthetic_library dw_foundation.sldb 26 | set link_library "* $target_library $synthetic_library" 27 | 28 | ######### 29 | ### set bus naming style for compliance between .sdf and post syn .vhdl 30 | ######### 31 | set sdfout_no_edge true 32 | #set verilogout_equation false 33 | #set verilogout_no_tri true 34 | #set verilogout_single_bit false 35 | 36 | set hdlout_internal_busses true 37 | set vhdlout_single_bit user 38 | set vhdlout_preserve_hierarchical_types user 39 | set bus_inference_style "%s_%d_" 40 | set bus_naming_style "%s_%d" 41 | set write_name_nets_same_as_ports true 42 | 43 | #puts "USE: set_fix_multiple_port_nets -all [all_designs]" 44 | -------------------------------------------------------------------------------- /sources/odatix_eda_tools/design_compiler/technology/AMS_c35_2V7/synopsys_dc_setup.tcl: -------------------------------------------------------------------------------- 1 | 2 | ######### 3 | ### Define Work Library Location 4 | ######### 5 | #define_design_lib WORK -path "./work" 6 | 7 | ######### 8 | ### retrieve AMS directory path and SYNOPSYS path from the environement variables 9 | ######### 10 | 11 | if {[catch { 12 | set AMSDIR [get_unix_variable AMS_C35_2V7] 13 | } errmsg]} { 14 | set AMSDIR "/opt/ams/" 15 | } 16 | 17 | set SYNDIR [get_unix_variable SYNOPSYS] 18 | 19 | ######### 20 | ### set library paths 21 | ######### 22 | set search_path ". $AMSDIR/synopsys/c35_2.7V /softs/kits/ams/AMS_410_CDS/synopsys/c35_2.7V/ $SYNDIR/libraries/syn $SYNDIR/dw/sim_ver" 23 | set target_library "c35_CORELIB_WC.db c35_IOLIB_WC.db" 24 | 25 | # set synthetic_library dw_foundation.sldb 26 | set link_library "* $target_library $synthetic_library" 27 | 28 | ######### 29 | ### set bus naming style for compliance between .sdf and post syn .vhdl 30 | ######### 31 | set sdfout_no_edge true 32 | #set verilogout_equation false 33 | #set verilogout_no_tri true 34 | #set verilogout_single_bit false 35 | 36 | set hdlout_internal_busses true 37 | set vhdlout_single_bit user 38 | set vhdlout_preserve_hierarchical_types user 39 | set bus_inference_style "%s_%d_" 40 | set bus_naming_style "%s_%d" 41 | set write_name_nets_same_as_ports true 42 | 43 | #puts "USE: set_fix_multiple_port_nets -all [all_designs]" 44 | -------------------------------------------------------------------------------- /sources/odatix_eda_tools/design_compiler/technology/AMS_c35_3V3/synopsys_dc_setup.tcl: -------------------------------------------------------------------------------- 1 | 2 | ######### 3 | ### Define Work Library Location 4 | ######### 5 | #define_design_lib WORK -path "./work" 6 | 7 | ######### 8 | ### retrieve AMS directory path and SYNOPSYS path from the environement variables 9 | ######### 10 | 11 | if {[catch { 12 | set AMSDIR [get_unix_variable AMS_C35_3V3] 13 | } errmsg]} { 14 | set AMSDIR "/opt/ams/" 15 | } 16 | 17 | set SYNDIR [get_unix_variable SYNOPSYS] 18 | 19 | ######### 20 | ### set library paths 21 | ######### 22 | set search_path ". $AMSDIR/synopsys/c35_3.3V /softs/kits/ams/AMS_410_CDS/synopsys/c35_3.3V/ $SYNDIR/libraries/syn $SYNDIR/dw/sim_ver" 23 | set target_library "c35_CORELIB_WC.db c35_IOLIB_WC.db" 24 | 25 | # set synthetic_library dw_foundation.sldb 26 | set link_library "* $target_library $synthetic_library" 27 | 28 | ######### 29 | ### set bus naming style for compliance between .sdf and post syn .vhdl 30 | ######### 31 | set sdfout_no_edge true 32 | #set verilogout_equation false 33 | #set verilogout_no_tri true 34 | #set verilogout_single_bit false 35 | 36 | set hdlout_internal_busses true 37 | set vhdlout_single_bit user 38 | set vhdlout_preserve_hierarchical_types user 39 | set bus_inference_style "%s_%d_" 40 | set bus_naming_style "%s_%d" 41 | set write_name_nets_same_as_ports true 42 | 43 | #puts "USE: set_fix_multiple_port_nets -all [all_designs]" 44 | -------------------------------------------------------------------------------- /sources/odatix_eda_tools/design_compiler/technology/AMS_h18_1V8/synopsys_dc_setup.tcl: -------------------------------------------------------------------------------- 1 | 2 | ######### 3 | ### Define Work Library Location 4 | ######### 5 | #define_design_lib WORK -path "./work" 6 | 7 | ######### 8 | ### retrieve AMS directory path and SYNOPSYS path from the environement variables 9 | ######### 10 | 11 | if {[catch { 12 | set AMSDIR [get_unix_variable AMS_H18_1V8] 13 | } errmsg]} { 14 | set AMSDIR "/opt/ams/" 15 | } 16 | 17 | set SYNDIR [get_unix_variable SYNOPSYS] 18 | 19 | ######### 20 | ### set library paths 21 | ######### 22 | set search_path ". $AMSDIR/synopsys/h18_1.8V /softs/kits/ams/AMS_411_CDS/synopsys/h18_1.8V/ $SYNDIR/libraries/syn $SYNDIR/dw/sim_ver" 23 | set target_library "h18_CORELIB_WC.db h18_IOLIB_WC.db" 24 | 25 | # set synthetic_library dw_foundation.sldb 26 | set link_library "* $target_library $synthetic_library" 27 | 28 | ######### 29 | ### set bus naming style for compliance between .sdf and post syn .vhdl 30 | ######### 31 | set sdfout_no_edge true 32 | #set verilogout_equation false 33 | #set verilogout_no_tri true 34 | #set verilogout_single_bit false 35 | 36 | set hdlout_internal_busses true 37 | set vhdlout_single_bit user 38 | set vhdlout_preserve_hierarchical_types user 39 | set bus_inference_style "%s_%d_" 40 | set bus_naming_style "%s_%d" 41 | set write_name_nets_same_as_ports true 42 | 43 | #puts "USE: set_fix_multiple_port_nets -all [all_designs]" 44 | -------------------------------------------------------------------------------- /sources/odatix_eda_tools/design_compiler/technology/AMS_h18_2V2/synopsys_dc_setup.tcl: -------------------------------------------------------------------------------- 1 | 2 | ######### 3 | ### Define Work Library Location 4 | ######### 5 | #define_design_lib WORK -path "./work" 6 | 7 | ######### 8 | ### retrieve AMS directory path and SYNOPSYS path from the environement variables 9 | ######### 10 | 11 | if {[catch { 12 | set AMSDIR [get_unix_variable AMS_H18_2V2] 13 | } errmsg]} { 14 | set AMSDIR "/opt/ams/" 15 | } 16 | 17 | set SYNDIR [get_unix_variable SYNOPSYS] 18 | 19 | ######### 20 | ### set library paths 21 | ######### 22 | set search_path ". $AMSDIR/synopsys/h18_2.2V /softs/kits/ams/AMS_411_CDS/synopsys/h18_2.2V/ $SYNDIR/libraries/syn $SYNDIR/dw/sim_ver" 23 | set target_library "h18_CORELIB_WC.db h18_IOLIB_WC.db" 24 | 25 | # set synthetic_library dw_foundation.sldb 26 | set link_library "* $target_library $synthetic_library" 27 | 28 | ######### 29 | ### set bus naming style for compliance between .sdf and post syn .vhdl 30 | ######### 31 | set sdfout_no_edge true 32 | #set verilogout_equation false 33 | #set verilogout_no_tri true 34 | #set verilogout_single_bit false 35 | 36 | set hdlout_internal_busses true 37 | set vhdlout_single_bit user 38 | set vhdlout_preserve_hierarchical_types user 39 | set bus_inference_style "%s_%d_" 40 | set bus_naming_style "%s_%d" 41 | set write_name_nets_same_as_ports true 42 | 43 | #puts "USE: set_fix_multiple_port_nets -all [all_designs]" 44 | -------------------------------------------------------------------------------- /sources/odatix_eda_tools/design_compiler/technology/AMS_h18_2V7/synopsys_dc_setup.tcl: -------------------------------------------------------------------------------- 1 | 2 | ######### 3 | ### Define Work Library Location 4 | ######### 5 | #define_design_lib WORK -path "./work" 6 | 7 | ######### 8 | ### retrieve AMS directory path and SYNOPSYS path from the environement variables 9 | ######### 10 | 11 | if {[catch { 12 | set AMSDIR [get_unix_variable AMS_H18_2V7] 13 | } errmsg]} { 14 | set AMSDIR "/opt/ams/" 15 | } 16 | 17 | set SYNDIR [get_unix_variable SYNOPSYS] 18 | 19 | ######### 20 | ### set library paths 21 | ######### 22 | set search_path ". $AMSDIR/synopsys/h18_2.7V /softs/kits/ams/AMS_411_CDS/synopsys/h18_2.7V/ $SYNDIR/libraries/syn $SYNDIR/dw/sim_ver" 23 | set target_library "h18_CORELIB_WC.db h18_IOLIB_WC.db" 24 | 25 | # set synthetic_library dw_foundation.sldb 26 | set link_library "* $target_library $synthetic_library" 27 | 28 | ######### 29 | ### set bus naming style for compliance between .sdf and post syn .vhdl 30 | ######### 31 | set sdfout_no_edge true 32 | #set verilogout_equation false 33 | #set verilogout_no_tri true 34 | #set verilogout_single_bit false 35 | 36 | set hdlout_internal_busses true 37 | set vhdlout_single_bit user 38 | set vhdlout_preserve_hierarchical_types user 39 | set bus_inference_style "%s_%d_" 40 | set bus_naming_style "%s_%d" 41 | set write_name_nets_same_as_ports true 42 | 43 | #puts "USE: set_fix_multiple_port_nets -all [all_designs]" 44 | -------------------------------------------------------------------------------- /sources/odatix_eda_tools/design_compiler/technology/AMS_h18_3V3/synopsys_dc_setup.tcl: -------------------------------------------------------------------------------- 1 | 2 | ######### 3 | ### Define Work Library Location 4 | ######### 5 | #define_design_lib WORK -path "./work" 6 | 7 | ######### 8 | ### retrieve AMS directory path and SYNOPSYS path from the environement variables 9 | ######### 10 | 11 | if {[catch { 12 | set AMSDIR [get_unix_variable AMS_H18_3V3] 13 | } errmsg]} { 14 | set AMSDIR "/opt/ams/" 15 | } 16 | 17 | set SYNDIR [get_unix_variable SYNOPSYS] 18 | 19 | ######### 20 | ### set library paths 21 | ######### 22 | set search_path ". $AMSDIR/synopsys/h18_3.3V /softs/kits/ams/AMS_411_CDS/synopsys/h18_3.3V/ $SYNDIR/libraries/syn $SYNDIR/dw/sim_ver" 23 | set target_library "h18_CORELIB_WC.db h18_IOLIB_WC.db" 24 | 25 | # set synthetic_library dw_foundation.sldb 26 | set link_library "* $target_library $synthetic_library" 27 | 28 | ######### 29 | ### set bus naming style for compliance between .sdf and post syn .vhdl 30 | ######### 31 | set sdfout_no_edge true 32 | #set verilogout_equation false 33 | #set verilogout_no_tri true 34 | #set verilogout_single_bit false 35 | 36 | set hdlout_internal_busses true 37 | set vhdlout_single_bit user 38 | set vhdlout_preserve_hierarchical_types user 39 | set bus_inference_style "%s_%d_" 40 | set bus_naming_style "%s_%d" 41 | set write_name_nets_same_as_ports true 42 | 43 | #puts "USE: set_fix_multiple_port_nets -all [all_designs]" 44 | -------------------------------------------------------------------------------- /sources/odatix_eda_tools/design_compiler/technology/AMS_h18_5V0/synopsys_dc_setup.tcl: -------------------------------------------------------------------------------- 1 | 2 | ######### 3 | ### Define Work Library Location 4 | ######### 5 | #define_design_lib WORK -path "./work" 6 | 7 | ######### 8 | ### retrieve AMS directory path and SYNOPSYS path from the environement variables 9 | ######### 10 | 11 | if {[catch { 12 | set AMSDIR [get_unix_variable AMS_H18_5V0] 13 | } errmsg]} { 14 | set AMSDIR "/opt/ams/" 15 | } 16 | 17 | set SYNDIR [get_unix_variable SYNOPSYS] 18 | 19 | ######### 20 | ### set library paths 21 | ######### 22 | set search_path ". $AMSDIR/synopsys/h18_5.0V /softs/kits/ams/AMS_411_CDS/synopsys/h18_5.0V/ $SYNDIR/libraries/syn $SYNDIR/dw/sim_ver" 23 | set target_library "h18_CORELIB_WC.db h18_IOLIB_WC.db" 24 | 25 | # set synthetic_library dw_foundation.sldb 26 | set link_library "* $target_library $synthetic_library" 27 | 28 | ######### 29 | ### set bus naming style for compliance between .sdf and post syn .vhdl 30 | ######### 31 | set sdfout_no_edge true 32 | #set verilogout_equation false 33 | #set verilogout_no_tri true 34 | #set verilogout_single_bit false 35 | 36 | set hdlout_internal_busses true 37 | set vhdlout_single_bit user 38 | set vhdlout_preserve_hierarchical_types user 39 | set bus_inference_style "%s_%d_" 40 | set bus_naming_style "%s_%d" 41 | set write_name_nets_same_as_ports true 42 | 43 | #puts "USE: set_fix_multiple_port_nets -all [all_designs]" 44 | -------------------------------------------------------------------------------- /sources/odatix_examples/examples/alu_sv/alu.sv: -------------------------------------------------------------------------------- 1 | `include "pck_control.sv" 2 | 3 | module alu 4 | import pck_control::*; 5 | #( 6 | parameter BITS = 8 7 | )( 8 | input wire i_clk, 9 | input wire i_rst, 10 | input sel_alu_op_e i_sel_op, 11 | input wire [BITS-1:0] i_op_a, 12 | input wire [BITS-1:0] i_op_b, 13 | output wire [BITS-1:0] o_res 14 | ); 15 | 16 | reg [BITS-1:0] value; 17 | 18 | localparam int SHIFT_BITS = $clog2(BITS); 19 | 20 | always_ff @(posedge i_clk) begin 21 | if (i_rst) begin 22 | value <= 0; 23 | end else begin 24 | case (i_sel_op) 25 | alu_add : value <= i_op_a + i_op_b; 26 | alu_sub : value <= i_op_a - i_op_b; 27 | alu_and : value <= i_op_a & i_op_b; 28 | alu_or : value <= i_op_a | i_op_b; 29 | alu_xor : value <= i_op_a ^ i_op_b; 30 | alu_slt : value <= ($signed(i_op_a) < $signed(i_op_b)) ? 1 : 0; 31 | alu_sltu : value <= (i_op_a < i_op_b) ? 1 : 0; 32 | alu_sll : value <= i_op_a << i_op_b[SHIFT_BITS-1:0]; 33 | alu_srl : value <= i_op_a >> i_op_b[SHIFT_BITS-1:0]; 34 | alu_sra : value <= $signed(i_op_a) >>> i_op_b[SHIFT_BITS-1:0]; 35 | alu_cpa : value <= i_op_a; 36 | alu_cpb : value <= i_op_b; 37 | default : value <= 0; 38 | endcase 39 | end 40 | end 41 | 42 | assign o_res = value; 43 | 44 | endmodule 45 | -------------------------------------------------------------------------------- /sources/odatix_eda_tools/design_compiler/technology/AMS_350nm_CMOS/synopsys_dc_setup.tcl: -------------------------------------------------------------------------------- 1 | 2 | ######### 3 | ### Define Work Library Location 4 | ######### 5 | #define_design_lib WORK -path "./work" 6 | 7 | ######### 8 | ### retrieve AMS directory path and SYNOPSYS path from the environement variables 9 | ######### 10 | 11 | if {[catch { 12 | set AMSDIR [get_unix_variable AMS_C35_1V8] 13 | } errmsg]} { 14 | set AMSDIR "/opt/ams/" 15 | } 16 | 17 | set SYNDIR [get_unix_variable SYNOPSYS] 18 | 19 | ######### 20 | ### set library paths 21 | ######### 22 | set search_path ". $AMSDIR/synopsys/c35_1.8V /softs/kits/ams/AMS_410_CDS/synopsys/c35_1.8V/ $SYNDIR/libraries/syn $SYNDIR/dw/sim_ver" 23 | set target_library "c35_CORELIB_WC.db c35_IOLIB_WC.db" 24 | 25 | # set synthetic_library dw_foundation.sldb 26 | set link_library "* $target_library $synthetic_library" 27 | 28 | ######### 29 | ### set bus naming style for compliance between .sdf and post syn .vhdl 30 | ######### 31 | set sdfout_no_edge true 32 | #set verilogout_equation false 33 | #set verilogout_no_tri true 34 | #set verilogout_single_bit false 35 | 36 | set hdlout_internal_busses true 37 | set vhdlout_single_bit user 38 | set vhdlout_preserve_hierarchical_types user 39 | set bus_inference_style "%s_%d_" 40 | set bus_naming_style "%s_%d" 41 | set write_name_nets_same_as_ports true 42 | 43 | #puts "USE: set_fix_multiple_port_nets -all [all_designs]" 44 | -------------------------------------------------------------------------------- /sources/odatix_eda_tools/dummy/tcl/update_freq.tcl: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | proc update_freq {freq constraints_file} { 23 | set period [expr {(1.0/$freq)*1000.0}] 24 | set constraints_file_handler [open $constraints_file w] 25 | puts -nonewline $constraints_file_handler {create_clock -period } 26 | puts -nonewline $constraints_file_handler $period 27 | puts $constraints_file_handler { [get_ports $clock_signal]} 28 | close $constraints_file_handler 29 | } -------------------------------------------------------------------------------- /sources/odatix_eda_tools/vivado/tcl/update_freq.tcl: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | proc update_freq {freq constraints_file} { 23 | set period [expr {(1.0/$freq)*1000.0}] 24 | set constraints_file_handler [open $constraints_file w] 25 | puts -nonewline $constraints_file_handler {create_clock -period } 26 | puts -nonewline $constraints_file_handler $period 27 | puts $constraints_file_handler { [get_ports $clock_signal]} 28 | close $constraints_file_handler 29 | } -------------------------------------------------------------------------------- /sources/odatix/lib/re_helper.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | import os 23 | import re 24 | 25 | BAD_VALUE = ' / ' 26 | 27 | def get_re_group_from_file(file, pattern, group_id, bad_value=BAD_VALUE): 28 | if os.path.exists(file): 29 | for i, line in enumerate(open(file)): 30 | for match in re.finditer(pattern, line): 31 | parts = pattern.search(match.group()) 32 | if group_id <= len(parts.groups()): 33 | return parts.group(group_id) 34 | return bad_value 35 | -------------------------------------------------------------------------------- /docs/source/conf.py: -------------------------------------------------------------------------------- 1 | # Configuration file for the Sphinx documentation builder. 2 | 3 | import os 4 | # -- Project information 5 | 6 | project = 'Odatix' 7 | copyright = '2022-2025, Jonathan Saussereau' 8 | author = 'Jonathan Saussereau' 9 | 10 | def read_version(): 11 | version_file = os.path.join(os.pardir, os.pardir, "sources", "odatix", "version.txt") 12 | with open(version_file, "r") as file: 13 | return file.read().strip() 14 | 15 | version = read_version() 16 | release = version 17 | 18 | # -- General configuration 19 | 20 | extensions = [ 21 | 'sphinx.ext.duration', 22 | 'sphinx.ext.doctest', 23 | 'sphinx.ext.autodoc', 24 | 'sphinx.ext.autosummary', 25 | 'sphinx.ext.intersphinx', 26 | "sphinx_inline_tabs", 27 | "sphinx_copybutton", 28 | "sphinx_toolbox.collapse", 29 | "sphinx_design", 30 | ] 31 | 32 | intersphinx_mapping = { 33 | 'python': ('https://docs.python.org/3/', None), 34 | 'sphinx': ('https://www.sphinx-doc.org/en/master/', None), 35 | } 36 | intersphinx_disabled_domains = ['std'] 37 | 38 | templates_path = ['_templates'] 39 | 40 | # -- Options for HTML output 41 | 42 | html_favicon = "../../sources/images/odatix_logo_white.png" 43 | html_logo = "../../sources/images/odatix_logo_white.png" 44 | 45 | html_theme = 'furo' 46 | 47 | html_static_path = ['_static'] 48 | html_css_files = [ 49 | 'css/custom.css', 50 | ] 51 | 52 | # -- Options for EPUB output 53 | epub_show_urls = 'footnote' 54 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Mult/_settings.yml: -------------------------------------------------------------------------------- 1 | 2 | ############################################## 3 | # Settings for mult example 4 | ############################################## 5 | 6 | # Source files 7 | rtl_path: "examples/mult" 8 | top_level_file: "mult.sv" 9 | top_level_module: "mult" 10 | 11 | # Signals 12 | clock_signal: "i_clk" 13 | reset_signal: "i_rst" 14 | 15 | # Delimiters for parameter files 16 | use_parameters: Yes 17 | start_delimiter: "mult #(" 18 | stop_delimiter: ")(" 19 | 20 | # Default frequencies (in MHz) 21 | fmax_synthesis: 22 | lower_bound: 50 23 | upper_bound: 1500 24 | custom_freq_synthesis: 25 | list: [50, 100] 26 | 27 | # Optional target-specific frequencies (in MHz) 28 | xc7s25-csga225-1: 29 | fmax_synthesis: 30 | lower_bound: 100 31 | upper_bound: 600 32 | custom_freq_synthesis: 33 | list: [50, 100] 34 | xc7a100t-csg324-1: 35 | fmax_synthesis: 36 | lower_bound: 100 37 | upper_bound: 600 38 | custom_freq_synthesis: 39 | list: [50, 100] 40 | xc7k70t-fbg676-2: 41 | fmax_synthesis: 42 | lower_bound: 50 43 | upper_bound: 1500 44 | custom_freq_synthesis: 45 | list: [50, 100] 46 | XFAB180CMOS: 47 | fmax_synthesis: 48 | lower_bound: 150 49 | upper_bound: 1400 50 | custom_freq_synthesis: 51 | list: [50, 100] 52 | AMS350CMOS: 53 | fmax_synthesis: 54 | lower_bound: 50 55 | upper_bound: 400 56 | custom_freq_synthesis: 57 | list: [50, 100] 58 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_ALU_sv/_settings.yml: -------------------------------------------------------------------------------- 1 | 2 | ############################################## 3 | # Settings for ALU example 4 | ############################################## 5 | 6 | # Source files 7 | rtl_path: "examples/alu_sv" 8 | top_level_file: "alu_top.sv" 9 | top_level_module: "alu_top" 10 | 11 | # Signals 12 | clock_signal: "i_clk" 13 | reset_signal: "i_rst" 14 | 15 | # Delimiters for parameter files 16 | use_parameters: Yes 17 | start_delimiter: "#(" 18 | stop_delimiter: ")(" 19 | 20 | # Default frequencies (in MHz) 21 | fmax_synthesis: 22 | lower_bound: 50 23 | upper_bound: 1500 24 | custom_freq_synthesis: 25 | list: [50, 100] 26 | 27 | # Optional target-specific frequencies (in MHz) 28 | xc7s25-csga225-1: 29 | fmax_synthesis: 30 | lower_bound: 100 31 | upper_bound: 450 32 | custom_freq_synthesis: 33 | list: [50, 100] 34 | xc7a100t-csg324-1: 35 | fmax_synthesis: 36 | lower_bound: 150 37 | upper_bound: 450 38 | custom_freq_synthesis: 39 | list: [50, 100] 40 | xc7k70t-fbg676-2: 41 | fmax_synthesis: 42 | lower_bound: 50 43 | upper_bound: 1200 44 | custom_freq_synthesis: 45 | list: [50, 100] 46 | XFAB180CMOS: 47 | fmax_synthesis: 48 | lower_bound: 300 49 | upper_bound: 700 50 | custom_freq_synthesis: 51 | list: [50, 100] 52 | AMS350CMOS: 53 | fmax_synthesis: 54 | lower_bound: 50 55 | upper_bound: 400 56 | custom_freq_synthesis: 57 | list: [50, 100] 58 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Counter_sv/_settings.yml: -------------------------------------------------------------------------------- 1 | 2 | ############################################## 3 | # Settings for counter example 4 | ############################################## 5 | 6 | # Source files 7 | rtl_path: "examples/counter_sv" 8 | top_level_file: "counter.sv" 9 | top_level_module: "counter" 10 | 11 | # Signals 12 | clock_signal: "clock" 13 | reset_signal: "reset" 14 | 15 | # Delimiters for parameter files 16 | use_parameters: Yes 17 | start_delimiter: "counter #(" 18 | stop_delimiter: ")(" 19 | 20 | # Default frequencies (in MHz) 21 | fmax_synthesis: 22 | lower_bound: 50 23 | upper_bound: 1500 24 | custom_freq_synthesis: 25 | list: [50, 100] 26 | 27 | # Optional target-specific frequencies (in MHz) 28 | xc7s25-csga225-1: 29 | fmax_synthesis: 30 | lower_bound: 100 31 | upper_bound: 900 32 | custom_freq_synthesis: 33 | list: [50, 100] 34 | xc7a100t-csg324-1: 35 | fmax_synthesis: 36 | lower_bound: 250 37 | upper_bound: 900 38 | custom_freq_synthesis: 39 | list: [50, 100] 40 | xc7k70t-fbg676-2: 41 | fmax_synthesis: 42 | lower_bound: 200 43 | upper_bound: 1800 44 | custom_freq_synthesis: 45 | list: [50, 100] 46 | XFAB180CMOS: 47 | fmax_synthesis: 48 | lower_bound: 400 49 | upper_bound: 700 50 | custom_freq_synthesis: 51 | list: [50, 100] 52 | AMS350CMOS: 53 | fmax_synthesis: 54 | lower_bound: 60 55 | upper_bound: 160 56 | custom_freq_synthesis: 57 | list: [50, 100] -------------------------------------------------------------------------------- /sources/odatix/gui/themes.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | import os 23 | import re 24 | 25 | default_theme = "odatix" 26 | _regex_theme = r"\.theme\.(\S+)\s*{" 27 | 28 | # Fetch themes from the CSS file 29 | _current_dir = os.path.dirname(os.path.abspath(__file__)) 30 | _css_file = os.path.join(_current_dir, "assets", "themes.css") 31 | 32 | with open(_css_file, "r") as f: 33 | _content = f.read() 34 | _available_theme = re.findall(_regex_theme, _content) 35 | 36 | _available_theme = list(_available_theme) 37 | list = _available_theme 38 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Counter_vhdl/_settings.yml: -------------------------------------------------------------------------------- 1 | 2 | ############################################## 3 | # Settings for counter example 4 | ############################################## 5 | 6 | # Source files 7 | rtl_path: "examples/counter_vhdl" 8 | top_level_file: "counter.vhdl" 9 | top_level_module: "counter" 10 | 11 | # Signals 12 | clock_signal: "clock" 13 | reset_signal: "reset" 14 | 15 | # Delimiters for parameter files 16 | use_parameters: Yes 17 | start_delimiter: "generic (" 18 | stop_delimiter: " );" 19 | 20 | # Default frequencies (in MHz) 21 | fmax_synthesis: 22 | lower_bound: 50 23 | upper_bound: 1500 24 | custom_freq_synthesis: 25 | list: [50, 100] 26 | 27 | # Optional target-specific frequencies (in MHz) 28 | xc7s25-csga225-1: 29 | fmax_synthesis: 30 | lower_bound: 100 31 | upper_bound: 900 32 | custom_freq_synthesis: 33 | list: [50, 100] 34 | xc7a100t-csg324-1: 35 | fmax_synthesis: 36 | lower_bound: 250 37 | upper_bound: 900 38 | custom_freq_synthesis: 39 | list: [50, 100] 40 | xc7k70t-fbg676-2: 41 | fmax_synthesis: 42 | lower_bound: 200 43 | upper_bound: 1800 44 | custom_freq_synthesis: 45 | list: [50, 100] 46 | XFAB180CMOS: 47 | fmax_synthesis: 48 | lower_bound: 400 49 | upper_bound: 700 50 | custom_freq_synthesis: 51 | list: [50, 100] 52 | AMS350CMOS: 53 | fmax_synthesis: 54 | lower_bound: 60 55 | upper_bound: 160 56 | custom_freq_synthesis: 57 | list: [50, 100] 58 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Counter_verilog/_settings.yml: -------------------------------------------------------------------------------- 1 | 2 | ############################################## 3 | # Settings for counter example 4 | ############################################## 5 | 6 | # Source files 7 | rtl_path: "examples/counter_verilog" 8 | top_level_file: "counter.v" 9 | top_level_module: "counter" 10 | 11 | # Signals 12 | clock_signal: "clock" 13 | reset_signal: "reset" 14 | 15 | # Delimiters for parameter files 16 | use_parameters: Yes 17 | start_delimiter: "counter #(" 18 | stop_delimiter: ")(" 19 | 20 | # Default frequencies (in MHz) 21 | fmax_synthesis: 22 | lower_bound: 50 23 | upper_bound: 1500 24 | custom_freq_synthesis: 25 | list: [50, 100] 26 | 27 | # Optional target-specific frequencies (in MHz) 28 | xc7s25-csga225-1: 29 | fmax_synthesis: 30 | lower_bound: 100 31 | upper_bound: 900 32 | custom_freq_synthesis: 33 | list: [50, 100] 34 | xc7a100t-csg324-1: 35 | fmax_synthesis: 36 | lower_bound: 250 37 | upper_bound: 900 38 | custom_freq_synthesis: 39 | list: [50, 100] 40 | xc7k70t-fbg676-2: 41 | fmax_synthesis: 42 | lower_bound: 200 43 | upper_bound: 1800 44 | custom_freq_synthesis: 45 | list: [50, 100] 46 | XFAB180CMOS: 47 | fmax_synthesis: 48 | lower_bound: 400 49 | upper_bound: 700 50 | custom_freq_synthesis: 51 | list: [50, 100] 52 | AMS350CMOS: 53 | fmax_synthesis: 54 | lower_bound: 60 55 | upper_bound: 160 56 | custom_freq_synthesis: 57 | list: [50, 100] 58 | -------------------------------------------------------------------------------- /sources/odatix_eda_tools/openlane/tcl/update_freq.tcl: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | proc update_freq {freq constraints_file} { 23 | # Get new period 24 | set clock_period [expr {1000.0 / $freq}] 25 | 26 | # Read constraints file 27 | set file [open $constraints_file r] 28 | set json_data [read $file] 29 | close $file 30 | 31 | # Change CLOCK_PERIOD 32 | set updated_json_data [regsub -all {("CLOCK_PERIOD":\s*)[0-9.]+|Inf} $json_data "\\1$clock_period"] 33 | 34 | # Save new constraints 35 | set file [open $constraints_file w] 36 | puts $file $updated_json_data 37 | close $file 38 | } 39 | -------------------------------------------------------------------------------- /.github/workflows/python-publish.yml: -------------------------------------------------------------------------------- 1 | 2 | name: Upload Python Package 3 | 4 | on: 5 | release: 6 | types: [published] 7 | 8 | permissions: 9 | contents: read 10 | 11 | jobs: 12 | build: 13 | name: Build distribution 📦 14 | runs-on: ubuntu-latest 15 | 16 | steps: 17 | - uses: actions/checkout@v4 18 | - name: Set up Python 19 | uses: actions/setup-python@v5 20 | with: 21 | python-version: "3.x" 22 | - name: Install dependencies 23 | run: | 24 | python -m pip install --upgrade pip 25 | python -m pip install build 26 | - name: Build a binary wheel and a source tarball 27 | run: python3 -m build sources 28 | - name: Store the distribution packages 29 | uses: actions/upload-artifact@v4 30 | with: 31 | name: python-package-distributions 32 | path: sources/dist/ 33 | 34 | publish-to-pypi: 35 | name: >- 36 | Publish Python 🐍 distribution 📦 to PyPI 37 | if: startsWith(github.ref, 'refs/tags/') # only publish to PyPI on tag pushes 38 | needs: 39 | - build 40 | runs-on: ubuntu-latest 41 | environment: 42 | name: publish 43 | url: https://pypi.org/p/odatix 44 | permissions: 45 | id-token: write 46 | steps: 47 | - name: Download all the dists 48 | uses: actions/download-artifact@v4 49 | with: 50 | name: python-package-distributions 51 | path: sources/dist/ 52 | - name: Publish distribution 📦 to PyPI 53 | uses: pypa/gh-action-pypi-publish@release/v1 54 | with: 55 | packages_dir: sources/dist/ 56 | -------------------------------------------------------------------------------- /sources/odatix_eda_tools/_common/exit_safe.tcl: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | if {[catch { 23 | 24 | set signature "\[exit.tcl\]" 25 | 26 | exit 27 | 28 | } ]} { 29 | puts "$signature error: unhandled tcl error, exiting" 30 | puts "$signature note: if you did not edit the tcl script, this should not append, please report this with the information bellow" 31 | catch { 32 | puts "$signature tcl error detail:" 33 | puts "$errorInfo" 34 | } 35 | puts "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" 36 | exit -1 37 | } -------------------------------------------------------------------------------- /sources/odatix/explorer/pages/lines.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | import dash 23 | from dash import html, dcc, callback, Input, Output 24 | 25 | import odatix.explorer.legend as legend 26 | import odatix.explorer.navigation as navigation 27 | 28 | dash.register_page( 29 | __name__, 30 | path='/lines', 31 | title='Odatix - Lines', 32 | name='Lines', 33 | order=1, 34 | ) 35 | 36 | layout = html.Div( 37 | [ 38 | html.Div( 39 | id="graph-lines", 40 | style={"width": "100%", "height": "100%"}, 41 | className="graph-container" 42 | ) 43 | ], 44 | id = f"{__name__}-content", 45 | style={"width": "100%", "height": f"calc(100vh - {navigation.top_bar_height})"}, 46 | ) 47 | -------------------------------------------------------------------------------- /sources/odatix/explorer/pages/radar.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | import dash 23 | from dash import html, dcc, callback, Input, Output 24 | 25 | import odatix.explorer.legend as legend 26 | import odatix.explorer.navigation as navigation 27 | 28 | dash.register_page( 29 | __name__, 30 | path='/radar', 31 | title='Odatix - Radar', 32 | name='Radar', 33 | order=3, 34 | ) 35 | 36 | layout = html.Div( 37 | [ 38 | html.Div( 39 | id="graph-radar", 40 | style={"width": "100%", "height": "100%"}, 41 | className="graph-container" 42 | ) 43 | ], 44 | id = f"{__name__}-content", 45 | style={"width": "100%", "height": f"calc(100vh - {navigation.top_bar_height})"}, 46 | ) 47 | -------------------------------------------------------------------------------- /sources/odatix/explorer/pages/columns.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | import dash 23 | from dash import html, dcc, callback, Input, Output 24 | 25 | import odatix.explorer.legend as legend 26 | import odatix.explorer.navigation as navigation 27 | 28 | dash.register_page( 29 | __name__, 30 | path='/columns', 31 | title='Odatix - Columns', 32 | name='Columns', 33 | order=2, 34 | ) 35 | 36 | layout = html.Div( 37 | [ 38 | html.Div( 39 | id="graph-columns", 40 | style={"width": "100%", "height": "100%"}, 41 | className="graph-container" 42 | ) 43 | ], 44 | id = f"{__name__}-content", 45 | style={"width": "100%", "height": f"calc(100vh - {navigation.top_bar_height})"}, 46 | ) 47 | -------------------------------------------------------------------------------- /sources/odatix/explorer/pages/overview.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | import dash 23 | from dash import html, dcc, callback, Input, Output 24 | 25 | import odatix.explorer.legend as legend 26 | import odatix.explorer.navigation as navigation 27 | 28 | dash.register_page( 29 | __name__, 30 | path='/overview', 31 | title='Odatix - Overview', 32 | name='Overview', 33 | order=6, 34 | ) 35 | 36 | layout = html.Div( 37 | [ 38 | html.Div(style={"height": "75px"}), 39 | html.Div(id="radar-graphs"), 40 | ], 41 | id = f"{__name__}-content", 42 | style={ 43 | "width": "100%", 44 | "height": f"calc(100vh - {navigation.top_bar_height})", 45 | "justify-content": "center", 46 | }, 47 | ) 48 | -------------------------------------------------------------------------------- /sources/odatix/explorer/pages/scatter.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | import dash 23 | from dash import html, dcc, callback, Input, Output 24 | 25 | import odatix.explorer.legend as legend 26 | import odatix.explorer.navigation as navigation 27 | 28 | dash.register_page( 29 | __name__, 30 | path='/scatter', 31 | title='Odatix - Scatter', 32 | name='Scatter', 33 | order=4, 34 | ) 35 | 36 | layout = html.Div( 37 | [ 38 | html.Div( 39 | id="graph-scatter", 40 | style={"width": "100%", "height": "100%"}, 41 | className="graph-container" 42 | ) 43 | ], 44 | id = f"{__name__}-content", 45 | style={"width": "100%", "height": f"calc(100vh - {navigation.top_bar_height})"}, 46 | ) 47 | -------------------------------------------------------------------------------- /sources/odatix/explorer/pages/scatter3d.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | import dash 23 | from dash import html, dcc, callback, Input, Output 24 | 25 | import odatix.explorer.legend as legend 26 | import odatix.explorer.navigation as navigation 27 | 28 | dash.register_page( 29 | __name__, 30 | path='/scatter3d', 31 | title='Odatix - Scatter 3D', 32 | name='Scatter 3D', 33 | order=5, 34 | ) 35 | 36 | layout = html.Div( 37 | [ 38 | html.Div( 39 | id="graph-scatter3d", 40 | style={"width": "100%", "height": "100%"}, 41 | className="graph-container" 42 | ) 43 | ], 44 | id = f"{__name__}-content", 45 | style={"width": "100%", "height": f"calc(100vh - {navigation.top_bar_height})"}, 46 | ) 47 | -------------------------------------------------------------------------------- /sources/odatix_eda_tools/design_compiler/technology/XFAB_180nm_CMOS/synopsys_dc_setup.tcl: -------------------------------------------------------------------------------- 1 | ##################################################################### 2 | ## Initialization Setup file for Synopsys Design Compiler ## 3 | ##################################################################### 4 | 5 | #define_design_lib WORK -path "./work/design_compiler" 6 | 7 | ### retrieve Xfab directory path and SYNOPSYS path from the environement variables 8 | set XKIT ~/xfab180n/XKIT 9 | set XFABDIR $XKIT/xh018 10 | set SYNDIR /imssofts/softs/Synopsys/DesignCompiler/2013.03-SP5 11 | 12 | ### set library paths 13 | set search_path ". $XKIT/x_all/cadence/XFAB_AMS_RefKit-cadence_IC61/v2_5_1/trunk/pdk/xh018/diglibs/D_CELLS_HD/v3_0/liberty_LPMOS/v3_0_0/PVT_1_80V_range $SYNDIR/libraries/syn $SYNDIR/dw/sim_ver ../rtl ./db ./" 14 | ##set symbol_library "D_CELLS_HD_LPMOS_typ_1_80V_25C.sdb" => cannot find sdb file, so this line is commented so that the generic symbols from synopsys installation are used 15 | set target_library "D_CELLS_HD_LPMOS_typ_1_80V_25C.db" 16 | 17 | # set synthetic_library dw_foundation.sldb 18 | set link_library "* $target_library $synthetic_library" 19 | 20 | ### set bus naming style for compliance between .sdf and post syn .vhdl 21 | set sdfout_no_edge true 22 | #set verilogout_equation false 23 | #set verilogout_no_tri true 24 | #set verilogout_single_bit false 25 | 26 | set hdlout_internal_busses true 27 | set vhdlout_single_bit user 28 | set vhdlout_preserve_hierarchical_types user 29 | set bus_inference_style "%s_%d_" 30 | set bus_naming_style "%s_%d" 31 | set write_name_nets_same_as_ports true 32 | 33 | #puts "USE: set_fix_multiple_port_nets -all [all_designs]" 34 | -------------------------------------------------------------------------------- /sources/odatix_eda_tools/openlane/tcl/is_slack_met.tcl: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | proc is_slack_met {report_path timing_rep} { 23 | set timing_rep $report_path/metrics.csv 24 | set file_handler [open $timing_rep r] 25 | gets $file_handler header 26 | 27 | set wns_value 0.0 28 | 29 | set data_line [gets $file_handler] 30 | 31 | close $file_handler 32 | 33 | set data_fields [split $data_line ","] 34 | 35 | set header_fields [split $header ","] 36 | set wns_index [lsearch -exact $header_fields "wns"] 37 | set wns_value [lindex $data_fields $wns_index] 38 | set wns_value [expr {$wns_value + 0.0}] 39 | 40 | if {$wns_value >= 0} { 41 | return 1 42 | } else { 43 | return 0 44 | } 45 | } 46 | 47 | proc is_slack_inf {report_path timing_rep} { 48 | return 0 49 | } -------------------------------------------------------------------------------- /sources/odatix_eda_tools/dummy/tcl/custom_freq_synth_script.tcl: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | if {[catch { 23 | 24 | set signature "\[custom_freq_synth_script.tcl\]" 25 | 26 | source scripts/settings.tcl 27 | source scripts/init_script.tcl 28 | source scripts/synth_script.tcl 29 | 30 | } gblerrmsg ]} { 31 | puts "$signature error: unhandled tcl error, exiting" 32 | puts "$signature note: if you did not edit the tcl script, this should not append, please report this with the information bellow" 33 | catch { 34 | puts "$signature tcl error detail:" 35 | puts "$gblerrmsg" 36 | } 37 | puts "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" 38 | exit -1 39 | } -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | ######################################################## 23 | # Paths 24 | ######################################################## 25 | 26 | SOURCE_DIR = sources 27 | 28 | ######################################################## 29 | # Installation 30 | ######################################################## 31 | 32 | BUILD_CMD = python -m build $(SOURCE_DIR) 33 | VENV = venv 34 | VENV_PYTHON = $(VENV)/bin/python 35 | INSTALL_BUILD_CMD = $(VENV_PYTHON) -m pip install build 36 | 37 | ######################################################## 38 | # Build 39 | ######################################################## 40 | 41 | .PHONY: build 42 | build: $(VENV_PYTHON) 43 | $(BUILD_CMD) 44 | 45 | $(VENV_PYTHON): 46 | python -m venv $(VENV) 47 | $(INSTALL_BUILD_CMD) -------------------------------------------------------------------------------- /sources/odatix_eda_tools/dummy/tcl/is_slack_met.tcl: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | proc is_slack_met {report_path timing_rep} { 23 | set tfile [open $timing_rep] 24 | #check if we can find "slack (MET)" in the timing report 25 | while {[gets $tfile data] != -1} { 26 | if {[string match *[string toupper "slack (MET)"]* [string toupper $data]]} { 27 | close $tfile 28 | return 1 29 | } 30 | } 31 | close $tfile 32 | return 0 33 | } 34 | 35 | proc is_slack_inf {report_path timing_rep} { 36 | set tfile [open $timing_rep] 37 | #check if we can find "Slack: inf" in the timing report 38 | while {[gets $tfile data] != -1} { 39 | if {[string match *[string toupper "Slack: inf"]* [string toupper $data]]} { 40 | close $tfile 41 | return 1 42 | } 43 | } 44 | close $tfile 45 | return 0 46 | } 47 | -------------------------------------------------------------------------------- /sources/odatix_eda_tools/vivado/tcl/is_slack_met.tcl: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | proc is_slack_met {report_path timing_rep} { 23 | set tfile [open $timing_rep] 24 | #check if we can find "slack (MET)" in the timing report 25 | while {[gets $tfile data] != -1} { 26 | if {[string match *[string toupper "slack (MET)"]* [string toupper $data]]} { 27 | close $tfile 28 | return 1 29 | } 30 | } 31 | close $tfile 32 | return 0 33 | } 34 | 35 | proc is_slack_inf {report_path timing_rep} { 36 | set tfile [open $timing_rep] 37 | #check if we can find "Slack: inf" in the timing report 38 | while {[gets $tfile data] != -1} { 39 | if {[string match *[string toupper "Slack: inf"]* [string toupper $data]]} { 40 | close $tfile 41 | return 1 42 | } 43 | } 44 | close $tfile 45 | return 0 46 | } 47 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Rom_Chisel/_settings.yml: -------------------------------------------------------------------------------- 1 | 2 | ############################################## 3 | # Settings for counter example 4 | ############################################## 5 | 6 | # Source files 7 | design_path: "examples/rom_chisel" 8 | design_path_whitelist: ['project', 'src', 'build.sbt'] # path/pattern of what should be copied from design_path 9 | design_path_blacklist: [] # path/pattern of what should NOT be copied from design_path 10 | 11 | # Generate the rtl (from chisel for example) 12 | generate_rtl: Yes 13 | generate_command: "sbt 'runMain synthetix.Rom --o=rtl'" # this requires sbt and firtool 14 | generate_output: "rtl" # path of the generated rtl 15 | 16 | # Generated design settings 17 | top_level_file: "rom.sv" 18 | top_level_module: "rom" 19 | clock_signal: "clock" 20 | reset_signal: "reset" 21 | 22 | # Delimiters for parameter files 23 | use_parameters: No 24 | 25 | # Default frequencies (in MHz) 26 | fmax_synthesis: 27 | lower_bound: 50 28 | upper_bound: 1500 29 | custom_freq_synthesis: 30 | list: [50, 100] 31 | 32 | # Optional target-specific frequencies (in MHz) 33 | xc7s25-csga225-1: 34 | fmax_synthesis: 35 | lower_bound: 100 36 | upper_bound: 900 37 | custom_freq_synthesis: 38 | list: [50, 100] 39 | xc7a100t-csg324-1: 40 | fmax_synthesis: 41 | lower_bound: 250 42 | upper_bound: 900 43 | custom_freq_synthesis: 44 | list: [50, 100] 45 | xc7k70t-fbg676-2: 46 | fmax_synthesis: 47 | lower_bound: 200 48 | upper_bound: 1800 49 | custom_freq_synthesis: 50 | list: [50, 100] 51 | XFAB180CMOS: 52 | fmax_synthesis: 53 | lower_bound: 400 54 | upper_bound: 700 55 | custom_freq_synthesis: 56 | list: [50, 100] 57 | AMS350CMOS: 58 | fmax_synthesis: 59 | lower_bound: 60 60 | upper_bound: 160 61 | custom_freq_synthesis: 62 | list: [50, 100] 63 | -------------------------------------------------------------------------------- /sources/odatix/gui/pages/not_found_404.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | import dash 23 | from dash import html 24 | import odatix.gui.navigation as navigation 25 | 26 | dash.register_page( 27 | __name__, 28 | name='PageNotFound' 29 | ) 30 | 31 | ###################################### 32 | # Layout 33 | ###################################### 34 | 35 | layout = html.Div( 36 | children=[ 37 | html.Div( 38 | children=[ 39 | html.H1("404"), 40 | html.H2("Oops, page not found!") 41 | ], 42 | className="tile center" 43 | ), 44 | ], 45 | className="page-content", 46 | id="p404-container", 47 | style={ 48 | "width": "100%", 49 | "minHeight": f"calc(100vh - {navigation.top_bar_height})", 50 | "display": "flex", 51 | "flexDirection": "column", 52 | "alignItems": "center", 53 | }, 54 | ) 55 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Shift_Register_chisel/_settings.yml: -------------------------------------------------------------------------------- 1 | 2 | ############################################## 3 | # Settings for Shift Register example 4 | ############################################## 5 | 6 | # Source files 7 | design_path: "examples/shift_register_chisel" 8 | design_path_whitelist: ['project', 'src', 'build.sbt'] # path/pattern of what should be copied from design_path 9 | design_path_blacklist: [] # path/pattern of what should NOT be copied from design_path 10 | 11 | # Generate the rtl (from chisel for example) 12 | generate_rtl: Yes 13 | generate_command: "sbt 'runMain ShiftRegister --o=rtl'" # this requires sbt and firtool 14 | generate_output: "rtl" # path of the generated rtl 15 | 16 | # Generated design settings 17 | top_level_file: "ShiftRegister.sv" 18 | top_level_module: "ShiftRegister" 19 | clock_signal: "clock" 20 | reset_signal: "reset" 21 | 22 | # delimiters for parameter files 23 | use_parameters: Yes 24 | param_target_file: "src/main/scala/ShiftRegister.scala" 25 | start_delimiter: "new ShiftRegister(" 26 | stop_delimiter: ")" 27 | 28 | # Default frequencies (in MHz) 29 | fmax_synthesis: 30 | lower_bound: 50 31 | upper_bound: 1500 32 | custom_freq_synthesis: 33 | list: [50, 100] 34 | 35 | # Optional target-specific frequencies (in MHz) 36 | xc7a100t-csg324-1: 37 | fmax_synthesis: 38 | lower_bound: 650 39 | upper_bound: 1000 40 | custom_freq_synthesis: 41 | list: [50, 100] 42 | xc7k70t-fbg676-2: 43 | fmax_synthesis: 44 | lower_bound: 450 45 | upper_bound: 2500 46 | custom_freq_synthesis: 47 | list: [50, 100] 48 | XFAB180CMOS: 49 | fmax_synthesis: 50 | lower_bound: 200 51 | upper_bound: 1000 52 | custom_freq_synthesis: 53 | list: [50, 100] 54 | AMS350CMOS: 55 | fmax_synthesis: 56 | lower_bound: 50 57 | upper_bound: 500 58 | custom_freq_synthesis: 59 | list: [50, 100] 60 | -------------------------------------------------------------------------------- /sources/odatix_eda_tools/design_compiler/tcl/is_slack_met.tcl: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | proc is_slack_met {report_path timing_rep} { 23 | set tfile [open $timing_rep] 24 | #check if we can find "slack (MET)" in the timing report 25 | while {[gets $tfile data] != -1} { 26 | if {[string match *[string toupper "slack (MET)"]* [string toupper $data]]} { 27 | close $tfile 28 | return 1 29 | } 30 | } 31 | close $tfile 32 | return 0 33 | } 34 | 35 | proc is_slack_inf {report_path timing_rep} { 36 | set tfile [open $timing_rep] 37 | #check if we can find "Path is unconstrained" or "No paths." in the timing report 38 | while {[gets $tfile data] != -1} { 39 | if {[string match *[string toupper "Path is unconstrained"]* [string toupper $data]]} { 40 | close $tfile 41 | return 1 42 | } 43 | if {[string match *[string toupper "No paths."]* [string toupper $data]]} { 44 | close $tfile 45 | return 1 46 | } 47 | } 48 | close $tfile 49 | return 0 50 | } 51 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_Counter_chisel/_settings.yml: -------------------------------------------------------------------------------- 1 | 2 | ############################################## 3 | # Settings for counter example 4 | ############################################## 5 | 6 | # Source files 7 | design_path: "examples/counter_chisel" 8 | design_path_whitelist: ['project', 'src', 'build.sbt'] # path/pattern of what should be copied from design_path 9 | design_path_blacklist: [] # path/pattern of what should NOT be copied from design_path 10 | 11 | # Generate the rtl (from chisel for example) 12 | generate_rtl: Yes 13 | generate_command: "sbt 'runMain example.Counter --o=rtl'" # this requires sbt and firtool 14 | generate_output: "rtl" # path of the generated rtl 15 | 16 | # Generated design settings 17 | top_level_file: "counter.sv" 18 | top_level_module: "counter" 19 | clock_signal: "clock" 20 | reset_signal: "reset" 21 | 22 | # Delimiters for parameter files 23 | use_parameters: Yes 24 | param_target_file: "src/main/scala/counter.scala" 25 | start_delimiter: "new Counter(" 26 | stop_delimiter: ")" 27 | 28 | # Default frequencies (in MHz) 29 | fmax_synthesis: 30 | lower_bound: 50 31 | upper_bound: 1500 32 | custom_freq_synthesis: 33 | list: [50, 100] 34 | 35 | # Optional target-specific frequencies (in MHz) 36 | xc7s25-csga225-1: 37 | fmax_synthesis: 38 | lower_bound: 100 39 | upper_bound: 900 40 | custom_freq_synthesis: 41 | list: [50, 100] 42 | xc7a100t-csg324-1: 43 | fmax_synthesis: 44 | lower_bound: 250 45 | upper_bound: 900 46 | custom_freq_synthesis: 47 | list: [50, 100] 48 | xc7k70t-fbg676-2: 49 | fmax_synthesis: 50 | lower_bound: 200 51 | upper_bound: 1800 52 | custom_freq_synthesis: 53 | list: [50, 100] 54 | XFAB180CMOS: 55 | fmax_synthesis: 56 | lower_bound: 400 57 | upper_bound: 700 58 | custom_freq_synthesis: 59 | list: [50, 100] 60 | AMS350CMOS: 61 | fmax_synthesis: 62 | lower_bound: 60 63 | upper_bound: 160 64 | custom_freq_synthesis: 65 | list: [50, 100] 66 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/architectures/Example_ALU_chisel/_settings.yml: -------------------------------------------------------------------------------- 1 | 2 | ############################################## 3 | # Settings for ALU example 4 | ############################################## 5 | 6 | # Source files 7 | design_path: "examples/alu_chisel" 8 | design_path_whitelist: ['project', 'src', 'build.sbt'] # path/pattern of what should be copied from design_path 9 | design_path_blacklist: [] # path/pattern of what should NOT be copied from design_path 10 | 11 | # Generate the rtl (from chisel for example) 12 | generate_rtl: Yes 13 | generate_command: "sbt 'runMain ALUTop --o=rtl'" # this requires sbt and firtool 14 | generate_output: "rtl" # path of the generated rtl 15 | 16 | # Generated design settings 17 | top_level_file: "ALUTop.sv" 18 | top_level_module: "ALUTop" 19 | clock_signal: "clock" 20 | reset_signal: "reset" 21 | 22 | # Delimiters for parameter files 23 | use_parameters: Yes 24 | param_target_file: "src/main/scala/ALUTop.scala" # this is the file in which the parameters will be replaced 25 | start_delimiter: "new ALUTop(" 26 | stop_delimiter: ")" 27 | 28 | # Default frequencies (in MHz) 29 | fmax_synthesis: 30 | lower_bound: 50 31 | upper_bound: 1500 32 | custom_freq_synthesis: 33 | list: [50, 100] 34 | 35 | # Optional target-specific frequencies (in MHz) 36 | xc7s25-csga225-1: 37 | fmax_synthesis: 38 | lower_bound: 100 39 | upper_bound: 450 40 | custom_freq_synthesis: 41 | list: [50, 100] 42 | xc7a100t-csg324-1: 43 | fmax_synthesis: 44 | lower_bound: 150 45 | upper_bound: 800 46 | custom_freq_synthesis: 47 | list: [50, 100] 48 | xc7k70t-fbg676-2: 49 | fmax_synthesis: 50 | lower_bound: 50 51 | upper_bound: 1200 52 | custom_freq_synthesis: 53 | list: [50, 100] 54 | XFAB180CMOS: 55 | fmax_synthesis: 56 | lower_bound: 300 57 | upper_bound: 700 58 | custom_freq_synthesis: 59 | list: [50, 100] 60 | AMS350CMOS: 61 | fmax_synthesis: 62 | lower_bound: 50 63 | upper_bound: 400 64 | custom_freq_synthesis: 65 | list: [50, 100] 66 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/simulations_settings.yml: -------------------------------------------------------------------------------- 1 | 2 | ############################################## 3 | # Odatix settings for simulations 4 | ############################################## 5 | --- 6 | 7 | # overwrite existing results 8 | overwrite: No # overridden by -o / --overwrite 9 | 10 | # prompt 'Continue? (Y/n)' after settings checks 11 | ask_continue: Yes # overridden by -y / --noask 12 | 13 | # exit monitor when all jobs are done 14 | exit_when_done: No # overridden by -E / --exit 15 | 16 | # size of the log history per job in the monitor 17 | log_size_limit: 300 # overridden by --logsize 18 | 19 | # maximum number of parallel jobs 20 | nb_jobs: 8 # overridden by -j / --jobs 21 | 22 | # targeted simulations 23 | simulations: 24 | 25 | #--------------------------------------------# 26 | # Add your own designs! 27 | #--------------------------------------------# 28 | 29 | #- Your_Simulation: 30 | # - Your_Design/Your_1st_Configuration 31 | # - Your_Design/Your_2nd_Configuration 32 | # - Your_Design/Your_3rd_Configuration 33 | 34 | # or 35 | 36 | #- Your_Simulation: 37 | # - Your_Design/* 38 | 39 | #--------------------------------------------# 40 | # Examples 41 | #--------------------------------------------# 42 | 43 | - TB_Example_Counter_GHDL: 44 | - Example_Counter_vhdl/04bits 45 | - Example_Counter_vhdl/08bits 46 | - Example_Counter_vhdl/16bits 47 | - Example_Counter_vhdl/24bits 48 | - Example_Counter_vhdl/32bits 49 | - Example_Counter_vhdl/48bits 50 | - Example_Counter_vhdl/64bits 51 | 52 | # - TB_Example_Counter_Verilator: 53 | # - Example_Counter_sv/04bits 54 | # - Example_Counter_sv/08bits 55 | # - Example_Counter_sv/16bits 56 | # - Example_Counter_sv/24bits 57 | # - Example_Counter_sv/32bits 58 | # - Example_Counter_sv/48bits 59 | # - Example_Counter_sv/64bits 60 | 61 | # - Example_Counter_chisel/04bits 62 | # - Example_Counter_chisel/08bits 63 | # - Example_Counter_chisel/16bits 64 | # - Example_Counter_chisel/24bits 65 | # - Example_Counter_chisel/32bits 66 | # - Example_Counter_chisel/48bits 67 | # - Example_Counter_chisel/64bits 68 | 69 | ... 70 | -------------------------------------------------------------------------------- /docs/source/quick_start/simulations.rst: -------------------------------------------------------------------------------- 1 | *********** 2 | Simulations 3 | *********** 4 | 5 | Step 1: Initialize a directory 6 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 7 | 8 | Place yourself in an empty directory, for example: 9 | 10 | .. code-block:: bash 11 | 12 | mkdir ~/odatix_example 13 | cd ~/odatix_example 14 | 15 | Run the init command of Odatix to create configuration files. 16 | 17 | .. code-block:: bash 18 | 19 | odatix init --examples 20 | 21 | Step 2: Choose the designs you want to simulate 22 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 23 | 24 | Uncomment the simulations you want to simulate in ``odatix_userconfig/simulations_settings.yml``. 25 | Those simulations are defined in ``odatix_userconfig/simulations``. 26 | Architectures are defined in ``odatix_userconfig/architectures``. 27 | 28 | Change the value of ``nb_jobs`` in ``odatix_userconfig/simulations_settings.yml`` depending on the number of logical cores available on your CPU. 29 | 30 | .. tip:: 31 | 75% of your number of logical cores is usually a good balance for ``nb_jobs``. 32 | 33 | Example: 34 | 35 | .. code-block:: yaml 36 | :caption: odatix_userconfig/simulations_settings.yml 37 | :linenos: 38 | :emphasize-lines: 5 39 | 40 | overwrite: No # overwrite existing results? 41 | ask_continue: Yes # prompt 'continue? (y/n)' after settings checks? 42 | exit_when_done: No # exit monitor when all jobs are done 43 | log_size_limit: 300 # size of the log history per job in the monitor 44 | nb_jobs: 12 # maximum number of parallel synthesis 45 | 46 | simulations: 47 | - TB_Example_Counter_Verilator: 48 | - Example_Counter_sv/04bits 49 | - Example_Counter_sv/08bits 50 | - Example_Counter_sv/16bits 51 | - Example_Counter_sv/24bits 52 | - Example_Counter_sv/32bits 53 | - Example_Counter_sv/48bits 54 | - Example_Counter_sv/64bits 55 | 56 | Step 3: Run the selected designs 57 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | 59 | .. code-block:: bash 60 | 61 | odatix sim 62 | 63 | Step 4: Try with your own design 64 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | 66 | Check out sections :doc:`/quick_start/add_design` and :doc:`/quick_start/add_simulation` -------------------------------------------------------------------------------- /sources/odatix_init/odatix_userconfig/target_design_compiler.yml: -------------------------------------------------------------------------------- 1 | 2 | ############################################## 3 | # Target settings for Design Compiler 4 | ############################################## 5 | 6 | constraint_file: timing_constraints.txt 7 | 8 | tool_install_path: "" # Design Compiler should be in your $PATH 9 | 10 | force_single_thread: No # Single thread is not supported yet with Design Compiler 11 | 12 | script_copy_enable: No 13 | script_copy_source: "/dev/null" 14 | 15 | # ASIC technology target 16 | targets: 17 | - AMS_c35_1V8 18 | # - AMS_c35_2V2 19 | # - AMS_c35_2V7 20 | # - AMS_c35_3V3 21 | # - AMS_h18_1V8 22 | # - AMS_h18_2V2 23 | # - AMS_h18_3V3 24 | # - AMS_h18_5V0 25 | # - XFAB180CMOS 26 | 27 | # Replace with your own synopsys_dc_setup.tcl for each technology 28 | target_settings: 29 | AMS_c35_1V8: 30 | script_copy_enable: Yes 31 | script_copy_source: $eda_tools_path/design_compiler/technology/AMS_c35_1V8/synopsys_dc_setup.tcl 32 | AMS_c35_2V2: 33 | script_copy_enable: Yes 34 | script_copy_source: $eda_tools_path/design_compiler/technology/AMS_c35_2V2/synopsys_dc_setup.tcl 35 | AMS_c35_2V7: 36 | script_copy_enable: Yes 37 | script_copy_source: $eda_tools_path/design_compiler/technology/AMS_c35_2V7/synopsys_dc_setup.tcl 38 | AMS_c35_3V3: 39 | script_copy_enable: Yes 40 | script_copy_source: $eda_tools_path/design_compiler/technology/AMS_c35_3V3/synopsys_dc_setup.tcl 41 | AMS_h18_1V8: 42 | script_copy_enable: Yes 43 | script_copy_source: $eda_tools_path/design_compiler/technology/AMS_h18_1V8/synopsys_dc_setup.tcl 44 | AMS_h18_2V2: 45 | script_copy_enable: Yes 46 | script_copy_source: $eda_tools_path/design_compiler/technology/AMS_h18_2V2/synopsys_dc_setup.tcl 47 | AMS_h18_3V3: 48 | script_copy_enable: Yes 49 | script_copy_source: $eda_tools_path/design_compiler/technology/AMS_h18_3V3/synopsys_dc_setup.tcl 50 | AMS_h18_5V0: 51 | script_copy_enable: Yes 52 | script_copy_source: $eda_tools_path/design_compiler/technology/AMS_h18_5V0/synopsys_dc_setup.tcl 53 | XFAB180CMOS: 54 | script_copy_enable: Yes 55 | script_copy_source: $eda_tools_path/design_compiler/technology/XFAB_180nm_CMOS/synopsys_dc_setup.tcl 56 | -------------------------------------------------------------------------------- /sources/odatix_examples/odatix_userconfig/target_design_compiler.yml: -------------------------------------------------------------------------------- 1 | 2 | ############################################## 3 | # Target settings for Design Compiler 4 | ############################################## 5 | 6 | constraint_file: timing_constraints.txt 7 | 8 | tool_install_path: "" # Design Compiler should be in your $PATH 9 | 10 | force_single_thread: No # Single thread is not supported yet with Design Compiler 11 | 12 | script_copy_enable: No 13 | script_copy_source: "/dev/null" 14 | 15 | # ASIC technology target 16 | targets: 17 | - AMS_c35_1V8 18 | # - AMS_c35_2V2 19 | # - AMS_c35_2V7 20 | # - AMS_c35_3V3 21 | # - AMS_h18_1V8 22 | # - AMS_h18_2V2 23 | # - AMS_h18_3V3 24 | # - AMS_h18_5V0 25 | # - XFAB180CMOS 26 | 27 | # Replace with your own synopsys_dc_setup.tcl for each technology 28 | target_settings: 29 | AMS_c35_1V8: 30 | script_copy_enable: Yes 31 | script_copy_source: $eda_tools_path/design_compiler/technology/AMS_c35_1V8/synopsys_dc_setup.tcl 32 | AMS_c35_2V2: 33 | script_copy_enable: Yes 34 | script_copy_source: $eda_tools_path/design_compiler/technology/AMS_c35_2V2/synopsys_dc_setup.tcl 35 | AMS_c35_2V7: 36 | script_copy_enable: Yes 37 | script_copy_source: $eda_tools_path/design_compiler/technology/AMS_c35_2V7/synopsys_dc_setup.tcl 38 | AMS_c35_3V3: 39 | script_copy_enable: Yes 40 | script_copy_source: $eda_tools_path/design_compiler/technology/AMS_c35_3V3/synopsys_dc_setup.tcl 41 | AMS_h18_1V8: 42 | script_copy_enable: Yes 43 | script_copy_source: $eda_tools_path/design_compiler/technology/AMS_h18_1V8/synopsys_dc_setup.tcl 44 | AMS_h18_2V2: 45 | script_copy_enable: Yes 46 | script_copy_source: $eda_tools_path/design_compiler/technology/AMS_h18_2V2/synopsys_dc_setup.tcl 47 | AMS_h18_3V3: 48 | script_copy_enable: Yes 49 | script_copy_source: $eda_tools_path/design_compiler/technology/AMS_h18_3V3/synopsys_dc_setup.tcl 50 | AMS_h18_5V0: 51 | script_copy_enable: Yes 52 | script_copy_source: $eda_tools_path/design_compiler/technology/AMS_h18_5V0/synopsys_dc_setup.tcl 53 | XFAB180CMOS: 54 | script_copy_enable: Yes 55 | script_copy_source: $eda_tools_path/design_compiler/technology/XFAB_180nm_CMOS/synopsys_dc_setup.tcl 56 | -------------------------------------------------------------------------------- /sources/setup.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | import os 3 | import sys 4 | from setuptools import setup, find_packages 5 | 6 | def read_version(): 7 | with open("odatix/version.txt", "r") as file: 8 | return file.read().strip() 9 | 10 | def read_requirements(): 11 | with open("requirements.txt") as f: 12 | requirements = [line.strip() for line in f if line.strip()] 13 | if sys.platform == "win32": 14 | with open("requirements_win32.txt") as f_win: 15 | win_requirements = [line.strip() for line in f_win if line.strip()] 16 | requirements.extend(win_requirements) 17 | return requirements 18 | 19 | package_list = find_packages() 20 | package_list.append('odatix_examples') 21 | package_list.append('odatix_eda_tools') 22 | package_list.append('odatix_init') 23 | 24 | setup( 25 | name="odatix", 26 | version=read_version(), 27 | author="Jonathan Saussereau", 28 | author_email="jonathan.saussereau@ims-bordeaux.fr", 29 | description="A FPGA/ASIC toolbox for design space exploration", 30 | long_description=open("README.md", encoding="utf-8").read(), 31 | long_description_content_type="text/markdown", 32 | url="https://github.com/jsaussereau/Asterism", 33 | packages=package_list, 34 | package_data={ 35 | 'odatix': [ 36 | 'version.txt', 37 | 'explorer/**/*', 38 | 'gui/**/*', 39 | 'init/**/*', 40 | 'eda_tools/**/*', 41 | ], 42 | 'odatix_examples': [ 43 | '**/*' 44 | ], 45 | 'odatix_eda_tools': [ 46 | '**/*' 47 | ], 48 | 'odatix_init': [ 49 | '**/*' 50 | ] 51 | }, 52 | classifiers=[ 53 | "Programming Language :: Python :: 3", 54 | "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", 55 | "Operating System :: POSIX", 56 | ], 57 | python_requires=">=3.6", 58 | install_requires=read_requirements(), 59 | entry_points={ 60 | "console_scripts": [ 61 | "odatix=odatix.odatix_main:main", 62 | "odatix-explorer=odatix.odatix_explorer:main", 63 | "odatix-gui=odatix.odatix_gui:main", 64 | ], 65 | }, 66 | ) 67 | -------------------------------------------------------------------------------- /sources/odatix/gui/assets/switch.css: -------------------------------------------------------------------------------- 1 | /* /**********************************************************************\ 2 | * Odatix * 3 | ************************************************************************ 4 | * 5 | * Copyright (C) 2022 Jonathan Saussereau 6 | * 7 | * This file is part of Odatix. 8 | * Odatix is free software: you can redistribute it and/or modify 9 | * it under the terms of the GNU General Public License as published by 10 | * the Free Software Foundation, either version 3 of the License, or 11 | * (at your option) any later version. 12 | * 13 | * Odatix is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU General Public License for more details. 17 | * 18 | * You should have received a copy of the GNU General Public License 19 | * along with Odatix. If not, see . 20 | * 21 | */ 22 | 23 | .checklist-switch input[type="checkbox"] { 24 | display: none; 25 | } 26 | 27 | .checklist-switch label { 28 | position: relative; 29 | padding-left: 50px; 30 | cursor: pointer; 31 | font-size: 1em; 32 | } 33 | 34 | .checklist-switch label:before { 35 | content: ""; 36 | position: absolute; 37 | left: 0; 38 | top: -2px; 39 | width: 40px; 40 | height: 22px; 41 | background: var(--switch-off-background); 42 | border: var(--switch-off-border-style) #d1d5da; 43 | border-radius: 22px; 44 | transition: background 0.15s; 45 | } 46 | 47 | .checklist-switch label:has(input[type="checkbox"]:checked):before { 48 | background: var(--switch-on-background); 49 | border: var(--switch-on-border-style) var(--switch-on-handle-background); 50 | } 51 | 52 | .checklist-switch label:after { 53 | content: ""; 54 | position: absolute; 55 | left: 4px; 56 | top: 2px; 57 | width: 16px; 58 | height: 16px; 59 | background: var(--switch-off-handle-background); 60 | border-radius: 50%; 61 | transition: left 0.15s; 62 | } 63 | 64 | .checklist-switch label:has(input[type="checkbox"]:checked):after { 65 | left: 22px; 66 | background: var(--switch-on-handle-background); 67 | } 68 | -------------------------------------------------------------------------------- /sources/odatix/gui/content_lib.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | import dash 23 | from dash import dcc, html 24 | from dash.dependencies import Input, Output 25 | 26 | import sys 27 | from datetime import datetime 28 | import platform 29 | import traceback 30 | 31 | import odatix.components.motd 32 | 33 | def generate_error_div(e): 34 | error_traceback = traceback.format_exc() 35 | command_line = ' '.join(sys.argv) 36 | current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S') 37 | system_info = { 38 | "OS": platform.system(), 39 | "OS Version": platform.version(), 40 | "Python Version": platform.python_version(), 41 | "Machine": platform.machine(), 42 | } 43 | 44 | return html.Div(className="error", children=[ 45 | html.Div("Internal error: " + str(e)), 46 | html.Div("Please, report this error with the error log bellow"), 47 | html.Details([ 48 | html.Summary("Error details"), 49 | html.Pre( 50 | [ 51 | html.Div("System Information:"), 52 | *[html.Div(" " + key + ": " + value + "\n") for key, value in system_info.items()], 53 | html.Div("\nOdatix Version: " + str(odatix.components.motd.read_version())), 54 | html.Div("\nCommand: " + command_line), 55 | html.Div("\n" + error_traceback), 56 | ] 57 | ) 58 | ]) 59 | ]) 60 | -------------------------------------------------------------------------------- /sources/odatix_eda_tools/openlane/tcl/init_script.tcl: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | if {[catch { 23 | 24 | set signature "\[init_script.tcl\]" 25 | 26 | source scripts/settings.tcl 27 | 28 | ###################################### 29 | # Create directories and files 30 | ###################################### 31 | 32 | exec /bin/sh -c "mkdir -p $tmp_path" 33 | exec /bin/sh -c "mkdir -p $report_path" 34 | exec /bin/sh -c "mkdir -p $result_path" 35 | exec /bin/sh -c "mkdir -p $log_path" 36 | 37 | exec /bin/sh -c "touch $statusfile" 38 | exec /bin/sh -c "touch $synth_statusfile" 39 | 40 | ###################################### 41 | # Init constraints file 42 | ###################################### 43 | 44 | source scripts/update_freq.tcl 45 | update_freq $target_frequency $constraints_file 46 | 47 | } ]} { 48 | puts "$signature error: unhandled tcl error, exiting" 49 | puts "$signature note: if you did not edit the tcl script, this should not append, please report this with the information bellow" 50 | puts "$signature tcl error detail:" 51 | puts "$errorInfo" 52 | puts "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" 53 | exit -1 54 | } -------------------------------------------------------------------------------- /docs/source/quick_start/index.rst: -------------------------------------------------------------------------------- 1 | Quick Start 2 | =========== 3 | 4 | 5 | Try Odatix through examples 6 | --------------------------- 7 | 8 | The easiest way to learn how to use Odatix is by exploring the integrated examples. 9 | Here are two tutorials depending on you want to try first: 10 | 11 | .. toctree:: 12 | :maxdepth: 1 13 | :hidden: 14 | 15 | fmax_synthesis 16 | custom_freq_synthesis 17 | simulations 18 | 19 | 20 | .. grid:: 21 | 22 | .. grid-item-card:: Try parallel Fmax synthesis 23 | :link: fmax_synthesis.html 24 | :text-align: center 25 | 26 | Run the parallel Fmax synthesis flow on the EDA tool and technological target of your choice (FGPA or ASIC) 27 | 28 | .. grid-item-card:: Try parallel custom frequency synthesis 29 | :link: custom_freq_synthesis.html 30 | :text-align: center 31 | 32 | Run the parallel custom frequency synthesis flow on the EDA tool and technological target of your choice (FGPA or ASIC) 33 | 34 | .. card:: Try parallel simulations 35 | :margin: auto 36 | :width: 50% 37 | :link: simulations.html 38 | :text-align: center 39 | 40 | Run parallel simulations on the simulator of your choice 41 | 42 | .. If you would like to try Odatix Explorer without running all configurations, you can try it online with sample results: 43 | 44 | .. .. card:: Try Odatix Explorer Online 45 | .. :margin: auto 46 | .. :width: 50% 47 | .. :link: https://odatix.onrender.com 48 | .. :text-align: center 49 | 50 | .. Please note the deployment server can take up to a minute to start. Running Odatix Explorer locally is much faster. Thank you for your patience. 51 | 52 | Try Odatix with your own design 53 | -------------------------------- 54 | 55 | Once you have tried Odatix with the tutorials above, you can use it with your own designs. 56 | 57 | .. toctree:: 58 | :maxdepth: 1 59 | :hidden: 60 | 61 | add_design 62 | add_simulation 63 | 64 | 65 | .. grid:: 66 | 67 | .. grid-item-card:: Add your own design 68 | :link: add_design.html 69 | :text-align: center 70 | 71 | .. grid-item-card:: Add your own simulation 72 | :link: add_simulation.html 73 | :text-align: center 74 | 75 | (A design must be defined first) 76 | -------------------------------------------------------------------------------- /sources/odatix/explorer/content_lib.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | import dash 23 | from dash import dcc, html 24 | from dash.dependencies import Input, Output 25 | 26 | import sys 27 | from datetime import datetime 28 | import platform 29 | import traceback 30 | 31 | import odatix.components.motd 32 | 33 | def generate_error_div(e): 34 | error_traceback = traceback.format_exc() 35 | command_line = ' '.join(sys.argv) 36 | current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S') 37 | system_info = { 38 | "OS": platform.system(), 39 | "OS Version": platform.version(), 40 | "Python Version": platform.python_version(), 41 | "Machine": platform.machine(), 42 | } 43 | 44 | return html.Div(className="error", children=[ 45 | html.Div("Internal error: " + str(e)), 46 | html.Div("Please, report this error with the error log bellow"), 47 | html.Details([ 48 | html.Summary("Error details"), 49 | html.Pre( 50 | [ 51 | html.Div("System Information:"), 52 | *[html.Div(" " + key + ": " + value + "\n") for key, value in system_info.items()], 53 | html.Div("\nOdatix Version: " + str(odatix.components.motd.read_version())), 54 | html.Div("\nCommand: " + command_line), 55 | html.Div("\n" + error_traceback), 56 | ] 57 | ) 58 | ]) 59 | ]) 60 | -------------------------------------------------------------------------------- /sources/odatix/gui/assets/preview_scroll.js: -------------------------------------------------------------------------------- 1 | /**********************************************************************\ 2 | * Odatix * 3 | ************************************************************************ 4 | * 5 | * Copyright (C) 2022 Jonathan Saussereau 6 | * 7 | * This file is part of Odatix. 8 | * Odatix is free software: you can redistribute it and/or modify 9 | * it under the terms of the GNU General Public License as published by 10 | * the Free Software Foundation, either version 3 of the License, or 11 | * (at your option) any later version. 12 | * 13 | * Odatix is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU General Public License for more details. 17 | * 18 | * You should have received a copy of the GNU General Public License 19 | * along with Odatix. If not, see . 20 | * 21 | */ 22 | 23 | document.addEventListener("DOMContentLoaded", function() { 24 | document.querySelectorAll(".preview-pane").forEach(function(pre) { 25 | // Get first span as it is the span of the start delimiter 26 | const firstSpan = pre.querySelector("span"); 27 | if (firstSpan) { 28 | const preRect = pre.getBoundingClientRect(); 29 | const spanRect = firstSpan.getBoundingClientRect(); 30 | const offset = spanRect.top - preRect.top + pre.scrollTop - 29; 31 | pre.scrollTop = offset; 32 | } 33 | }); 34 | }); 35 | 36 | // Si le contenu change dynamiquement 37 | const previewObserver = new MutationObserver(() => { 38 | document.querySelectorAll(".preview-pane").forEach(function(pre) { 39 | // Get first span as it is the span of the start delimiter 40 | const firstSpan = pre.querySelector("span"); 41 | if (firstSpan) { 42 | const preRect = pre.getBoundingClientRect(); 43 | const spanRect = firstSpan.getBoundingClientRect(); 44 | const offset = spanRect.top - preRect.top + pre.scrollTop - 29; 45 | pre.scrollTop = offset; 46 | } 47 | }); 48 | }); 49 | previewObserver.observe(document.body, { childList: true, subtree: true }); 50 | -------------------------------------------------------------------------------- /docs/source/installation/install_from_pypi.rst: -------------------------------------------------------------------------------- 1 | ************************ 2 | Install Odatix from PyPi 3 | ************************ 4 | 5 | Step 1: Install Python 3.6+ and make 6 | ------------------------------------ 7 | 8 | .. tab:: Ubuntu/Debian 9 | 10 | .. code-block:: bash 11 | 12 | sudo apt update 13 | sudo apt install -y python3 python3-pip python3-venv make 14 | 15 | .. tab:: Fedora/CentOS/AlmaLinux 16 | 17 | .. code-block:: bash 18 | 19 | sudo dnf update 20 | sudo dnf install -y python3 make 21 | 22 | .. tab:: Arch Linux 23 | 24 | .. code-block:: bash 25 | 26 | sudo pacman -Syu 27 | sudo pacman -S python3 make --noconfirm 28 | 29 | Step 2: Configure a `virtual environment `_ [*Optional*] 30 | ------------------------------------------------------------------------------------------------------ 31 | 32 | If you want to use Odatix inside a create a virtual environment, run: 33 | 34 | .. code-block:: bash 35 | 36 | # Create a virtual environment 37 | python3 -m venv odatix_venv # You only need to do it once 38 | 39 | To activate the virtual environment, run: 40 | 41 | .. code-block:: bash 42 | 43 | # Activate the virtual environment 44 | source odatix_venv/bin/activate 45 | 46 | .. Note:: 47 | 48 | You have to run this command at every new shell session. 49 | Consider creating an alias 50 | 51 | Step 3: Install the package 52 | --------------------------- 53 | 54 | .. code-block:: bash 55 | 56 | python3 -m pip install odatix 57 | 58 | Step 4: Enable option auto-completetion [*Optional*] 59 | ---------------------------------------------------- 60 | 61 | If you want to enable autocompletion of odatix command options, you can run: 62 | 63 | .. code-block:: bash 64 | 65 | eval "$(register-python-argcomplete odatix)" 66 | eval "$(register-python-argcomplete odatix-explorer)" 67 | 68 | .. Note:: 69 | 70 | You have to run these commands at every new shell session. 71 | Consider adding these to your ``odatix_venv/bin/activate`` (if using a virtual environment) script or your ``.bashrc`` / ``.zshrc`` 72 | 73 | Step 5: Install one of the supported EDA tools 74 | ---------------------------------------------- 75 | 76 | More information in section :doc:`/installation/install_eda_tools`. -------------------------------------------------------------------------------- /sources/odatix/gui/assets/auto_resize.js: -------------------------------------------------------------------------------- 1 | /**********************************************************************\ 2 | * Odatix * 3 | ************************************************************************ 4 | * 5 | * Copyright (C) 2022 Jonathan Saussereau 6 | * 7 | * This file is part of Odatix. 8 | * Odatix is free software: you can redistribute it and/or modify 9 | * it under the terms of the GNU General Public License as published by 10 | * the Free Software Foundation, either version 3 of the License, or 11 | * (at your option) any later version. 12 | * 13 | * Odatix is distributed in the hope that it will be useful, 14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | * GNU General Public License for more details. 17 | * 18 | * You should have received a copy of the GNU General Public License 19 | * along with Odatix. If not, see . 20 | * 21 | */ 22 | 23 | document.addEventListener("input", function(e) { 24 | if (e.target.classList.contains("auto-resize-textarea")) { 25 | e.target.style.height = "auto"; 26 | e.target.style.height = (e.target.scrollHeight-20) + "px"; 27 | } 28 | }); 29 | 30 | window.addEventListener("DOMContentLoaded", function() { 31 | document.querySelectorAll(".auto-resize-textarea").forEach(function(textarea) { 32 | textarea.style.height = "auto"; 33 | textarea.style.height = (textarea.scrollHeight-20) + "px"; 34 | }); 35 | }); 36 | 37 | const textarea_observer = new MutationObserver(() => { 38 | document.querySelectorAll(".auto-resize-textarea").forEach(function(textarea) { 39 | textarea.style.height = "auto"; 40 | textarea.style.height = (textarea.scrollHeight-20) + "px"; 41 | }); 42 | }); 43 | textarea_observer.observe(document.body, { childList: true, subtree: true }); 44 | 45 | const dropdown_observer = new MutationObserver(() => { 46 | setTimeout(function() { 47 | document.querySelectorAll(".auto-resize-textarea").forEach(function(textarea) { 48 | textarea.style.height = "auto"; 49 | textarea.style.height = (textarea.scrollHeight-20) + "px"; 50 | }); 51 | }, 100); // small delay to ensure layout has updated 52 | }); 53 | dropdown_observer.observe(document.body, { childList: true, subtree: true }); 54 | -------------------------------------------------------------------------------- /docs/source/quick_start/add_simulation.rst: -------------------------------------------------------------------------------- 1 | Add your own simulation 2 | ======================= 3 | 4 | Step 1: Define your design 5 | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 6 | 7 | Define your design by following the steps in section :doc:`/quick_start/add_design` 8 | 9 | Step 2: Simulation folder 10 | ~~~~~~~~~~~~~~~~~~~~~~~~~ 11 | 12 | Create a folder named after your simulation in the ``odatix_userconfig/simulations`` folder. 13 | 14 | Step 3: Makefile 15 | ~~~~~~~~~~~~~~~~ 16 | 17 | - Add a ``Makefile`` file to your newly created folder. 18 | - Add a rule named ``sim`` than runs the simulation. Any simulator installed on your system can be used. 19 | 20 | .. tip:: 21 | Check out the examples for Verilator and GHDL Makefiles in the ``odatix_userconfig/simulations`` from the quick start guide. 22 | 23 | Step 4: Optional setting file 24 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 25 | 26 | - Add a ``_settings.yml`` file to your newly created folder and fill it with one of the templates below 27 | 28 | .. code-block:: yaml 29 | :caption: _setting.yml 30 | :linenos: 31 | 32 | --- 33 | # delimiters for parameter files 34 | use_parameters: "true" 35 | param_target_file: "tb/tb_counter.vhdl" 36 | start_delimiter: "generic (" 37 | stop_delimiter: ");" 38 | ... 39 | 40 | - If you want the tool to edit the parameters for each configuration in a different file than the one specified in your architecture's ``_settings.yml`` (like a testbench for example) set ``use_parameters`` to ``true`` and edit the other keys. Otherwise, set it to ``false``. 41 | - Edit the ``param_target_file``, so it matches your design/simulation top top-level. 42 | - Set ``start_delimiter`` and ``stop_delimiter``, so it matches the delimiters of the parameter section in ``param_target_file``. 43 | - A documentation of the keys for ``_settings.yml`` files can be found in section :doc:`/documentation/settings` 44 | 45 | .. note:: 46 | If your testbench does not need to have its parameters modified for each configuration (as could a c++ verilator testbench for example), a ``_settings.yml`` is not mandatory 47 | 48 | Step 5: Run your design configurations! 49 | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | 51 | Follow the same steps as in section :doc:`/quick_start/simulations` from the quick start guide: 52 | - Edit ``odatix_userconfig/simulations_settings.yml`` to add your simulations, linked to the corresponding design configurations 53 | - Run the selected simulations 54 | -------------------------------------------------------------------------------- /sources/odatix_eda_tools/openlane/tcl/synth_script.tcl: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | if {[catch { 23 | 24 | set signature "\[synth_script.tcl\]" 25 | 26 | source scripts/settings.tcl 27 | 28 | report_progress 5 $synth_statusfile 29 | 30 | if {[catch { 31 | set chan [open "|/bin/sh -c \"/openlane/flow.tcl -tag odatix -overwrite\"" r] 32 | while {[gets $chan line] >= 0} { 33 | puts $line 34 | } 35 | close $chan 36 | } errmsg]} { 37 | if {[file exists "$report_path/metrics.csv"]} { 38 | puts "$signature warning: openlane flow failed at this frequency" 39 | } else { 40 | puts "$signature error: openlane flow failed, exiting" 41 | puts "$signature tool says -> $errmsg" 42 | puts "$signature note: look for earlier error to solve this issue" 43 | exit -1 44 | } 45 | } 46 | 47 | report_progress 100 $synth_statusfile 48 | 49 | } gblerrmsg ]} { 50 | puts "$signature error: unhandled tcl error, exiting" 51 | puts "$signature note: if you did not edit the tcl script, this should not append, please report this with the information bellow" 52 | catch { 53 | puts "$signature tcl error detail:" 54 | puts "$gblerrmsg" 55 | } 56 | puts "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" 57 | exit -1 58 | } -------------------------------------------------------------------------------- /results/results_openlane.yml: -------------------------------------------------------------------------------- 1 | units: 2 | Fmax: MHz 3 | Cell_Area: um^2 4 | WNS: ns 5 | TNS: ns 6 | Wire_Length: um 7 | Clock_Period: ns 8 | Power_Slowest_Internal: W 9 | Power_Typical_Switching: W 10 | Power_Fastest_Leakage: W 11 | fmax_results: 12 | sky130A: 13 | Example_Counter_chisel: {} 14 | Example_Counter_verilog: 15 | 08bits: 16 | Fmax: 358 17 | Cell_Area: 1081.037 18 | Synth_Cell_Count: 55 19 | WNS: 0.0 20 | TNS: 0.0 21 | Wire_Length: 1177 22 | Vias: 457 23 | Clock_Period: 2.79 24 | Power_Slowest_Internal: 0.000284 25 | Power_Typical_Switching: 0.000124 26 | Power_Fastest_Leakage: 1.0e-09 27 | 16bits: 28 | Fmax: 241 29 | Cell_Area: 2387.29 30 | Synth_Cell_Count: 117 31 | WNS: 0.0 32 | TNS: 0.0 33 | Wire_Length: 2374 34 | Vias: 934 35 | Clock_Period: 4.15 36 | Power_Slowest_Internal: 0.000316 37 | Power_Typical_Switching: 0.000197 38 | Power_Fastest_Leakage: 2.0e-09 39 | 24bits: 40 | Fmax: 215 41 | Cell_Area: 3633.485 42 | Synth_Cell_Count: 182 43 | WNS: 0.0 44 | TNS: 0.0 45 | Wire_Length: 3750 46 | Vias: 1413 47 | Clock_Period: 4.65 48 | Power_Slowest_Internal: 0.00036 49 | Power_Typical_Switching: 0.000246 50 | Power_Fastest_Leakage: 2.0e-09 51 | 32bits: 52 | Fmax: 197 53 | Cell_Area: 4754.56 54 | Synth_Cell_Count: 236 55 | WNS: 0.0 56 | TNS: 0.0 57 | Wire_Length: 4812 58 | Vias: 1798 59 | Clock_Period: 5.08 60 | Power_Slowest_Internal: 0.000498 61 | Power_Typical_Switching: 0.000333 62 | Power_Fastest_Leakage: 3.0e-09 63 | 48bits: 64 | Fmax: 150 65 | Cell_Area: 7607.296 66 | Synth_Cell_Count: 374 67 | WNS: 0.0 68 | TNS: 0.0 69 | Wire_Length: 7874 70 | Vias: 2818 71 | Clock_Period: 6.67 72 | Power_Slowest_Internal: 0.000488 73 | Power_Typical_Switching: 0.000369 74 | Power_Fastest_Leakage: 4.0e-09 75 | 64bits: 76 | Fmax: 134 77 | Cell_Area: 9819.418 78 | Synth_Cell_Count: 476 79 | WNS: 0.0 80 | TNS: 0.0 81 | Wire_Length: 11316 82 | Vias: 3698 83 | Clock_Period: 7.46 84 | Power_Slowest_Internal: 0.000658 85 | Power_Typical_Switching: 0.000508 86 | Power_Fastest_Leakage: 6.0e-09 87 | -------------------------------------------------------------------------------- /sources/odatix/lib/hard_settings.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | import re 23 | 24 | # Analyze steps 25 | param_settings_filename = "_settings.yml" 26 | sim_settings_filename = "_settings.yml" 27 | tool_settings_filename = "tool.yml" 28 | common_script_path = "_common" 29 | tool_tcl_path = "tcl" 30 | 31 | # Work directory paths 32 | work_rtl_path = "rtl" 33 | work_script_path = "scripts" 34 | work_report_path = "report" 35 | work_result_path = "result" 36 | work_log_path = "log" 37 | 38 | # Work directory files 39 | arch_filename = "architecture.txt" 40 | target_filename = "target.txt" 41 | tcl_config_filename = "settings.tcl" 42 | yaml_config_filename = "settings.yml" 43 | fmax_status_filename = "status.log" 44 | sim_progress_filename = "progress.log" 45 | synth_status_filename = "synth_status.log" 46 | frequency_search_filename = "frequency_search.log" 47 | param_domains_filename = "param_domains.yml" 48 | 49 | # Values to retrieve in files 50 | valid_status = "Done: 100%" 51 | valid_frequency_search = "Highest frequency with timing constraints being met" 52 | 53 | # Patterns 54 | source_tcl = "source scripts/" 55 | fmax_status_pattern = re.compile(r"(.*): ([0-9]+)% \(([0-9]+)\/([0-9]+)\)(.*)") 56 | synth_status_pattern = re.compile(r"(.*): ([0-9]+)%(.*)") 57 | sim_status_pattern = re.compile(r"(.*): ([0-9]+)%(.*)") 58 | 59 | # Bounds 60 | default_fmax_lower_bound = 1 # in MHz 61 | default_fmax_upper_bound = 1000 # in MHz 62 | default_custom_freq_list = [50, 100] # in MHz 63 | 64 | # GUI 65 | max_preview_values = 500 66 | 67 | # Misc 68 | main_parameter_domain = "__main__" 69 | 70 | default_supported_tools = ["vivado", "design_compiler", "openlane"] 71 | 72 | invalid_filename_characters = ['<', '>', ':', '"', '/', '\\', '|', '?', '*', ' '] 73 | -------------------------------------------------------------------------------- /sources/odatix_eda_tools/openlane/metrics.yml: -------------------------------------------------------------------------------- 1 | ############################################## 2 | # Metrics for OpenLane 3 | ############################################## 4 | 5 | fmax_synthesis_metrics: 6 | Fmax: 7 | type: regex 8 | settings: 9 | file: log/frequency_search.log 10 | pattern: "(.*)Highest frequency with timing constraints being met: ([0-9_]+) MHz" 11 | group_id: 2 12 | format: "%.0f" 13 | unit: MHz 14 | 15 | custom_freq_synthesis_metrics: 16 | Frequency: 17 | type: regex 18 | settings: 19 | file: frequency.txt 20 | pattern: "([0-9_]+) MHz" 21 | group_id: 1 22 | format: "%.0f" 23 | unit: MHz 24 | 25 | metrics: 26 | Cell_Area: 27 | type: csv 28 | settings: 29 | file: runs/odatix/reports/metrics.csv 30 | key: CoreArea_um^2 31 | format: "%.3f" 32 | unit: um^2 33 | 34 | Synth_Cell_Count: 35 | type: csv 36 | settings: 37 | file: runs/odatix/reports/metrics.csv 38 | key: synth_cell_count 39 | format: "%.0f" 40 | 41 | WNS: 42 | type: csv 43 | settings: 44 | file: runs/odatix/reports/metrics.csv 45 | key: wns 46 | format: "%.2f" 47 | unit: "ns" 48 | 49 | TNS: 50 | type: csv 51 | settings: 52 | file: runs/odatix/reports/metrics.csv 53 | key: tns 54 | format: "%.2f" 55 | unit: "ns" 56 | 57 | Wire_Length: 58 | type: csv 59 | settings: 60 | file: runs/odatix/reports/metrics.csv 61 | key: wire_length 62 | format: "%.0f" 63 | unit: "um" 64 | 65 | Vias: 66 | type: csv 67 | settings: 68 | file: runs/odatix/reports/metrics.csv 69 | key: vias 70 | format: "%.0f" 71 | 72 | Clock_Period: 73 | type: csv 74 | settings: 75 | file: runs/odatix/reports/metrics.csv 76 | key: CLOCK_PERIOD 77 | format: "%.2f" 78 | unit: "ns" 79 | 80 | Power_Slowest_Internal: 81 | type: csv 82 | settings: 83 | file: runs/odatix/reports/metrics.csv 84 | key: power_slowest_internal_uW 85 | format: "%.6f" 86 | unit: "W" 87 | 88 | Power_Typical_Switching: 89 | type: csv 90 | settings: 91 | file: runs/odatix/reports/metrics.csv 92 | key: power_typical_switching_uW 93 | format: "%.6f" 94 | unit: "W" 95 | 96 | Power_Fastest_Leakage: 97 | type: csv 98 | settings: 99 | file: runs/odatix/reports/metrics.csv 100 | key: power_fastest_leakage_uW 101 | format: "%.9f" 102 | unit: "W" 103 | 104 | Param_Domains: 105 | type: yaml 106 | error_if_missing: No 107 | settings: 108 | file: param_domains.yml 109 | -------------------------------------------------------------------------------- /sources/odatix_eda_tools/_common/init_script.tcl: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | if {[catch { 23 | 24 | set signature "\[init_script.tcl\]" 25 | 26 | source scripts/settings.tcl 27 | 28 | ###################################### 29 | # Create directories 30 | ###################################### 31 | 32 | file mkdir $tmp_path 33 | file mkdir $report_path 34 | file mkdir $result_path 35 | file mkdir $log_path 36 | 37 | ###################################### 38 | # Create status files 39 | ###################################### 40 | 41 | close [open $synth_statusfile w] 42 | if {$target_frequency != 0} { 43 | close [open $statusfile w] 44 | } 45 | 46 | ###################################### 47 | # Init constraints file 48 | ###################################### 49 | 50 | source scripts/update_freq.tcl 51 | 52 | file mkdir [file dirname $constraints_file] 53 | close [open $constraints_file w] 54 | update_freq $target_frequency $constraints_file 55 | 56 | if {$target_frequency != 0} { 57 | close [open $statusfile w] 58 | set frequency_file_handler [open $frequency_file w] 59 | puts $frequency_file_handler "$target_frequency MHz" 60 | close $frequency_file_handler 61 | } 62 | 63 | } ]} { 64 | puts "$signature error: unhandled tcl error, exiting" 65 | puts "$signature note: if you did not edit the tcl script, this should not append, please report this with the information bellow" 66 | puts "$signature tcl error detail:" 67 | puts "$errorInfo" 68 | puts "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" 69 | exit -1 70 | } -------------------------------------------------------------------------------- /sources/odatix/lib/variables.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | import os 23 | import odatix.lib.printc as printc 24 | 25 | script_name = os.path.basename(__file__) 26 | 27 | class Variables: 28 | def __init__( 29 | self, 30 | odatix_path = None, 31 | odatix_eda_tools_path = None, 32 | work_path = None, 33 | tool_install_path = None, 34 | script_path = None, 35 | log_path = None, 36 | clock_signal = None, 37 | top_level_module = None, 38 | lib_name = None, 39 | ): 40 | self.odatix_path = odatix_path 41 | self.odatix_eda_tools_path = odatix_eda_tools_path 42 | self.work_path = work_path 43 | self.tool_install_path = tool_install_path 44 | self.script_path = script_path 45 | self.log_path = log_path 46 | self.clock_signal = clock_signal 47 | self.top_level_module = top_level_module 48 | self.lib_name = lib_name 49 | 50 | def replace_variables(command, variables): 51 | if variables is not None: 52 | try: 53 | command_out = command 54 | replacements = { 55 | "$odatix_path": variables.odatix_path, 56 | "$eda_tools_path": variables.odatix_eda_tools_path, 57 | "$work_path": variables.work_path, 58 | "$tool_install_path": variables.tool_install_path, 59 | "$script_path": variables.script_path, 60 | "$log_path": variables.log_path, 61 | "$clock_signal": variables.clock_signal, 62 | "$top_level_module": variables.top_level_module, 63 | "$lib_name": variables.lib_name 64 | } 65 | for key, value in replacements.items(): 66 | if value is not None: 67 | command_out = command_out.replace(key, value) 68 | 69 | except Exception as e: 70 | printc.error(f'Failed replacing variable "{key}" by {value}', script_name=script_name) 71 | printc.cyan("error details: ", end="", script_name=script_name) 72 | print(str(e)) 73 | return command 74 | 75 | return command_out -------------------------------------------------------------------------------- /sources/odatix_eda_tools/dummy/tcl/synth_script.tcl: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | if {[catch { 23 | 24 | set signature "\[synth_script.tcl\]" 25 | 26 | source scripts/settings.tcl 27 | 28 | puts "$signature warning: this is a dummy script, nothing is being done here!" 29 | puts "$signature dummy synthesis script for $lib_name" 30 | 31 | report_progress 0 $synth_statusfile 32 | 33 | set step [expr {rand() * 10}] 34 | for { set i 0 } { $i < $step } { incr i } { 35 | 36 | set duration [expr { rand() * 5 }] 37 | for { set j 0 } { $j < $duration } { incr j } { 38 | after 250 39 | 40 | set progress [expr { 100 * ($i + $j / $duration) / $step }] 41 | if {$progress > 100} { set progress 100 } 42 | 43 | report_progress $progress $synth_statusfile 44 | } 45 | } 46 | 47 | if {[expr {rand() > 0.5}]} { 48 | set stiming_rep_handler [open $timing_rep w] 49 | puts "Dummy synthesis script: Slack (MET)" 50 | puts $stiming_rep_handler "Slack (MET)" 51 | close $stiming_rep_handler 52 | } else { 53 | set stiming_rep_handler [open $timing_rep w] 54 | puts "Dummy synthesis script: Slack (VIOLATED)" 55 | puts $stiming_rep_handler "Slack (VIOLATED)" 56 | close $stiming_rep_handler 57 | } 58 | 59 | report_progress 100 $synth_statusfile 60 | 61 | } gblerrmsg ]} { 62 | puts "$signature error: unhandled tcl error, exiting" 63 | puts "$signature note: if you did not edit the tcl script, this should not append, please report this with the information bellow" 64 | catch { 65 | puts "$signature tcl error detail:" 66 | puts "$gblerrmsg" 67 | } 68 | puts "^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^" 69 | exit -1 70 | } -------------------------------------------------------------------------------- /sources/odatix/lib/term_mode.py: -------------------------------------------------------------------------------- 1 | # ********************************************************************** # 2 | # Odatix # 3 | # ********************************************************************** # 4 | # 5 | # Copyright (C) 2022 Jonathan Saussereau 6 | # 7 | # This file is part of Odatix. 8 | # Odatix is free software: you can redistribute it and/or modify 9 | # it under the terms of the GNU General Public License as published by 10 | # the Free Software Foundation, either version 3 of the License, or 11 | # (at your option) any later version. 12 | # 13 | # Odatix is distributed in the hope that it will be useful, 14 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | # GNU General Public License for more details. 17 | # 18 | # You should have received a copy of the GNU General Public License 19 | # along with Odatix. If not, see . 20 | # 21 | 22 | import sys 23 | 24 | if sys.platform != "win32": 25 | import tty 26 | import termios 27 | 28 | def set_raw_mode(): 29 | """ 30 | Sets the terminal to raw mode, which allows reading input byte by byte without requiring Enter. 31 | This function saves the current terminal settings so they can be restored later. 32 | 33 | Returns: 34 | old_settings (list): The original terminal settings before switching to raw mode. 35 | """ 36 | if sys.platform != "win32": 37 | fd = sys.stdin.fileno() 38 | global old_settings 39 | old_settings = termios.tcgetattr(fd) 40 | tty.setraw(fd) 41 | return old_settings 42 | 43 | def restore_mode(old_settings): 44 | """ 45 | Restores the terminal to a previously saved state. 46 | 47 | Args: 48 | old_settings (list): The terminal settings to restore. 49 | """ 50 | if sys.platform != "win32": 51 | fd = sys.stdin.fileno() 52 | termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) 53 | 54 | class RawModeOutputWrapper: 55 | """ 56 | A wrapper for sys.stdout that ensures compatibility with raw terminal mode. 57 | 58 | In raw mode, a newline character (`\n`) only moves the cursor to the next line 59 | but does not return it to the beginning of the line. This class intercepts all 60 | output to sys.stdout and replaces every `\n` with the combination `\r\n`, 61 | which moves the cursor both to the next line and back to the beginning. 62 | """ 63 | def __init__(self, wrapped): 64 | self.wrapped = wrapped # The original sys.stdout or any file-like object to wrap/ 65 | 66 | def write(self, text): 67 | """ 68 | Replaces `\n` with `\r\n` and writes the modified text to the wrapped output 69 | """ 70 | text = text.replace("\n", "\r\n") 71 | self.wrapped.write(text) 72 | 73 | def flush(self): 74 | """ 75 | Flushes the wrapped output stream 76 | """ 77 | self.wrapped.flush() 78 | -------------------------------------------------------------------------------- /sources/odatix_examples/examples/rom_chisel/src/main/scala/rom.scala: -------------------------------------------------------------------------------- 1 | package synthetix 2 | 3 | import chisel3._ 4 | import chisel3.util._ 5 | import _root_.circt.stage.{ChiselStage} 6 | import scala.math._ 7 | 8 | object Quadrant extends Enumeration { 9 | type Quadrant = Value 10 | val QUARTER, HALF, FULL = Value 11 | } 12 | import Quadrant._ 13 | 14 | class Rom( 15 | DATA_BITS: Int, 16 | ADDR_BITS: Int, 17 | QUADRANT: Quadrant, 18 | REGISTER_INPUT: Boolean = true, 19 | ROM_CONTENT: Seq[Int] 20 | ) extends Module { 21 | override val desiredName = s"rom" 22 | 23 | // IOs definition 24 | val i_addr = IO(Input(UInt(ADDR_BITS.W))) 25 | val o_data = QUADRANT match { 26 | case Quadrant.FULL => IO(Output(SInt(DATA_BITS.W))) 27 | case _ => IO(Output(UInt(DATA_BITS.W))) 28 | } 29 | 30 | // ROM 31 | val rom_vec = QUADRANT match { 32 | case Quadrant.FULL => VecInit(ROM_CONTENT.map(_.S(DATA_BITS.W))) 33 | case _ => VecInit(ROM_CONTENT.map(_.U(DATA_BITS.W))) 34 | } 35 | 36 | // Registers 37 | val addr_reg = if (REGISTER_INPUT) RegNext(i_addr) else i_addr 38 | val data_reg = QUADRANT match { 39 | case Quadrant.FULL => RegInit(0.S(DATA_BITS.W)) 40 | case _ => RegInit(0.U(DATA_BITS.W)) 41 | } 42 | 43 | data_reg := rom_vec(addr_reg) 44 | o_data := data_reg 45 | } 46 | 47 | object Rom extends App { 48 | // Parameters 49 | val data_bits = 8 // Data width 50 | val addr_bits = 8 // Address width 51 | val quadrant = Quadrant.FULL // Quadrant type 52 | val register_input = true // Register input signal 53 | 54 | // Derived parameters 55 | val depth = 1 << addr_bits 56 | val max_val = (1 << data_bits) - 1 57 | 58 | // ROM content generation 59 | val rom_content = quadrant match { 60 | case Quadrant.QUARTER => 61 | // 0 to Pi/2 62 | (0 until depth).map { i => 63 | val angle = (math.Pi / 2) * i / (depth - 1) 64 | val value = (math.sin(angle) * max_val).round.toInt 65 | value 66 | } 67 | case Quadrant.HALF => 68 | // 0 to Pi 69 | (0 until depth).map { i => 70 | val angle = math.Pi * i / (depth - 1) 71 | val value = (math.sin(angle) * max_val).round.toInt 72 | value 73 | } 74 | case Quadrant.FULL => 75 | // 0 to 2*Pi 76 | (0 until depth).map { i => 77 | val angle = (2 * math.Pi) * i / (depth - 1) 78 | val value = (math.sin(angle) * max_val).round.toInt 79 | value 80 | } 81 | } 82 | 83 | // Emit Verilog 84 | _root_.circt.stage.ChiselStage.emitSystemVerilog( 85 | new Rom( 86 | data_bits, 87 | addr_bits, 88 | quadrant, 89 | register_input, 90 | rom_content 91 | ), 92 | firtoolOpts = Array.concat( 93 | Array( 94 | "--disable-all-randomization", 95 | "--strip-debug-info", 96 | "--split-verilog" 97 | ), 98 | args 99 | ) 100 | ) 101 | } --------------------------------------------------------------------------------