Although C is still somewhat expressivity-limited as a hardware description language, it is anticipated that most of its limitations can be overcome by a combination of well-defined semantics and intelligent high- and low-level optimization. In particular, optimizations targetting C's inflexible type system seem to show that most of the inefficiencies of fixed-width data types can be optimized away using a fast algorithm. Standard C optimization techniques, such as constant-propagation and common subexpression elimination, can be used profitably to generate optimized hardware as well.
Certain C features still hamstring its expressivity as an HDL. Foremost of these in the present work is C's limiting single-value-return function syntax. Hardware blocks often have multiple outputs, but it is difficult to express this using C syntax. However, the current syntax does provide a clean in/out marking of signals. However, it has difficulty dealing with bidirectional signals.
The solution to these problems seems to lie in a more object-oriented approach. If the basic hardware description unit is a class, instead of a function, we can define multiple interface functions to internal state maintained in class member variables. The added semantics make hierarchical composition easier, as well. The semantics are an easy superset of the ones described for C in this paper, and are the subject of current work. However, the SUIF system has limited support for object-orientation at the present time, so the continuation of this work is currently being implemented in Java. Open questions on the semantics still remain, among them the expression of timing and interface constraints in C or its cousins. At the moment, an auxillary interface description language is being used to express these constraints; it would be better if this information could be integrated into the source language.