From bc10b035f5998d1cc9ec2aa0122ee1c24099ca05 Mon Sep 17 00:00:00 2001 From: Tristan Gingold Date: Mon, 30 Jan 2017 21:09:19 +0100 Subject: Add netlist generation infrastructure. --- src/ghdldrv/ghdlsynth.adb | 118 ++++++++++++++++++++++++++++++++++++++++++++++ src/ghdldrv/ghdlsynth.ads | 25 ++++++++++ 2 files changed, 143 insertions(+) create mode 100644 src/ghdldrv/ghdlsynth.adb create mode 100644 src/ghdldrv/ghdlsynth.ads (limited to 'src/ghdldrv') diff --git a/src/ghdldrv/ghdlsynth.adb b/src/ghdldrv/ghdlsynth.adb new file mode 100644 index 000000000..0ae4eff87 --- /dev/null +++ b/src/ghdldrv/ghdlsynth.adb @@ -0,0 +1,118 @@ +-- GHDL driver for synthesis +-- Copyright (C) 2016 Tristan Gingold +-- +-- GHDL is free software; you can redistribute it and/or modify it under +-- the terms of the GNU General Public License as published by the Free +-- Software Foundation; either version 2, or (at your option) any later +-- version. +-- +-- GHDL is distributed in the hope that it will be useful, but WITHOUT ANY +-- WARRANTY; without even the implied warranty of MERCHANTABILITY or +-- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +-- for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with GCC; see the file COPYING. If not, write to the Free +-- Software Foundation, 59 Temple Place - Suite 330, Boston, MA +-- 02111-1307, USA. + +with Ghdllocal; use Ghdllocal; +with Ghdlcomp; +with Ghdlmain; +with Ghdlsimul; + +with Libraries; +with Flags; +with Canon; + +with Elaboration; + +with Synthesis; +with Netlists.Dump; + +package body Ghdlsynth is + -- Command --synth + type Command_Synth is new Command_Lib with null record; + function Decode_Command (Cmd : Command_Synth; Name : String) + return Boolean; + function Get_Short_Help (Cmd : Command_Synth) return String; + + procedure Perform_Action (Cmd : in out Command_Synth; + Args : Argument_List); + + function Decode_Command (Cmd : Command_Synth; Name : String) + return Boolean + is + pragma Unreferenced (Cmd); + begin + return Name = "--synth"; + end Decode_Command; + + function Get_Short_Help (Cmd : Command_Synth) return String + is + pragma Unreferenced (Cmd); + begin + return "--synth [FILES... -e] UNIT [ARCH] Synthesis from UNIT"; + end Get_Short_Help; + + function Ghdl_Synth (Args : Argument_List) return Netlists.Module + is + E_Opt : Integer; + Opt_Arg : Natural; + begin + -- If the '-e' switch is present, there is a list of files. + E_Opt := Args'First - 1; + for I in Args'Range loop + if Args (I).all = "-e" then + E_Opt := I; + exit; + end if; + end loop; + + Ghdlcomp.Hooks.Compile_Init.all (False); + Flags.Flag_Elaborate_With_Outdated := False; + Flags.Flag_Only_Elab_Warnings := True; + + Libraries.Load_Work_Library (E_Opt >= Args'First); + + -- Do not canon concurrent statements. + Canon.Canon_Flag_Concurrent_Stmts := False; + + Canon.Canon_Flag_Add_Labels := True; + + -- Analyze files (if any) + for I in Args'First .. E_Opt - 1 loop + Ghdlcomp.Compile_Analyze_File (Args (I).all); + end loop; + + -- Elaborate + Ghdlcomp.Hooks.Compile_Elab.all + ("--synth", Args (E_Opt + 1 .. Args'Last), Opt_Arg); + + if Opt_Arg <= Args'Last then + Ghdlmain.Error ("extra options ignored"); + end if; + + -- Hooks.Set_Run_Options (Args (Opt_Arg .. Args'Last)); + + Elaboration.Elaborate_Design (Ghdlsimul.Get_Top_Config); + + return Synthesis.Synth_Design (Ghdlsimul.Get_Top_Config); + -- Hooks.Run.all; + end Ghdl_Synth; + + procedure Perform_Action (Cmd : in out Command_Synth; + Args : Argument_List) + is + pragma Unreferenced (Cmd); + Res : Netlists.Module; + begin + Res := Ghdl_Synth (Args); + Netlists.Dump.Disp_Module (Res); + end Perform_Action; + + procedure Register_Commands is + begin + Ghdlmain.Register_Command (new Command_Synth); + end Register_Commands; +end Ghdlsynth; diff --git a/src/ghdldrv/ghdlsynth.ads b/src/ghdldrv/ghdlsynth.ads new file mode 100644 index 000000000..f9a755c08 --- /dev/null +++ b/src/ghdldrv/ghdlsynth.ads @@ -0,0 +1,25 @@ +-- GHDL driver for synthesis +-- Copyright (C) 2016 Tristan Gingold +-- +-- GHDL is free software; you can redistribute it and/or modify it under +-- the terms of the GNU General Public License as published by the Free +-- Software Foundation; either version 2, or (at your option) any later +-- version. +-- +-- GHDL is distributed in the hope that it will be useful, but WITHOUT ANY +-- WARRANTY; without even the implied warranty of MERCHANTABILITY or +-- FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +-- for more details. +-- +-- You should have received a copy of the GNU General Public License +-- along with GCC; see the file COPYING. If not, write to the Free +-- Software Foundation, 59 Temple Place - Suite 330, Boston, MA +-- 02111-1307, USA. +with Netlists; +with GNAT.OS_Lib; use GNAT.OS_Lib; + +package Ghdlsynth is + procedure Register_Commands; + + function Ghdl_Synth (Args : Argument_List) return Netlists.Module; +end Ghdlsynth; -- cgit v1.2.3