Warning: mysqli::__construct(): (HY000/1203): User howardkn already has more than 'max_user_connections' active connections in D:\Inetpub\vhosts\howardknight.net\al.howardknight.net\includes\artfuncs.php on line 21
Failed to connect to MySQL: (1203) User howardkn already has more than 'max_user_connections' active connections
Warning: mysqli::query(): Couldn't fetch mysqli in D:\Inetpub\vhosts\howardknight.net\al.howardknight.net\index.php on line 66
Article <vsl9ep$3vdjj$1@dont-email.me>
Deutsch   English   Français   Italiano  
<vsl9ep$3vdjj$1@dont-email.me>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!eternal-september.org!feeder3.eternal-september.org!news.eternal-september.org!eternal-september.org!.POSTED!not-for-mail
From: BGB <cr88192@gmail.com>
Newsgroups: comp.lang.c
Subject: Re: "A diagram of C23 basic types"
Date: Thu, 3 Apr 2025 01:20:48 -0500
Organization: A noiseless patient Spider
Lines: 125
Message-ID: <vsl9ep$3vdjj$1@dont-email.me>
References: <87y0wjaysg.fsf@gmail.com> <vsijts$13c9u$1@dont-email.me>
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit
Injection-Date: Thu, 03 Apr 2025 08:22:18 +0200 (CEST)
Injection-Info: dont-email.me; posting-host="139198c26bde0f3b3c9f73e3a85e9f69";
	logging-data="4175475"; mail-complaints-to="abuse@eternal-september.org";	posting-account="U2FsdGVkX18te0VbQmyeLG7n9rOFPs3sJGrD8qcS0+U="
User-Agent: Mozilla Thunderbird
Cancel-Lock: sha1:q8KmS2sf2qZ37ArzZDmcAvhpLyA=
In-Reply-To: <vsijts$13c9u$1@dont-email.me>
Content-Language: en-US
Bytes: 5089

On 4/2/2025 1:02 AM, Lawrence D'Oliveiro wrote:
> On Wed, 02 Apr 2025 16:59:59 +1100, Alexis wrote:
> 
>> Thought people here might be interested in this image on Jens Gustedt's
>> blog, which translates section 6.2.5, "Types", of the C23 standard into
>> a graph of inclusions:
>>
>>    https://gustedt.wordpress.com/2025/03/29/a-diagram-of-c23-basic-types/
> 
> Wow, we have bit-precise integers now?
> 
> PL/I, come back, all is forgiven!

FWIW:
I added them into my compiler, and (because it overlapped with something 
else I was working on) I added some Verilog style features as well (as 
an extension).

Also added "_UBitInt(n)" as "_UnsignedBitInt(n)" and "unsigned 
_BitInt(n)" were too verbose for my liking.


So, extended features:
   _UBitInt(5)   cr, cg, cb;
   _UBitInt(16)  clr;
   clr = (_UBitInt(16)) { 0b0u1, cr, cg, cb };
Composes an RGB555 value.

   cg = clr[9:5]; //extract bits
   clr[9:5] = cg;  //assign bits
   clr[15:10] = clr[9:5];  //copy bits from one place to another.

And:
   (_UBitInt(16)) { 0b0u1, cr, cg, cb } = clr;

Decomposing it into components, any fixed-width constants being treated 
as placeholders.


Note that within hex and binary literals, in some contexts 'z' is 
allowed to represent "high impedance" bits. These may be used in some 
niche cases, but (if assigned to a runtime value) will decay into a 
normal binary value (with any 'z' bits becoming 0).

Eg:
   __switchz(clr)
   {
     case 0b01zzzz1zzzz1zzzzu16: ...  //light
     case 0b00zzzz0zzzz0zzzzu16: ...  //dim
     case 0b1zzzzzzzzzzzzzzzu16: ...  //transparent
   }

....


Though, some of this was partly because I had started trying to add 
Verilog support (intention being to use my compiler in a way vaguely 
similar to Verilator, but with hopefully "better" than the pretty much 
non-existent debugger support in Verilator), and in this case, exposing 
some of it C side makes it easier to test features.

Though, possibly, something like:
  __vlmodule FooDev(
     _UBitInt(1) clock,
     _UBitInt(1) reset,
     _OutBitInt(1) out)
{
   _UBitInt(8) cnt;
   __vlassign out = cnt[7];
   __vlalways(__vlposedge clock)
   {
     cnt = cnt + 1;
   }
}

Would be going a bit too far...




I don't expect people would actually really use any of this, though 
(ironically) with my ISA some of this does generate more efficient code 
than the more traditional use of shifts and masks.


Though, it is still not enough to compete with more specialized helper 
instructions for things like working with RGB555 values (which are 
fairly extensively used in my case).

Well, or more specifically, I commonly use a non-standard RGB555 variant:
   0rrrrrgggggbbbbb  //standard opaque colors
   1rrrraggggabbbba  //translucent or transparent (3-bit alpha)
     a = 111 = 224
     ...
     a = 001 = 32
     a = 000 = 0

So, in effect, there are 9 possible alpha levels, with use of alpha 
coming at the cost of color fidelity (but, on average, color fidelity is 
still better than RGBA4444; as fully-opaque values are the most common).

To some extent I also use indexed color, but mostly for cases where 
RGB555 is too much cost.

Had mostly ended up using a scheme like:
   srgbyyyy
     s=saturation (0=high, 1=low)
     r/g/b: red/green/blue
     yyyy: luma
   With, as special cases (srgb):
     0000=grays, 0111=orange, 1000=olive, 1111=azure
And, the colors near black are used for the standard 16 color palette 
and some ranges of off-white colors (yyyy=0..2). Within the RGBI colors, 
0111 was used as the transparent color (0000 and 1000 are absent, 1111 
represents a full-intensity white that is slightly lighter than the top 
of the grays axis, which is formally #F0F0F0 rather than #FFFFFF)

Mostly because generally this gives better image quality than the more 
standard 216 and 252 color palettes (which tend to just look kinda 
terrible), and, ironically, is also generally more friendly to hardware 
decoding.

....