blob: 0ae4eff879c34396b31225e2d33d430727d593e4 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
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;
|