Skip to content

Commit

Permalink
[Literate] Generate enumeration values for bitfields
Browse files Browse the repository at this point in the history
  • Loading branch information
0x8000-0000 committed May 12, 2020
1 parent 4f44c9a commit 75ff557
Show file tree
Hide file tree
Showing 2 changed files with 100 additions and 4 deletions.
97 changes: 94 additions & 3 deletions src/main/java/net/signbit/samx/literate/CppVisitor.java
Original file line number Diff line number Diff line change
Expand Up @@ -298,6 +298,64 @@ private enum FieldIndices
ValueDescription
}

class EnumerationValue
{
String name;
String value;
final String description;

public EnumerationValue(String name, String value, String description)
{
if ((name == null) || name.isEmpty())
{
this.name = computeNameFromDescription(description);
}
else
{
this.name = name;
}
if (NumberUtils.isCreatable(value))
{
this.value = value;
}
else
{
if ((value.charAt(0) == '0') && (value.charAt(1) == 'b'))
{
int intValue = Integer.parseInt(value.substring(2), 2);
this.value = Integer.toHexString(intValue);
}
else
{
int intValue = NumberUtils.createInteger(value);
this.value = Integer.toString(intValue);
}
}

this.description = description + ": " + value;
}

public String getName()
{
return name;
}

public String getValue()
{
return value;
}

public String getDescription()
{
return description;
}
}

private String computeNameFromDescription(String description)
{
return description.replace(' ', '_').replace('/', '_');
}

class BitField
{
final int word;
Expand All @@ -306,6 +364,7 @@ class BitField
final String name;

final String enumType;
final ArrayList<EnumerationValue> values = new ArrayList<>();

public BitField(RecordSetVisitor.RecordDataGroup rdg)
{
Expand All @@ -320,6 +379,33 @@ public BitField(RecordSetVisitor.RecordDataGroup rdg)
if (rdg.getRows().size() > 1)
{
enumType = name;

for (RecordSetVisitor.RecordData rd : rdg.getRows())
{
values.add(new EnumerationValue(rd.getValue(FieldIndices.ValueName.ordinal(), plainTextVisitor), rd.getValue(FieldIndices.Value.ordinal(), plainTextVisitor), rd.getValue(FieldIndices.ValueDescription.ordinal(), plainTextVisitor)));
}

int maxNameLength = 0;
int maxValueLength = 0;

for (EnumerationValue ev: values)
{
if (maxNameLength < ev.name.length())
{
maxNameLength = ev.name.length();
}

if (maxValueLength < ev.value.length())
{
maxValueLength = ev.value.length();
}
}

for (EnumerationValue ev: values)
{
ev.name = String.format("%1$-" + maxNameLength + "s", ev.name);
ev.value = String.format("%1$" + maxValueLength + "s", ev.value);
}
}
else
{
Expand Down Expand Up @@ -362,14 +448,19 @@ public boolean isBoolean()

public boolean isEnumeration()
{
return enumType != null && (width > 1);
return (! values.isEmpty());
}

public String getEnumType()
{
return enumType;
}

public ArrayList<EnumerationValue> getEnumerationValues()
{
return values;
}

public String getName()
{
return name;
Expand All @@ -389,15 +480,15 @@ public BitFieldDefinition(SamXParser.RecordSetContext ctx)
final String unitWidthHeader = ctx.headerRow().NAME(0).getText();
unitWidth = unitWidths.getOrDefault(unitWidthHeader, 0);

for (RecordSetVisitor.RecordDataGroup rdg: rs.getGroups())
for (RecordSetVisitor.RecordDataGroup rdg : rs.getGroups())
{
if (rdg.hasSingleValue(FieldIndices.Name.ordinal()) && rdg.hasSingleValue(FieldIndices.Offset.ordinal()) && rdg.hasSingleValue(FieldIndices.Offset.ordinal()))
{
fields.add(new BitField(rdg));
}
else
{
for (RecordSetVisitor.RecordData rd: rdg.getRows())
for (RecordSetVisitor.RecordData rd : rdg.getRows())
{
fields.add(new BitField(rd));
}
Expand Down
7 changes: 6 additions & 1 deletion src/main/resources/net/signbit/samx/literate/cpp_header.stg
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,16 @@ private:

>>

enumerationDecl(enumVal) ::= <<
<enumVal.name> = <enumVal.value>, /// <enumVal.description>

>>

bitFieldDecl(field, unitWidth) ::= <<

<if(field.enumeration)>enum class <field.enumType> : uint<unitWidth>_t
{
};<endif>
<field.enumerationValues:enumerationDecl()>};<endif>


/** <field.name>
Expand Down

0 comments on commit 75ff557

Please sign in to comment.