Line length

By default PSyclone will generate Fortran code with no consideration of Fortran line-length limits. As the line-length limit for free-form Fortran is 132 characters, the code that is output may be non-conformant.

Line length is not an issue for many compilers as they allow compiler flags to be set which allow lines longer than the Fortran standard. However this is not the case for all compilers.

PSyclone therefore supports the wrapping of lines within the 132 character limit. The next two sections discuss how this is done when scripting and when working interactively respectively.

Script

The psyclone script provides the -l option to wrap lines. Please see the Fortran line length section for more details.

Interactive

When using PSyclone interactively the line lengths of the input algorithm and Kernel files can be checked by setting the psyclone.parse.algorithm.parse() function’s line_length argument to True.

>>> from psyclone.parse.algorithm import parse
>>> ast, info = parse("argspec.F90", line_length=True)

Similarly the line_length argument can be set to True if calling the generator.generate() function. This function simply passes this argument on to the psyclone.parse.algorithm.parse() function.

>>> from psyclone.generator import generate
>>> alg, psy = generate("argspec.F90", line_length=True)

Line wrapping is performed as a post-processing step, i.e. after the code has been generated. This is done by an instance of the line_length.FortLineLength class. For example:

>>> from psyclone.generator import generate
>>> from psyclone.line_length import FortLineLength
>>> psy, alg = generate("algspec.f90", line_length=True)
>>> line_length = FortLineLength()
>>> psy_str = line_length.process(str(psy))
>>> print psy_str
>>> alg_str = line_length.process(str(alg))
>>> print alg_str

Limitations

The line_length.FortLineLength class is only partially aware of Fortran syntax. This awareness is required so that appropriate continuation characters can be used (for example & at the end of a line and !$omp& at the start of a line for OpenMP directives, & at the end of a line for statements and & at the end of a line and & at the beginning of a line for strings).

Whilst statements only require an & at the end of the line when line wrapping with free-form fortran they may optionally also have an & at the beginning of the subsequent line. In contrast, when splitting a string over multiple lines an & is required at both locations. Therefore an instance of the line_length.FortLineLength class will always add & at the beginning of a continuation line for a statement, in case the line is split within a string.

One known situation that could cause an instance of the line_length.FortLineLength class to fail is when an inline comment is used at the end of a line to make it longer than the 132 character limit. Whilst PSyclone does not generate such code for the PSy-layer, this might occur in Algorithm-layer code, even if the Algorithm-layer code conforms to the 132 line length limit. The reason for this is that PSyclone’s internal parser concatenates lines together, thus a long line correctly split with continuation characters in the Algorithm-layer becomes a line that needs to be split by an instance of the line_length.FortLineLength class.