├── 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 | }
--------------------------------------------------------------------------------