2018-09-28 17:54:21 +02:00
|
|
|
Naming conventions
|
|
|
|
|
|
|
|
|
|
directory - lowercase (directory)
|
|
|
|
|
filename - corresponding class name without prefix (Filename)
|
2024-03-06 05:10:52 +01:00
|
|
|
class - upper camel case (ClassName)
|
|
|
|
|
member function - upper camel case (memberFunction)
|
|
|
|
|
member variable - snake case with trailing underscore (member_variable_)
|
2018-09-28 17:54:21 +02:00
|
|
|
Trailing underscore prevents conflict with accessor
|
|
|
|
|
member function name.
|
2024-03-06 05:10:52 +01:00
|
|
|
function - lower camel case (functionName)
|
2024-07-14 02:08:43 +02:00
|
|
|
variable - snake case
|
2018-09-28 17:54:21 +02:00
|
|
|
comments - use capitalized sentences that end with periods
|
|
|
|
|
|
|
|
|
|
C++ code files should use a .cc file extension
|
|
|
|
|
C++ header files should use a .hh file extension
|
|
|
|
|
|
2024-03-06 05:10:52 +01:00
|
|
|
Use pragmas to protect headers from being read more than once instead of
|
|
|
|
|
ifdef/define.
|
2018-09-28 17:54:21 +02:00
|
|
|
|
2024-03-06 05:10:52 +01:00
|
|
|
#pragma once
|
2018-09-28 17:54:21 +02:00
|
|
|
|
|
|
|
|
In general it is better to for class variables to use pointers to
|
|
|
|
|
objects of other classes rather than embedding the instance directly.
|
|
|
|
|
This only requires that the class be declared rather than defined,
|
|
|
|
|
many times breaking a dependency on another header file.
|
|
|
|
|
|
|
|
|
|
Header files that define the classes of a sub-directory allow other
|
|
|
|
|
headers to have pointers to the objects without pulling in the details
|
|
|
|
|
of the class definitions. These headers are named "DirectoryClass.hh"
|
|
|
|
|
where Directory is the capitalized name of the sub-directory.
|
|
|
|
|
|
|
|
|
|
Place comments describing public functions and classes in header files
|
|
|
|
|
rather than code files because a consumer is more likely to have
|
|
|
|
|
access to the header and that is the first place they will look.
|
|
|
|
|
|
|
|
|
|
The return type of a function should be on the line before the
|
2024-03-06 05:10:52 +01:00
|
|
|
function name. Arguments should be on separate lines to make it easier
|
|
|
|
|
to remove or add them without having to reformat the lines as they
|
|
|
|
|
change length.
|
2018-09-28 17:54:21 +02:00
|
|
|
|
|
|
|
|
return_type
|
2024-03-06 05:10:52 +01:00
|
|
|
function(type1 arg1,
|
|
|
|
|
type2 arg2)
|
2018-09-28 17:54:21 +02:00
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Functions should be less than one screen long. Break long functions
|
2024-03-06 05:10:52 +01:00
|
|
|
up into smaller ones. Lines should be less than 90 characters long.
|
2018-09-28 17:54:21 +02:00
|
|
|
|
2024-03-06 05:10:52 +01:00
|
|
|
Avoid assignments inside `if'-conditions. For example, don't write
|
|
|
|
|
this:
|
2018-09-28 17:54:21 +02:00
|
|
|
|
|
|
|
|
if ((foo = (char *) malloc (sizeof *foo)) == 0)
|
|
|
|
|
fatal ("virtual memory exhausted");
|
|
|
|
|
|
|
|
|
|
instead, write this:
|
|
|
|
|
|
|
|
|
|
foo = (char *) malloc (sizeof *foo);
|
2024-07-14 02:08:43 +02:00
|
|
|
if (foo == nullptr)
|
2018-09-28 17:54:21 +02:00
|
|
|
fatal ("virtual memory exhausted");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Use braces around if/for bodies that are more than one line.
|
|
|
|
|
IE,
|
|
|
|
|
if (pred)
|
|
|
|
|
for (int i = 0; i < len; i++) { // this body should be in {}'s
|
|
|
|
|
...
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Add a default clause to all switches calling switchCaseNotHandled:
|
|
|
|
|
|
|
|
|
|
switch (type) {
|
|
|
|
|
case edge_interconnect:
|
|
|
|
|
...
|
|
|
|
|
default:
|
|
|
|
|
switchCaseNotHandled();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Put return types for functions on the line before the function name:
|
|
|
|
|
|
|
|
|
|
Cell *
|
|
|
|
|
Library::findCell(char *name)
|
|
|
|
|
{
|
|
|
|
|
...
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Class member functions should be grouped in public, protected and then
|
|
|
|
|
private order.
|
|
|
|
|
|
|
|
|
|
class Frob
|
|
|
|
|
{
|
|
|
|
|
public:
|
|
|
|
|
protected:
|
|
|
|
|
private:
|
|
|
|
|
|
|
|
|
|
friend class Frobulator;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Don't declare class variables as const. It means any downstream code
|
|
|
|
|
that accesses the member cannot modify it, which is overly
|
|
|
|
|
restrictive.
|
|
|
|
|
|
2024-03-06 05:10:52 +01:00
|
|
|
Avoid using [] to lookup a map value because it creates a key/null value
|
|
|
|
|
pair if the lookup fails. Use map::find or sta::Map::findKey instead.
|
2018-09-28 17:54:21 +02:00
|
|
|
|
|
|
|
|
Avoid nested classes/enums because SWIG has trouble with them.
|
|
|
|
|
|
|
|
|
|
................................................................
|
|
|
|
|
Warning
|
|
|
|
|
get_<object> not found
|
|
|
|
|
sdf timing arc not found
|
|
|
|
|
disabling timing arcs to break loops
|
|
|
|
|
virtual clock with no sources (no pins)
|
|
|
|
|
invalid endpoint for constrained paths
|
|
|
|
|
sdf DESIGN does not match top level cell name
|
|
|
|
|
set_input_delay on clk port (deprecation warning)
|
|
|
|
|
link cannot resolve reference (module/cell not found)
|
|
|
|
|
|
|
|
|
|
Errors
|
|
|
|
|
cannot open file
|
|
|
|
|
file syntax error
|
|
|
|
|
cmd illegal command option combinations
|
|
|
|
|
cmd extra positional args
|
|
|
|
|
cmd unknown keyword option
|
|
|
|
|
cmd unknown
|
|
|
|
|
sdf pin not found
|
|
|
|
|
|
|
|
|
|
................................................................
|
|
|
|
|
Swig notes
|
|
|
|
|
|
|
|
|
|
C null pointers (zero) turn into "NULL" values in TCL.
|
|
|
|
|
|
|
|
|
|
TCL "NULL" strings turn into NULL (zero) pointers in C.
|
|
|
|
|
|
|
|
|
|
# TCL lexpr-funcall
|
|
|
|
|
eval exec $prog $args
|