Returns QASM code for the given value, if possible.

Different values require different sets of arguments. The general rule of thumb is that circuits don't need any, operations need a QasmArgs, and gates need both a QasmArgs and qubits.

val The value to turn into QASM code.
args A QasmArgs object to pass into the value's _qasm_ method. This is for needed for objects that only have a local idea of what's going on, e.g. a cirq.Operation in a bigger cirq.Circuit involving qubits that the operation wouldn't otherwise know about.
qubits A list of qubits that the value is being applied to. This is needed for cirq.Gate values, which otherwise wouldn't know what qubits to talk about.
default A default result to use if the value doesn't have a _qasm_ method or that method returns NotImplemented or None. If not specified, non-decomposable values cause a TypeError.

The result of val._qasm_(...), if val has a _qasm_ method and it didn't return NotImplemented or None. Otherwise default is returned, if it was specified. Otherwise an error is raised.

TypeError val didn't have a _qasm_ method (or that method returned NotImplemented or None) and default wasn't set.