aboutsummaryrefslogtreecommitdiffstats
path: root/doc/references/CodingStyle.rst
blob: 76d33b5cad811e66edb42f8f98ad332fc39a1258 (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
.. _REF:Style:

Coding style
#################

Ada subset: use only a simple (VHDL like) subset of Ada: no tasking, no
controlled types...  VHDL users should easily understand that subset.
Allowed Ada93 features: the standard library, child packages.
Use assertions.

We try to follow the 'GNU Coding Standards' when possible: comments before
declarations, two spaces at end of sentences, finish sentences with a dot.
But: 3 spaces for indentation.

No trailing spaces, not TAB (HT).

Subprograms must have a comment before to describe it, like:
   --  Analyze the concurrent statements of PARENT.
   procedure Sem_Concurrent_Statement_Chain (Parent : Iir);
The line before the comment must be a blank line (unless this is the first
declaration).  Don't repeat the comment before the subprogram body.

* For subprograms:
1) Declare on one line when possible:
   function Translate_Static_Aggregate (Aggr : Iir) return O_Cnode

2) If not possible, put the return on the next line:
   function Translate_Static_String (Str_Type : Iir; Str_Ident : Name_Id)
                                    return O_Cnode

3) If not possible, put parameters and return on the next line:
   function Create_String_Literal_Var_Inner
     (Str : Iir; Element_Type : Iir; Str_Type : O_Tnode) return Var_Type

4) If not possible, return on the next line:
   function Translate_Shortcut_Operator
     (Imp : Iir_Implicit_Function_Declaration; Left, Right : Iir)
     return O_Enode

5) If not possible, one parameter per line, just after subprogram name:
   procedure Translate_Static_Aggregate_1 (List : in out O_Array_Aggr_List;
                                           Aggr : Iir;
                                           Info : Iir;
                                           El_Type : Iir)
6) If not possible, add a return after subprogram name:
   function Translate_Predefined_TF_Array_Element
     (Op : Predefined_Boolean_Logical;
      Left, Right : Iir;
      Res_Type : Iir;
      Loc : Iir)
     return O_Enode

7) If not possible, ask yourself what is wrong!  Shorten a name.

* Rule for the 'is': one a new line only if the declarative part is not empty:
   procedure Translate_Assign (Target : Mnode; Expr : Iir; Target_Type : Iir)
   is
      Val : O_Enode;
   begin
vs
   function Translate_Static_Range_Dir (Expr : Iir) return O_Cnode is
   begin

If the parametere line is too long with the 'is', put in on a separate line:
      procedure Predeclare_Scope_Type
        (Scope : in out Var_Scope_Type; Name : O_Ident) is

* Generic instantiation: put the generic actual part on a new line:
   procedure Free is new Ada.Unchecked_Deallocation
     (Action_List, Action_List_Acc);

* For if/then statement:
1) 'then' on the same line:
      if Get_Expr_Staticness (Decl) = Locally then

2) If not possible, 'then' is alone on its line aligned with the 'if':
      if Expr = Null_Iir
        or else Get_Kind (Expr) = Iir_Kind_Overflow_Literal
      then

3) For a multiline condition, 'or else' and 'and then' should start lines.

* 'Local' variable declaration:
Do not initialize variables, constants must be declared before variables:
   is
      N_Info : constant Iir := Get_Sub_Aggregate_Info (Info);
      Assoc  : Iir;
      Sub    : Iir;
   begin
If the initialization expression has a side effect (such as allocation), do
not use a constant.